ETH Price: $3,344.02 (-0.68%)
Gas: 4 Gwei

Token

KuddlyKoalasV2 (KKL)
 

Overview

Max Total Supply

1,829 KKL

Holders

568

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
mutinyy.eth
Balance
2 KKL
0xe7561260c964f12227b25fe98ff2c6d48f6336ee
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
KuddlyKoalasV2

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 15 of 19: KuddlyKoalasV2.sol
// SPDX-License-Identifier: MIT
 
// File: @openzeppelin/contracts/utils/Context.sol

pragma solidity ^0.8.0;

import "ERC721.sol";
import "ERC721Enumerable.sol";
import "ERC721Burnable.sol";
import "Ownable.sol";
import "SafeMath.sol";
import "Counters.sol";
import "ERC721Pausable.sol";
import "IKuddlyKoalas.sol";

contract KuddlyKoalasV2 is ERC721Enumerable, Ownable, ERC721Burnable, ERC721Pausable {
    using SafeMath for uint256;
    using Counters for Counters.Counter;

    //Original Kuddly Koalas Contract
    address public kuddlyOriginalAddress = 0xF179cb4d1369C9972b3fa7F6bBcf01d3aAf9a051;
    kuddlyOriginalInterface kuddlyOriginalContract = kuddlyOriginalInterface(kuddlyOriginalAddress);

    Counters.Counter private _tokenIdTracker;


    uint256 public MAX_ELEMENTS = 8888;
    uint256 public constant MAX_BY_MINT = 20;
    uint256 public GAS_BACK_AMOUNT = 6435 * 10**12;
    uint256 public GAS_BACK_QUANTITY = 1000;
    address public constant safeAddress = 0xC8E868E9c922d50bC48DB05b77274E0Fc1eCd440;
    string public baseTokenURI;
    bool public canChangeSupply = true;

    event CreateKoalas(uint256 indexed id);

    constructor(string memory baseURI) ERC721("KuddlyKoalasV2", "KKL") {
        setBaseURI(baseURI); // use original sketch as baseURI egg
        pause(true); // contract starts paused
    }

    modifier saleIsOpen {
        require(_totalSupply() <= MAX_ELEMENTS, "Sale end");
        if (_msgSender() != owner()) {
            require(!paused(), "Pausable: paused");
        }
        _;
    }

    function _totalSupply() internal view returns (uint) {
        return _tokenIdTracker.current();
    }

    function totalMint() public view returns (uint256) {
        return _totalSupply();
    }

    function mintMultipleAsKoalaOwner(address _to, uint256[] memory _multipleTokenIds) public saleIsOpen {
        uint quantity = _multipleTokenIds.length;
        uint gasBack = 0;
        require(quantity <= MAX_BY_MINT, "Trying to mint more than 20");
        for (uint i = 0; i < quantity; i++) {
          require(!_exists(_multipleTokenIds[i]), "TokenId already exists");
          require(msg.sender == kuddlyOriginalContract.ownerOf(_multipleTokenIds[i]), "Not the owner of this Koala");
          _mintTokenId(_to, _multipleTokenIds[i]);
          if(_totalSupply() < GAS_BACK_QUANTITY) {
            gasBack++;
          }
        }
        if(gasBack > 0) {
          _gasBack(msg.sender, gasBack);
        }
    }

    function backupMint(address _to, uint256[] memory _multipleTokenIds) public onlyOwner {
        uint quantity = _multipleTokenIds.length;
        require(quantity <= MAX_BY_MINT, "Trying to mint too many");
        for (uint i = 0; i < quantity; i++) {
          require(!_exists(_multipleTokenIds[i]), "This token has already been minted");
          _mintTokenId(_to, _multipleTokenIds[i]);
        }
    }

    function saleIsActive() public view returns (bool) {
        if(paused()) {
            return false;
        } else {
            return true;
        }
    }

    function _mintTokenId(address _to, uint _tokenId) private {
        _tokenIdTracker.increment();
        _safeMint(_to, _tokenId);
        emit CreateKoalas(_tokenId);
    }

    // This function allows the total supply to be reduced
    // There are NO other methods to increase the cap, the final cap is 8888 - this can never be altered

    function enableHardLimit(uint256 _limit) public onlyOwner {
        require(canChangeSupply, "Cannot change supply");
        require(_limit <= 8888, "Cannot raise limit over 8888");
        MAX_ELEMENTS = _limit;
    }

    function relinquishMintSupplyControl() public onlyOwner {
        // Sets canChangeSupply to false (off)
        // This is a one-way switch
        // There is no other possible method to re-enable control of max Mint Supply
        require(canChangeSupply, "Cannot change supply");
        canChangeSupply = false;
    }

    function price() public pure returns (uint256) {
        return 0;
    }

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

    function getBaseURI() public view returns (string memory) {
        return baseTokenURI;
    }

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

    function _gasBack(address _to, uint256 _quantity) private {
        if(address(this).balance > GAS_BACK_AMOUNT) {
          payable(_to).transfer(GAS_BACK_AMOUNT * _quantity);
        }
    }

    function setGasBack(uint256 _amount) public onlyOwner {
        GAS_BACK_AMOUNT = _amount;
    }

    function setGasBackQuantity(uint256 _quantity) public onlyOwner {
        GAS_BACK_QUANTITY = _quantity;
    }

    function walletOfOwner(address _owner) external view returns (uint256[] memory) {
        uint256 tokenCount = balanceOf(_owner);
        uint256[] memory tokensId = new uint256[](tokenCount);
        for (uint256 i = 0; i < tokenCount; i++) {
            tokensId[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokensId;
    }

    function pause(bool val) public onlyOwner {
        if (val == true) {
            _pause();
            return;
        }
        _unpause();
    }

    function withdrawAll() public payable onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > 0, "There is no Ether in this contract");
        _withdraw(safeAddress, address(this).balance);
    }

    function withdrawSome(uint _amount) public payable onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > _amount, "There is no Ether in this contract");
        _withdraw(safeAddress, _amount);
    }

    function _withdraw(address _address, uint256 _amount) private {
        payable(_address).transfer(_amount);
    }

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

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

    fallback() external payable {
    }
}

File 1 of 19: 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);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

File 2 of 19: 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 3 of 19: 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 4 of 19: 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 5 of 19: 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(to).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 6 of 19: 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 7 of 19: 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 8 of 19: ERC721Pausable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "ERC721.sol";
import "Pausable.sol";
import "Ownable.sol";

/**
 * @dev ERC721 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 */
abstract contract ERC721Pausable is ERC721, Ownable, Pausable {
    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);
        if (_msgSender() != owner()) {
            require(!paused(), "ERC721Pausable: token transfer while paused");
        }
    }
}

File 9 of 19: 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 19: 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 19: 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 19: 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 19: 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 19: IKuddlyKoalas.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

interface kuddlyOriginalInterface {
    function ownerOf(uint256 tokenId) external view returns (address owner);
}

File 16 of 19: 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 17 of 19: Pausable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 18 of 19: SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

File 19 of 19: 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":[{"internalType":"string","name":"baseURI","type":"string"}],"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":"uint256","name":"id","type":"uint256"}],"name":"CreateKoalas","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"GAS_BACK_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GAS_BACK_QUANTITY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BY_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_ELEMENTS","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":"_to","type":"address"},{"internalType":"uint256[]","name":"_multipleTokenIds","type":"uint256[]"}],"name":"backupMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"canChangeSupply","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"enableHardLimit","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":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"kuddlyOriginalAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_multipleTokenIds","type":"uint256[]"}],"name":"mintMultipleAsKoalaOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"receiveEther","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"relinquishMintSupplyControl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"safeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setGasBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"setGasBackQuantity","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":"totalMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawSome","outputs":[],"stateMutability":"payable","type":"function"}]

608060405273f179cb4d1369c9972b3fa7f6bbcf01d3aaf9a051600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506122b8600e556616dc9931213000600f556103e86010556001601260006101000a81548160ff021916908315150217905550348015620000fb57600080fd5b5060405162005f5b38038062005f5b833981810160405281019062000121919062000738565b6040518060400160405280600e81526020017f4b7564646c794b6f616c617356320000000000000000000000000000000000008152506040518060400160405280600381526020017f4b4b4c00000000000000000000000000000000000000000000000000000000008152508160009080519060200190620001a592919062000616565b508060019080519060200190620001be92919062000616565b505050620001e1620001d56200022660201b60201c565b6200022e60201b60201c565b6000600a60146101000a81548160ff0219169083151502179055506200020d81620002f460201b60201c565b6200021f60016200039f60201b60201c565b5062000a4d565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003046200022660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200032a6200046660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000383576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200037a90620008b5565b60405180910390fd5b80601190805190602001906200039b92919062000616565b5050565b620003af6200022660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003d56200046660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200042e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200042590620008b5565b60405180910390fd5b60011515811515141562000452576200044c6200049060201b60201c565b62000463565b620004626200054860201b60201c565b5b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620004a0620005ff60201b60201c565b15620004e3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004da9062000893565b60405180910390fd5b6001600a60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586200052f6200022660201b60201c565b6040516200053e919062000854565b60405180910390a1565b62000558620005ff60201b60201c565b6200059a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005919062000871565b60405180910390fd5b6000600a60146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa620005e66200022660201b60201c565b604051620005f5919062000854565b60405180910390a1565b6000600a60149054906101000a900460ff16905090565b8280546200062490620009b9565b90600052602060002090601f01602090048101928262000648576000855562000694565b82601f106200066357805160ff191683800117855562000694565b8280016001018555821562000694579182015b828111156200069357825182559160200191906001019062000676565b5b509050620006a39190620006a7565b5090565b5b80821115620006c2576000816000905550600101620006a8565b5090565b6000620006dd620006d7846200090b565b620008d7565b905082815260208101848484011115620006f657600080fd5b6200070384828562000983565b509392505050565b600082601f8301126200071d57600080fd5b81516200072f848260208601620006c6565b91505092915050565b6000602082840312156200074b57600080fd5b600082015167ffffffffffffffff8111156200076657600080fd5b62000774848285016200070b565b91505092915050565b62000788816200094f565b82525050565b60006200079d6014836200093e565b91507f5061757361626c653a206e6f74207061757365640000000000000000000000006000830152602082019050919050565b6000620007df6010836200093e565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b6000620008216020836200093e565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006020820190506200086b60008301846200077d565b92915050565b600060208201905081810360008301526200088c816200078e565b9050919050565b60006020820190508181036000830152620008ae81620007d0565b9050919050565b60006020820190508181036000830152620008d08162000812565b9050919050565b6000604051905081810181811067ffffffffffffffff8211171562000901576200090062000a1e565b5b8060405250919050565b600067ffffffffffffffff82111562000929576200092862000a1e565b5b601f19601f8301169050602081019050919050565b600082825260208201905092915050565b60006200095c8262000963565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b83811015620009a357808201518184015260208101905062000986565b83811115620009b3576000848401525b50505050565b60006002820490506001821680620009d257607f821691505b60208210811415620009e957620009e8620009ef565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6154fe8062000a5d6000396000f3fe6080604052600436106102765760003560e01c8063714a40d91161014f578063a22cb465116100c1578063c87b56dd1161007a578063c87b56dd14610905578063ce03982a14610942578063d547cfb714610959578063e985e9c514610984578063eb8d2444146109c1578063f2fde38b146109ec57610277565b8063a22cb46514610839578063a3912ec814610862578063a7f33b751461086c578063ae9b051c14610897578063b88d4fde146108b3578063ba6c0cf7146108dc57610277565b8063853828b611610113578063853828b6146107585780638ad5de28146107625780638da5cb5b1461078d57806395d89b41146107b8578063a035b1fe146107e3578063a0c33a541461080e57610277565b8063714a40d914610699578063714c5398146106c2578063715018a6146106ed578063720a8f251461070457806383cf83f31461072d57610277565b8063438b6300116101e857806359a7715a116101ac57806359a7715a146105755780635b0754ed146105a05780635c975abb146105c95780636352211e146105f4578063676f8d271461063157806370a082311461065c57610277565b8063438b63001461047e578063466ca8c5146104bb5780634f6ccce7146104e45780635578110c1461052157806355f804b31461054c57610277565b806318160ddd1161023a57806318160ddd1461037057806323b872dd1461039b5780632f745c59146103c45780633502a7161461040157806342842e0e1461042c57806342966c681461045557610277565b806301ffc9a71461027957806302329a29146102b657806306fdde03146102df578063081812fc1461030a578063095ea7b31461034757610277565b5b005b34801561028557600080fd5b506102a0600480360381019061029b9190613e8d565b610a15565b6040516102ad9190614bb7565b60405180910390f35b3480156102c257600080fd5b506102dd60048036038101906102d89190613e64565b610a27565b005b3480156102eb57600080fd5b506102f4610ac9565b6040516103019190614bd2565b60405180910390f35b34801561031657600080fd5b50610331600480360381019061032c9190613f20565b610b5b565b60405161033e9190614b2e565b60405180910390f35b34801561035357600080fd5b5061036e60048036038101906103699190613e28565b610be0565b005b34801561037c57600080fd5b50610385610cf8565b6040516103929190614fd4565b60405180910390f35b3480156103a757600080fd5b506103c260048036038101906103bd9190613cce565b610d05565b005b3480156103d057600080fd5b506103eb60048036038101906103e69190613e28565b610d65565b6040516103f89190614fd4565b60405180910390f35b34801561040d57600080fd5b50610416610e0a565b6040516104239190614fd4565b60405180910390f35b34801561043857600080fd5b50610453600480360381019061044e9190613cce565b610e10565b005b34801561046157600080fd5b5061047c60048036038101906104779190613f20565b610e30565b005b34801561048a57600080fd5b506104a560048036038101906104a09190613c40565b610e8c565b6040516104b29190614b95565b60405180910390f35b3480156104c757600080fd5b506104e260048036038101906104dd9190613d98565b610f86565b005b3480156104f057600080fd5b5061050b60048036038101906105069190613f20565b61132c565b6040516105189190614fd4565b60405180910390f35b34801561052d57600080fd5b506105366113c3565b6040516105439190614b2e565b60405180910390f35b34801561055857600080fd5b50610573600480360381019061056e9190613edf565b6113db565b005b34801561058157600080fd5b5061058a611471565b6040516105979190614fd4565b60405180910390f35b3480156105ac57600080fd5b506105c760048036038101906105c29190613f20565b611480565b005b3480156105d557600080fd5b506105de611506565b6040516105eb9190614bb7565b60405180910390f35b34801561060057600080fd5b5061061b60048036038101906106169190613f20565b61151d565b6040516106289190614b2e565b60405180910390f35b34801561063d57600080fd5b506106466115cf565b6040516106539190614fd4565b60405180910390f35b34801561066857600080fd5b50610683600480360381019061067e9190613c40565b6115d5565b6040516106909190614fd4565b60405180910390f35b3480156106a557600080fd5b506106c060048036038101906106bb9190613d98565b61168d565b005b3480156106ce57600080fd5b506106d761184a565b6040516106e49190614bd2565b60405180910390f35b3480156106f957600080fd5b506107026118dc565b005b34801561071057600080fd5b5061072b60048036038101906107269190613f20565b611964565b005b34801561073957600080fd5b50610742611a7e565b60405161074f9190614bb7565b60405180910390f35b610760611a91565b005b34801561076e57600080fd5b50610777611b76565b6040516107849190614fd4565b60405180910390f35b34801561079957600080fd5b506107a2611b7b565b6040516107af9190614b2e565b60405180910390f35b3480156107c457600080fd5b506107cd611ba5565b6040516107da9190614bd2565b60405180910390f35b3480156107ef57600080fd5b506107f8611c37565b6040516108059190614fd4565b60405180910390f35b34801561081a57600080fd5b50610823611c3c565b6040516108309190614fd4565b60405180910390f35b34801561084557600080fd5b50610860600480360381019061085b9190613dec565b611c42565b005b61086a611dc3565b005b34801561087857600080fd5b50610881611dc5565b60405161088e9190614b2e565b60405180910390f35b6108b160048036038101906108ac9190613f20565b611deb565b005b3480156108bf57600080fd5b506108da60048036038101906108d59190613d1d565b611ed0565b005b3480156108e857600080fd5b5061090360048036038101906108fe9190613f20565b611f32565b005b34801561091157600080fd5b5061092c60048036038101906109279190613f20565b611fb8565b6040516109399190614bd2565b60405180910390f35b34801561094e57600080fd5b5061095761205f565b005b34801561096557600080fd5b5061096e612147565b60405161097b9190614bd2565b60405180910390f35b34801561099057600080fd5b506109ab60048036038101906109a69190613c92565b6121d5565b6040516109b89190614bb7565b60405180910390f35b3480156109cd57600080fd5b506109d6612269565b6040516109e39190614bb7565b60405180910390f35b3480156109f857600080fd5b50610a136004803603810190610a0e9190613c40565b612289565b005b6000610a2082612381565b9050919050565b610a2f6123fb565b73ffffffffffffffffffffffffffffffffffffffff16610a4d611b7b565b73ffffffffffffffffffffffffffffffffffffffff1614610aa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9a90614eb4565b60405180910390fd5b600115158115151415610abd57610ab8612403565b610ac6565b610ac56124a6565b5b50565b606060008054610ad8906152f3565b80601f0160208091040260200160405190810160405280929190818152602001828054610b04906152f3565b8015610b515780601f10610b2657610100808354040283529160200191610b51565b820191906000526020600020905b815481529060010190602001808311610b3457829003601f168201915b5050505050905090565b6000610b6682612548565b610ba5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9c90614e94565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610beb8261151d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5390614f34565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c7b6123fb565b73ffffffffffffffffffffffffffffffffffffffff161480610caa5750610ca981610ca46123fb565b6121d5565b5b610ce9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce090614dd4565b60405180910390fd5b610cf383836125b4565b505050565b6000600880549050905090565b610d16610d106123fb565b8261266d565b610d55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4c90614f54565b60405180910390fd5b610d6083838361274b565b505050565b6000610d70836115d5565b8210610db1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da890614c34565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600e5481565b610e2b83838360405180602001604052806000815250611ed0565b505050565b610e41610e3b6123fb565b8261266d565b610e80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7790614f94565b60405180910390fd5b610e89816129a7565b50565b60606000610e99836115d5565b905060008167ffffffffffffffff811115610edd577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610f0b5781602001602082028036833780820191505090505b50905060005b82811015610f7b57610f238582610d65565b828281518110610f5c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080610f7390615325565b915050610f11565b508092505050919050565b600e54610f91612ab8565b1115610fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc990614e74565b60405180910390fd5b610fda611b7b565b73ffffffffffffffffffffffffffffffffffffffff16610ff86123fb565b73ffffffffffffffffffffffffffffffffffffffff161461105c5761101b611506565b1561105b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105290614d94565b60405180910390fd5b5b600081519050600060148211156110a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109f90614df4565b60405180910390fd5b60005b82811015611311576110fc8482815181106110ef577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151612548565b1561113c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113390614d54565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8583815181106111b3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016111d79190614fd4565b60206040518083038186803b1580156111ef57600080fd5b505afa158015611203573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112279190613c69565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128b90614ed4565b60405180910390fd5b6112de858583815181106112d1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151612ac9565b6010546112e9612ab8565b10156112fe5781806112fa90615325565b9250505b808061130990615325565b9150506110ab565b506000811115611326576113253382612b0e565b5b50505050565b6000611336610cf8565b8210611377576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136e90614f74565b60405180910390fd5b600882815481106113b1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b73c8e868e9c922d50bc48db05b77274e0fc1ecd44081565b6113e36123fb565b73ffffffffffffffffffffffffffffffffffffffff16611401611b7b565b73ffffffffffffffffffffffffffffffffffffffff1614611457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144e90614eb4565b60405180910390fd5b806011908051906020019061146d9291906139b9565b5050565b600061147b612ab8565b905090565b6114886123fb565b73ffffffffffffffffffffffffffffffffffffffff166114a6611b7b565b73ffffffffffffffffffffffffffffffffffffffff16146114fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f390614eb4565b60405180910390fd5b80600f8190555050565b6000600a60149054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bd90614e34565b60405180910390fd5b80915050919050565b60105481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611646576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163d90614e14565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116956123fb565b73ffffffffffffffffffffffffffffffffffffffff166116b3611b7b565b73ffffffffffffffffffffffffffffffffffffffff1614611709576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170090614eb4565b60405180910390fd5b6000815190506014811115611753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174a90614fb4565b60405180910390fd5b60005b81811015611844576117a783828151811061179a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151612548565b156117e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117de90614db4565b60405180910390fd5b61183184848381518110611824577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151612ac9565b808061183c90615325565b915050611756565b50505050565b606060118054611859906152f3565b80601f0160208091040260200160405190810160405280929190818152602001828054611885906152f3565b80156118d25780601f106118a7576101008083540402835291602001916118d2565b820191906000526020600020905b8154815290600101906020018083116118b557829003601f168201915b5050505050905090565b6118e46123fb565b73ffffffffffffffffffffffffffffffffffffffff16611902611b7b565b73ffffffffffffffffffffffffffffffffffffffff1614611958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194f90614eb4565b60405180910390fd5b6119626000612b71565b565b61196c6123fb565b73ffffffffffffffffffffffffffffffffffffffff1661198a611b7b565b73ffffffffffffffffffffffffffffffffffffffff16146119e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d790614eb4565b60405180910390fd5b601260009054906101000a900460ff16611a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2690614c74565b60405180910390fd5b6122b8811115611a74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6b90614cd4565b60405180910390fd5b80600e8190555050565b601260009054906101000a900460ff1681565b611a996123fb565b73ffffffffffffffffffffffffffffffffffffffff16611ab7611b7b565b73ffffffffffffffffffffffffffffffffffffffff1614611b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0490614eb4565b60405180910390fd5b600047905060008111611b55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4c90614c94565b60405180910390fd5b611b7373c8e868e9c922d50bc48db05b77274e0fc1ecd44047612c37565b50565b601481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611bb4906152f3565b80601f0160208091040260200160405190810160405280929190818152602001828054611be0906152f3565b8015611c2d5780601f10611c0257610100808354040283529160200191611c2d565b820191906000526020600020905b815481529060010190602001808311611c1057829003601f168201915b5050505050905090565b600090565b600f5481565b611c4a6123fb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611caf90614d34565b60405180910390fd5b8060056000611cc56123fb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d726123fb565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611db79190614bb7565b60405180910390a35050565b565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611df36123fb565b73ffffffffffffffffffffffffffffffffffffffff16611e11611b7b565b73ffffffffffffffffffffffffffffffffffffffff1614611e67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5e90614eb4565b60405180910390fd5b6000479050818111611eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea590614c94565b60405180910390fd5b611ecc73c8e868e9c922d50bc48db05b77274e0fc1ecd44083612c37565b5050565b611ee1611edb6123fb565b8361266d565b611f20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1790614f54565b60405180910390fd5b611f2c84848484612c82565b50505050565b611f3a6123fb565b73ffffffffffffffffffffffffffffffffffffffff16611f58611b7b565b73ffffffffffffffffffffffffffffffffffffffff1614611fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa590614eb4565b60405180910390fd5b8060108190555050565b6060611fc382612548565b612002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff990614f14565b60405180910390fd5b600061200c612cde565b9050600081511161202c5760405180602001604052806000815250612057565b8061203684612d70565b604051602001612047929190614b0a565b6040516020818303038152906040525b915050919050565b6120676123fb565b73ffffffffffffffffffffffffffffffffffffffff16612085611b7b565b73ffffffffffffffffffffffffffffffffffffffff16146120db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d290614eb4565b60405180910390fd5b601260009054906101000a900460ff1661212a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212190614c74565b60405180910390fd5b6000601260006101000a81548160ff021916908315150217905550565b60118054612154906152f3565b80601f0160208091040260200160405190810160405280929190818152602001828054612180906152f3565b80156121cd5780601f106121a2576101008083540402835291602001916121cd565b820191906000526020600020905b8154815290600101906020018083116121b057829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000612273611506565b156122815760009050612286565b600190505b90565b6122916123fb565b73ffffffffffffffffffffffffffffffffffffffff166122af611b7b565b73ffffffffffffffffffffffffffffffffffffffff1614612305576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fc90614eb4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612375576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236c90614cb4565b60405180910390fd5b61237e81612b71565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806123f457506123f382612f1d565b5b9050919050565b600033905090565b61240b611506565b1561244b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244290614d94565b60405180910390fd5b6001600a60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861248f6123fb565b60405161249c9190614b2e565b60405180910390a1565b6124ae611506565b6124ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e490614c14565b60405180910390fd5b6000600a60146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6125316123fb565b60405161253e9190614b2e565b60405180910390a1565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166126278361151d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061267882612548565b6126b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ae90614d74565b60405180910390fd5b60006126c28361151d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061273157508373ffffffffffffffffffffffffffffffffffffffff1661271984610b5b565b73ffffffffffffffffffffffffffffffffffffffff16145b80612742575061274181856121d5565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661276b8261151d565b73ffffffffffffffffffffffffffffffffffffffff16146127c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b890614ef4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612831576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282890614d14565b60405180910390fd5b61283c838383612fff565b6128476000826125b4565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128979190615209565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128ee9190615128565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006129b28261151d565b90506129c081600084612fff565b6129cb6000836125b4565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a1b9190615209565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000612ac4600d61300f565b905090565b612ad3600d61301d565b612add8282613033565b807f86f740003797f6ed61a3eadecd8efb70132beda461c28b0bc74e5fdea2567a0560405160405180910390a25050565b600f54471115612b6d578173ffffffffffffffffffffffffffffffffffffffff166108fc82600f54612b4091906151af565b9081150290604051600060405180830381858888f19350505050158015612b6b573d6000803e3d6000fd5b505b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612c7d573d6000803e3d6000fd5b505050565b612c8d84848461274b565b612c9984848484613051565b612cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ccf90614c54565b60405180910390fd5b50505050565b606060118054612ced906152f3565b80601f0160208091040260200160405190810160405280929190818152602001828054612d19906152f3565b8015612d665780601f10612d3b57610100808354040283529160200191612d66565b820191906000526020600020905b815481529060010190602001808311612d4957829003601f168201915b5050505050905090565b60606000821415612db8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f18565b600082905060005b60008214612dea578080612dd390615325565b915050600a82612de3919061517e565b9150612dc0565b60008167ffffffffffffffff811115612e2c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612e5e5781602001600182028036833780820191505090505b5090505b60008514612f1157600182612e779190615209565b9150600a85612e86919061536e565b6030612e929190615128565b60f81b818381518110612ece577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f0a919061517e565b9450612e62565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612fe857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612ff85750612ff7826131e8565b5b9050919050565b61300a838383613252565b505050565b600081600001549050919050565b6001816000016000828254019250508190555050565b61304d8282604051806020016040528060008152506132ec565b5050565b60006130728473ffffffffffffffffffffffffffffffffffffffff16613347565b156131db578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261309b6123fb565b8786866040518563ffffffff1660e01b81526004016130bd9493929190614b49565b602060405180830381600087803b1580156130d757600080fd5b505af192505050801561310857506040513d601f19601f820116820180604052508101906131059190613eb6565b60015b61318b573d8060008114613138576040519150601f19603f3d011682016040523d82523d6000602084013e61313d565b606091505b50600081511415613183576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161317a90614c54565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506131e0565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61325d83838361335a565b613265611b7b565b73ffffffffffffffffffffffffffffffffffffffff166132836123fb565b73ffffffffffffffffffffffffffffffffffffffff16146132e7576132a6611506565b156132e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132dd90614bf4565b60405180910390fd5b5b505050565b6132f6838361346e565b6133036000848484613051565b613342576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333990614c54565b60405180910390fd5b505050565b600080823b905060008111915050919050565b61336583838361363c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156133a8576133a381613641565b6133e7565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146133e6576133e5838261368a565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561342a57613425816137f7565b613469565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461346857613467828261393a565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134d590614e54565b60405180910390fd5b6134e781612548565b15613527576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351e90614cf4565b60405180910390fd5b61353360008383612fff565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546135839190615128565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613697846115d5565b6136a19190615209565b9050600060076000848152602001908152602001600020549050818114613786576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061380b9190615209565b9050600060096000848152602001908152602001600020549050600060088381548110613861577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106138a9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061391e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613945836115d5565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546139c5906152f3565b90600052602060002090601f0160209004810192826139e75760008555613a2e565b82601f10613a0057805160ff1916838001178555613a2e565b82800160010185558215613a2e579182015b82811115613a2d578251825591602001919060010190613a12565b5b509050613a3b9190613a3f565b5090565b5b80821115613a58576000816000905550600101613a40565b5090565b6000613a6f613a6a84615020565b614fef565b90508083825260208201905082856020860282011115613a8e57600080fd5b60005b85811015613abe5781613aa48882613c2b565b845260208401935060208301925050600181019050613a91565b5050509392505050565b6000613adb613ad68461504c565b614fef565b905082815260208101848484011115613af357600080fd5b613afe8482856152b1565b509392505050565b6000613b19613b148461507c565b614fef565b905082815260208101848484011115613b3157600080fd5b613b3c8482856152b1565b509392505050565b600081359050613b538161546c565b92915050565b600081519050613b688161546c565b92915050565b600082601f830112613b7f57600080fd5b8135613b8f848260208601613a5c565b91505092915050565b600081359050613ba781615483565b92915050565b600081359050613bbc8161549a565b92915050565b600081519050613bd18161549a565b92915050565b600082601f830112613be857600080fd5b8135613bf8848260208601613ac8565b91505092915050565b600082601f830112613c1257600080fd5b8135613c22848260208601613b06565b91505092915050565b600081359050613c3a816154b1565b92915050565b600060208284031215613c5257600080fd5b6000613c6084828501613b44565b91505092915050565b600060208284031215613c7b57600080fd5b6000613c8984828501613b59565b91505092915050565b60008060408385031215613ca557600080fd5b6000613cb385828601613b44565b9250506020613cc485828601613b44565b9150509250929050565b600080600060608486031215613ce357600080fd5b6000613cf186828701613b44565b9350506020613d0286828701613b44565b9250506040613d1386828701613c2b565b9150509250925092565b60008060008060808587031215613d3357600080fd5b6000613d4187828801613b44565b9450506020613d5287828801613b44565b9350506040613d6387828801613c2b565b925050606085013567ffffffffffffffff811115613d8057600080fd5b613d8c87828801613bd7565b91505092959194509250565b60008060408385031215613dab57600080fd5b6000613db985828601613b44565b925050602083013567ffffffffffffffff811115613dd657600080fd5b613de285828601613b6e565b9150509250929050565b60008060408385031215613dff57600080fd5b6000613e0d85828601613b44565b9250506020613e1e85828601613b98565b9150509250929050565b60008060408385031215613e3b57600080fd5b6000613e4985828601613b44565b9250506020613e5a85828601613c2b565b9150509250929050565b600060208284031215613e7657600080fd5b6000613e8484828501613b98565b91505092915050565b600060208284031215613e9f57600080fd5b6000613ead84828501613bad565b91505092915050565b600060208284031215613ec857600080fd5b6000613ed684828501613bc2565b91505092915050565b600060208284031215613ef157600080fd5b600082013567ffffffffffffffff811115613f0b57600080fd5b613f1784828501613c01565b91505092915050565b600060208284031215613f3257600080fd5b6000613f4084828501613c2b565b91505092915050565b6000613f558383614aec565b60208301905092915050565b613f6a8161523d565b82525050565b6000613f7b826150bc565b613f8581856150ea565b9350613f90836150ac565b8060005b83811015613fc1578151613fa88882613f49565b9750613fb3836150dd565b925050600181019050613f94565b5085935050505092915050565b613fd78161524f565b82525050565b6000613fe8826150c7565b613ff281856150fb565b93506140028185602086016152c0565b61400b8161545b565b840191505092915050565b6000614021826150d2565b61402b818561510c565b935061403b8185602086016152c0565b6140448161545b565b840191505092915050565b600061405a826150d2565b614064818561511d565b93506140748185602086016152c0565b80840191505092915050565b600061408d602b8361510c565b91507f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008301527f68696c65207061757365640000000000000000000000000000000000000000006020830152604082019050919050565b60006140f360148361510c565b91507f5061757361626c653a206e6f74207061757365640000000000000000000000006000830152602082019050919050565b6000614133602b8361510c565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061419960328361510c565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006141ff60148361510c565b91507f43616e6e6f74206368616e676520737570706c790000000000000000000000006000830152602082019050919050565b600061423f60228361510c565b91507f5468657265206973206e6f20457468657220696e207468697320636f6e74726160008301527f63740000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142a560268361510c565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061430b601c8361510c565b91507f43616e6e6f74207261697365206c696d6974206f7665722038383838000000006000830152602082019050919050565b600061434b601c8361510c565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b600061438b60248361510c565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006143f160198361510c565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061443160168361510c565b91507f546f6b656e496420616c726561647920657869737473000000000000000000006000830152602082019050919050565b6000614471602c8361510c565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006144d760108361510c565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b600061451760228361510c565b91507f5468697320746f6b656e2068617320616c7265616479206265656e206d696e7460008301527f65640000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061457d60388361510c565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006145e3601b8361510c565b91507f547279696e6720746f206d696e74206d6f7265207468616e20323000000000006000830152602082019050919050565b6000614623602a8361510c565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061468960298361510c565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006146ef60208361510c565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061472f60088361510c565b91507f53616c6520656e640000000000000000000000000000000000000000000000006000830152602082019050919050565b600061476f602c8361510c565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006147d560208361510c565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614815601b8361510c565b91507f4e6f7420746865206f776e6572206f662074686973204b6f616c6100000000006000830152602082019050919050565b600061485560298361510c565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006148bb602f8361510c565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061492160218361510c565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061498760318361510c565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006149ed602c8361510c565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614a5360308361510c565b91507f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f766564000000000000000000000000000000006020830152604082019050919050565b6000614ab960178361510c565b91507f547279696e6720746f206d696e7420746f6f206d616e790000000000000000006000830152602082019050919050565b614af5816152a7565b82525050565b614b04816152a7565b82525050565b6000614b16828561404f565b9150614b22828461404f565b91508190509392505050565b6000602082019050614b436000830184613f61565b92915050565b6000608082019050614b5e6000830187613f61565b614b6b6020830186613f61565b614b786040830185614afb565b8181036060830152614b8a8184613fdd565b905095945050505050565b60006020820190508181036000830152614baf8184613f70565b905092915050565b6000602082019050614bcc6000830184613fce565b92915050565b60006020820190508181036000830152614bec8184614016565b905092915050565b60006020820190508181036000830152614c0d81614080565b9050919050565b60006020820190508181036000830152614c2d816140e6565b9050919050565b60006020820190508181036000830152614c4d81614126565b9050919050565b60006020820190508181036000830152614c6d8161418c565b9050919050565b60006020820190508181036000830152614c8d816141f2565b9050919050565b60006020820190508181036000830152614cad81614232565b9050919050565b60006020820190508181036000830152614ccd81614298565b9050919050565b60006020820190508181036000830152614ced816142fe565b9050919050565b60006020820190508181036000830152614d0d8161433e565b9050919050565b60006020820190508181036000830152614d2d8161437e565b9050919050565b60006020820190508181036000830152614d4d816143e4565b9050919050565b60006020820190508181036000830152614d6d81614424565b9050919050565b60006020820190508181036000830152614d8d81614464565b9050919050565b60006020820190508181036000830152614dad816144ca565b9050919050565b60006020820190508181036000830152614dcd8161450a565b9050919050565b60006020820190508181036000830152614ded81614570565b9050919050565b60006020820190508181036000830152614e0d816145d6565b9050919050565b60006020820190508181036000830152614e2d81614616565b9050919050565b60006020820190508181036000830152614e4d8161467c565b9050919050565b60006020820190508181036000830152614e6d816146e2565b9050919050565b60006020820190508181036000830152614e8d81614722565b9050919050565b60006020820190508181036000830152614ead81614762565b9050919050565b60006020820190508181036000830152614ecd816147c8565b9050919050565b60006020820190508181036000830152614eed81614808565b9050919050565b60006020820190508181036000830152614f0d81614848565b9050919050565b60006020820190508181036000830152614f2d816148ae565b9050919050565b60006020820190508181036000830152614f4d81614914565b9050919050565b60006020820190508181036000830152614f6d8161497a565b9050919050565b60006020820190508181036000830152614f8d816149e0565b9050919050565b60006020820190508181036000830152614fad81614a46565b9050919050565b60006020820190508181036000830152614fcd81614aac565b9050919050565b6000602082019050614fe96000830184614afb565b92915050565b6000604051905081810181811067ffffffffffffffff821117156150165761501561542c565b5b8060405250919050565b600067ffffffffffffffff82111561503b5761503a61542c565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156150675761506661542c565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156150975761509661542c565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000615133826152a7565b915061513e836152a7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156151735761517261539f565b5b828201905092915050565b6000615189826152a7565b9150615194836152a7565b9250826151a4576151a36153ce565b5b828204905092915050565b60006151ba826152a7565b91506151c5836152a7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156151fe576151fd61539f565b5b828202905092915050565b6000615214826152a7565b915061521f836152a7565b9250828210156152325761523161539f565b5b828203905092915050565b600061524882615287565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156152de5780820151818401526020810190506152c3565b838111156152ed576000848401525b50505050565b6000600282049050600182168061530b57607f821691505b6020821081141561531f5761531e6153fd565b5b50919050565b6000615330826152a7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156153635761536261539f565b5b600182019050919050565b6000615379826152a7565b9150615384836152a7565b925082615394576153936153ce565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6154758161523d565b811461548057600080fd5b50565b61548c8161524f565b811461549757600080fd5b50565b6154a38161525b565b81146154ae57600080fd5b50565b6154ba816152a7565b81146154c557600080fd5b5056fea264697066735822122004f35cf69ed11ff14cb6694be49ddacfac176a0c59f538e9c1a03969ec6ba3ac64736f6c634300080000330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001d68747470733a2f2f6b7564646c796b6f616c61732e636f6d2f6170692f000000

Deployed Bytecode

0x6080604052600436106102765760003560e01c8063714a40d91161014f578063a22cb465116100c1578063c87b56dd1161007a578063c87b56dd14610905578063ce03982a14610942578063d547cfb714610959578063e985e9c514610984578063eb8d2444146109c1578063f2fde38b146109ec57610277565b8063a22cb46514610839578063a3912ec814610862578063a7f33b751461086c578063ae9b051c14610897578063b88d4fde146108b3578063ba6c0cf7146108dc57610277565b8063853828b611610113578063853828b6146107585780638ad5de28146107625780638da5cb5b1461078d57806395d89b41146107b8578063a035b1fe146107e3578063a0c33a541461080e57610277565b8063714a40d914610699578063714c5398146106c2578063715018a6146106ed578063720a8f251461070457806383cf83f31461072d57610277565b8063438b6300116101e857806359a7715a116101ac57806359a7715a146105755780635b0754ed146105a05780635c975abb146105c95780636352211e146105f4578063676f8d271461063157806370a082311461065c57610277565b8063438b63001461047e578063466ca8c5146104bb5780634f6ccce7146104e45780635578110c1461052157806355f804b31461054c57610277565b806318160ddd1161023a57806318160ddd1461037057806323b872dd1461039b5780632f745c59146103c45780633502a7161461040157806342842e0e1461042c57806342966c681461045557610277565b806301ffc9a71461027957806302329a29146102b657806306fdde03146102df578063081812fc1461030a578063095ea7b31461034757610277565b5b005b34801561028557600080fd5b506102a0600480360381019061029b9190613e8d565b610a15565b6040516102ad9190614bb7565b60405180910390f35b3480156102c257600080fd5b506102dd60048036038101906102d89190613e64565b610a27565b005b3480156102eb57600080fd5b506102f4610ac9565b6040516103019190614bd2565b60405180910390f35b34801561031657600080fd5b50610331600480360381019061032c9190613f20565b610b5b565b60405161033e9190614b2e565b60405180910390f35b34801561035357600080fd5b5061036e60048036038101906103699190613e28565b610be0565b005b34801561037c57600080fd5b50610385610cf8565b6040516103929190614fd4565b60405180910390f35b3480156103a757600080fd5b506103c260048036038101906103bd9190613cce565b610d05565b005b3480156103d057600080fd5b506103eb60048036038101906103e69190613e28565b610d65565b6040516103f89190614fd4565b60405180910390f35b34801561040d57600080fd5b50610416610e0a565b6040516104239190614fd4565b60405180910390f35b34801561043857600080fd5b50610453600480360381019061044e9190613cce565b610e10565b005b34801561046157600080fd5b5061047c60048036038101906104779190613f20565b610e30565b005b34801561048a57600080fd5b506104a560048036038101906104a09190613c40565b610e8c565b6040516104b29190614b95565b60405180910390f35b3480156104c757600080fd5b506104e260048036038101906104dd9190613d98565b610f86565b005b3480156104f057600080fd5b5061050b60048036038101906105069190613f20565b61132c565b6040516105189190614fd4565b60405180910390f35b34801561052d57600080fd5b506105366113c3565b6040516105439190614b2e565b60405180910390f35b34801561055857600080fd5b50610573600480360381019061056e9190613edf565b6113db565b005b34801561058157600080fd5b5061058a611471565b6040516105979190614fd4565b60405180910390f35b3480156105ac57600080fd5b506105c760048036038101906105c29190613f20565b611480565b005b3480156105d557600080fd5b506105de611506565b6040516105eb9190614bb7565b60405180910390f35b34801561060057600080fd5b5061061b60048036038101906106169190613f20565b61151d565b6040516106289190614b2e565b60405180910390f35b34801561063d57600080fd5b506106466115cf565b6040516106539190614fd4565b60405180910390f35b34801561066857600080fd5b50610683600480360381019061067e9190613c40565b6115d5565b6040516106909190614fd4565b60405180910390f35b3480156106a557600080fd5b506106c060048036038101906106bb9190613d98565b61168d565b005b3480156106ce57600080fd5b506106d761184a565b6040516106e49190614bd2565b60405180910390f35b3480156106f957600080fd5b506107026118dc565b005b34801561071057600080fd5b5061072b60048036038101906107269190613f20565b611964565b005b34801561073957600080fd5b50610742611a7e565b60405161074f9190614bb7565b60405180910390f35b610760611a91565b005b34801561076e57600080fd5b50610777611b76565b6040516107849190614fd4565b60405180910390f35b34801561079957600080fd5b506107a2611b7b565b6040516107af9190614b2e565b60405180910390f35b3480156107c457600080fd5b506107cd611ba5565b6040516107da9190614bd2565b60405180910390f35b3480156107ef57600080fd5b506107f8611c37565b6040516108059190614fd4565b60405180910390f35b34801561081a57600080fd5b50610823611c3c565b6040516108309190614fd4565b60405180910390f35b34801561084557600080fd5b50610860600480360381019061085b9190613dec565b611c42565b005b61086a611dc3565b005b34801561087857600080fd5b50610881611dc5565b60405161088e9190614b2e565b60405180910390f35b6108b160048036038101906108ac9190613f20565b611deb565b005b3480156108bf57600080fd5b506108da60048036038101906108d59190613d1d565b611ed0565b005b3480156108e857600080fd5b5061090360048036038101906108fe9190613f20565b611f32565b005b34801561091157600080fd5b5061092c60048036038101906109279190613f20565b611fb8565b6040516109399190614bd2565b60405180910390f35b34801561094e57600080fd5b5061095761205f565b005b34801561096557600080fd5b5061096e612147565b60405161097b9190614bd2565b60405180910390f35b34801561099057600080fd5b506109ab60048036038101906109a69190613c92565b6121d5565b6040516109b89190614bb7565b60405180910390f35b3480156109cd57600080fd5b506109d6612269565b6040516109e39190614bb7565b60405180910390f35b3480156109f857600080fd5b50610a136004803603810190610a0e9190613c40565b612289565b005b6000610a2082612381565b9050919050565b610a2f6123fb565b73ffffffffffffffffffffffffffffffffffffffff16610a4d611b7b565b73ffffffffffffffffffffffffffffffffffffffff1614610aa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9a90614eb4565b60405180910390fd5b600115158115151415610abd57610ab8612403565b610ac6565b610ac56124a6565b5b50565b606060008054610ad8906152f3565b80601f0160208091040260200160405190810160405280929190818152602001828054610b04906152f3565b8015610b515780601f10610b2657610100808354040283529160200191610b51565b820191906000526020600020905b815481529060010190602001808311610b3457829003601f168201915b5050505050905090565b6000610b6682612548565b610ba5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9c90614e94565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610beb8261151d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5390614f34565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c7b6123fb565b73ffffffffffffffffffffffffffffffffffffffff161480610caa5750610ca981610ca46123fb565b6121d5565b5b610ce9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce090614dd4565b60405180910390fd5b610cf383836125b4565b505050565b6000600880549050905090565b610d16610d106123fb565b8261266d565b610d55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4c90614f54565b60405180910390fd5b610d6083838361274b565b505050565b6000610d70836115d5565b8210610db1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da890614c34565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600e5481565b610e2b83838360405180602001604052806000815250611ed0565b505050565b610e41610e3b6123fb565b8261266d565b610e80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7790614f94565b60405180910390fd5b610e89816129a7565b50565b60606000610e99836115d5565b905060008167ffffffffffffffff811115610edd577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610f0b5781602001602082028036833780820191505090505b50905060005b82811015610f7b57610f238582610d65565b828281518110610f5c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080610f7390615325565b915050610f11565b508092505050919050565b600e54610f91612ab8565b1115610fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc990614e74565b60405180910390fd5b610fda611b7b565b73ffffffffffffffffffffffffffffffffffffffff16610ff86123fb565b73ffffffffffffffffffffffffffffffffffffffff161461105c5761101b611506565b1561105b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105290614d94565b60405180910390fd5b5b600081519050600060148211156110a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109f90614df4565b60405180910390fd5b60005b82811015611311576110fc8482815181106110ef577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151612548565b1561113c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113390614d54565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8583815181106111b3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016111d79190614fd4565b60206040518083038186803b1580156111ef57600080fd5b505afa158015611203573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112279190613c69565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128b90614ed4565b60405180910390fd5b6112de858583815181106112d1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151612ac9565b6010546112e9612ab8565b10156112fe5781806112fa90615325565b9250505b808061130990615325565b9150506110ab565b506000811115611326576113253382612b0e565b5b50505050565b6000611336610cf8565b8210611377576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136e90614f74565b60405180910390fd5b600882815481106113b1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b73c8e868e9c922d50bc48db05b77274e0fc1ecd44081565b6113e36123fb565b73ffffffffffffffffffffffffffffffffffffffff16611401611b7b565b73ffffffffffffffffffffffffffffffffffffffff1614611457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144e90614eb4565b60405180910390fd5b806011908051906020019061146d9291906139b9565b5050565b600061147b612ab8565b905090565b6114886123fb565b73ffffffffffffffffffffffffffffffffffffffff166114a6611b7b565b73ffffffffffffffffffffffffffffffffffffffff16146114fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f390614eb4565b60405180910390fd5b80600f8190555050565b6000600a60149054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bd90614e34565b60405180910390fd5b80915050919050565b60105481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611646576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163d90614e14565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116956123fb565b73ffffffffffffffffffffffffffffffffffffffff166116b3611b7b565b73ffffffffffffffffffffffffffffffffffffffff1614611709576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170090614eb4565b60405180910390fd5b6000815190506014811115611753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174a90614fb4565b60405180910390fd5b60005b81811015611844576117a783828151811061179a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151612548565b156117e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117de90614db4565b60405180910390fd5b61183184848381518110611824577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151612ac9565b808061183c90615325565b915050611756565b50505050565b606060118054611859906152f3565b80601f0160208091040260200160405190810160405280929190818152602001828054611885906152f3565b80156118d25780601f106118a7576101008083540402835291602001916118d2565b820191906000526020600020905b8154815290600101906020018083116118b557829003601f168201915b5050505050905090565b6118e46123fb565b73ffffffffffffffffffffffffffffffffffffffff16611902611b7b565b73ffffffffffffffffffffffffffffffffffffffff1614611958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194f90614eb4565b60405180910390fd5b6119626000612b71565b565b61196c6123fb565b73ffffffffffffffffffffffffffffffffffffffff1661198a611b7b565b73ffffffffffffffffffffffffffffffffffffffff16146119e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d790614eb4565b60405180910390fd5b601260009054906101000a900460ff16611a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2690614c74565b60405180910390fd5b6122b8811115611a74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6b90614cd4565b60405180910390fd5b80600e8190555050565b601260009054906101000a900460ff1681565b611a996123fb565b73ffffffffffffffffffffffffffffffffffffffff16611ab7611b7b565b73ffffffffffffffffffffffffffffffffffffffff1614611b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0490614eb4565b60405180910390fd5b600047905060008111611b55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4c90614c94565b60405180910390fd5b611b7373c8e868e9c922d50bc48db05b77274e0fc1ecd44047612c37565b50565b601481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611bb4906152f3565b80601f0160208091040260200160405190810160405280929190818152602001828054611be0906152f3565b8015611c2d5780601f10611c0257610100808354040283529160200191611c2d565b820191906000526020600020905b815481529060010190602001808311611c1057829003601f168201915b5050505050905090565b600090565b600f5481565b611c4a6123fb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611caf90614d34565b60405180910390fd5b8060056000611cc56123fb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d726123fb565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611db79190614bb7565b60405180910390a35050565b565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611df36123fb565b73ffffffffffffffffffffffffffffffffffffffff16611e11611b7b565b73ffffffffffffffffffffffffffffffffffffffff1614611e67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5e90614eb4565b60405180910390fd5b6000479050818111611eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea590614c94565b60405180910390fd5b611ecc73c8e868e9c922d50bc48db05b77274e0fc1ecd44083612c37565b5050565b611ee1611edb6123fb565b8361266d565b611f20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1790614f54565b60405180910390fd5b611f2c84848484612c82565b50505050565b611f3a6123fb565b73ffffffffffffffffffffffffffffffffffffffff16611f58611b7b565b73ffffffffffffffffffffffffffffffffffffffff1614611fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa590614eb4565b60405180910390fd5b8060108190555050565b6060611fc382612548565b612002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff990614f14565b60405180910390fd5b600061200c612cde565b9050600081511161202c5760405180602001604052806000815250612057565b8061203684612d70565b604051602001612047929190614b0a565b6040516020818303038152906040525b915050919050565b6120676123fb565b73ffffffffffffffffffffffffffffffffffffffff16612085611b7b565b73ffffffffffffffffffffffffffffffffffffffff16146120db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d290614eb4565b60405180910390fd5b601260009054906101000a900460ff1661212a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212190614c74565b60405180910390fd5b6000601260006101000a81548160ff021916908315150217905550565b60118054612154906152f3565b80601f0160208091040260200160405190810160405280929190818152602001828054612180906152f3565b80156121cd5780601f106121a2576101008083540402835291602001916121cd565b820191906000526020600020905b8154815290600101906020018083116121b057829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000612273611506565b156122815760009050612286565b600190505b90565b6122916123fb565b73ffffffffffffffffffffffffffffffffffffffff166122af611b7b565b73ffffffffffffffffffffffffffffffffffffffff1614612305576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fc90614eb4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612375576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236c90614cb4565b60405180910390fd5b61237e81612b71565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806123f457506123f382612f1d565b5b9050919050565b600033905090565b61240b611506565b1561244b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244290614d94565b60405180910390fd5b6001600a60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861248f6123fb565b60405161249c9190614b2e565b60405180910390a1565b6124ae611506565b6124ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e490614c14565b60405180910390fd5b6000600a60146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6125316123fb565b60405161253e9190614b2e565b60405180910390a1565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166126278361151d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061267882612548565b6126b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ae90614d74565b60405180910390fd5b60006126c28361151d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061273157508373ffffffffffffffffffffffffffffffffffffffff1661271984610b5b565b73ffffffffffffffffffffffffffffffffffffffff16145b80612742575061274181856121d5565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661276b8261151d565b73ffffffffffffffffffffffffffffffffffffffff16146127c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b890614ef4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612831576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282890614d14565b60405180910390fd5b61283c838383612fff565b6128476000826125b4565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128979190615209565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128ee9190615128565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006129b28261151d565b90506129c081600084612fff565b6129cb6000836125b4565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a1b9190615209565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000612ac4600d61300f565b905090565b612ad3600d61301d565b612add8282613033565b807f86f740003797f6ed61a3eadecd8efb70132beda461c28b0bc74e5fdea2567a0560405160405180910390a25050565b600f54471115612b6d578173ffffffffffffffffffffffffffffffffffffffff166108fc82600f54612b4091906151af565b9081150290604051600060405180830381858888f19350505050158015612b6b573d6000803e3d6000fd5b505b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612c7d573d6000803e3d6000fd5b505050565b612c8d84848461274b565b612c9984848484613051565b612cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ccf90614c54565b60405180910390fd5b50505050565b606060118054612ced906152f3565b80601f0160208091040260200160405190810160405280929190818152602001828054612d19906152f3565b8015612d665780601f10612d3b57610100808354040283529160200191612d66565b820191906000526020600020905b815481529060010190602001808311612d4957829003601f168201915b5050505050905090565b60606000821415612db8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f18565b600082905060005b60008214612dea578080612dd390615325565b915050600a82612de3919061517e565b9150612dc0565b60008167ffffffffffffffff811115612e2c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612e5e5781602001600182028036833780820191505090505b5090505b60008514612f1157600182612e779190615209565b9150600a85612e86919061536e565b6030612e929190615128565b60f81b818381518110612ece577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f0a919061517e565b9450612e62565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612fe857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612ff85750612ff7826131e8565b5b9050919050565b61300a838383613252565b505050565b600081600001549050919050565b6001816000016000828254019250508190555050565b61304d8282604051806020016040528060008152506132ec565b5050565b60006130728473ffffffffffffffffffffffffffffffffffffffff16613347565b156131db578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261309b6123fb565b8786866040518563ffffffff1660e01b81526004016130bd9493929190614b49565b602060405180830381600087803b1580156130d757600080fd5b505af192505050801561310857506040513d601f19601f820116820180604052508101906131059190613eb6565b60015b61318b573d8060008114613138576040519150601f19603f3d011682016040523d82523d6000602084013e61313d565b606091505b50600081511415613183576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161317a90614c54565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506131e0565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61325d83838361335a565b613265611b7b565b73ffffffffffffffffffffffffffffffffffffffff166132836123fb565b73ffffffffffffffffffffffffffffffffffffffff16146132e7576132a6611506565b156132e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132dd90614bf4565b60405180910390fd5b5b505050565b6132f6838361346e565b6133036000848484613051565b613342576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333990614c54565b60405180910390fd5b505050565b600080823b905060008111915050919050565b61336583838361363c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156133a8576133a381613641565b6133e7565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146133e6576133e5838261368a565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561342a57613425816137f7565b613469565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461346857613467828261393a565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134d590614e54565b60405180910390fd5b6134e781612548565b15613527576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351e90614cf4565b60405180910390fd5b61353360008383612fff565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546135839190615128565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613697846115d5565b6136a19190615209565b9050600060076000848152602001908152602001600020549050818114613786576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061380b9190615209565b9050600060096000848152602001908152602001600020549050600060088381548110613861577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106138a9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061391e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613945836115d5565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546139c5906152f3565b90600052602060002090601f0160209004810192826139e75760008555613a2e565b82601f10613a0057805160ff1916838001178555613a2e565b82800160010185558215613a2e579182015b82811115613a2d578251825591602001919060010190613a12565b5b509050613a3b9190613a3f565b5090565b5b80821115613a58576000816000905550600101613a40565b5090565b6000613a6f613a6a84615020565b614fef565b90508083825260208201905082856020860282011115613a8e57600080fd5b60005b85811015613abe5781613aa48882613c2b565b845260208401935060208301925050600181019050613a91565b5050509392505050565b6000613adb613ad68461504c565b614fef565b905082815260208101848484011115613af357600080fd5b613afe8482856152b1565b509392505050565b6000613b19613b148461507c565b614fef565b905082815260208101848484011115613b3157600080fd5b613b3c8482856152b1565b509392505050565b600081359050613b538161546c565b92915050565b600081519050613b688161546c565b92915050565b600082601f830112613b7f57600080fd5b8135613b8f848260208601613a5c565b91505092915050565b600081359050613ba781615483565b92915050565b600081359050613bbc8161549a565b92915050565b600081519050613bd18161549a565b92915050565b600082601f830112613be857600080fd5b8135613bf8848260208601613ac8565b91505092915050565b600082601f830112613c1257600080fd5b8135613c22848260208601613b06565b91505092915050565b600081359050613c3a816154b1565b92915050565b600060208284031215613c5257600080fd5b6000613c6084828501613b44565b91505092915050565b600060208284031215613c7b57600080fd5b6000613c8984828501613b59565b91505092915050565b60008060408385031215613ca557600080fd5b6000613cb385828601613b44565b9250506020613cc485828601613b44565b9150509250929050565b600080600060608486031215613ce357600080fd5b6000613cf186828701613b44565b9350506020613d0286828701613b44565b9250506040613d1386828701613c2b565b9150509250925092565b60008060008060808587031215613d3357600080fd5b6000613d4187828801613b44565b9450506020613d5287828801613b44565b9350506040613d6387828801613c2b565b925050606085013567ffffffffffffffff811115613d8057600080fd5b613d8c87828801613bd7565b91505092959194509250565b60008060408385031215613dab57600080fd5b6000613db985828601613b44565b925050602083013567ffffffffffffffff811115613dd657600080fd5b613de285828601613b6e565b9150509250929050565b60008060408385031215613dff57600080fd5b6000613e0d85828601613b44565b9250506020613e1e85828601613b98565b9150509250929050565b60008060408385031215613e3b57600080fd5b6000613e4985828601613b44565b9250506020613e5a85828601613c2b565b9150509250929050565b600060208284031215613e7657600080fd5b6000613e8484828501613b98565b91505092915050565b600060208284031215613e9f57600080fd5b6000613ead84828501613bad565b91505092915050565b600060208284031215613ec857600080fd5b6000613ed684828501613bc2565b91505092915050565b600060208284031215613ef157600080fd5b600082013567ffffffffffffffff811115613f0b57600080fd5b613f1784828501613c01565b91505092915050565b600060208284031215613f3257600080fd5b6000613f4084828501613c2b565b91505092915050565b6000613f558383614aec565b60208301905092915050565b613f6a8161523d565b82525050565b6000613f7b826150bc565b613f8581856150ea565b9350613f90836150ac565b8060005b83811015613fc1578151613fa88882613f49565b9750613fb3836150dd565b925050600181019050613f94565b5085935050505092915050565b613fd78161524f565b82525050565b6000613fe8826150c7565b613ff281856150fb565b93506140028185602086016152c0565b61400b8161545b565b840191505092915050565b6000614021826150d2565b61402b818561510c565b935061403b8185602086016152c0565b6140448161545b565b840191505092915050565b600061405a826150d2565b614064818561511d565b93506140748185602086016152c0565b80840191505092915050565b600061408d602b8361510c565b91507f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008301527f68696c65207061757365640000000000000000000000000000000000000000006020830152604082019050919050565b60006140f360148361510c565b91507f5061757361626c653a206e6f74207061757365640000000000000000000000006000830152602082019050919050565b6000614133602b8361510c565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061419960328361510c565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006141ff60148361510c565b91507f43616e6e6f74206368616e676520737570706c790000000000000000000000006000830152602082019050919050565b600061423f60228361510c565b91507f5468657265206973206e6f20457468657220696e207468697320636f6e74726160008301527f63740000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142a560268361510c565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061430b601c8361510c565b91507f43616e6e6f74207261697365206c696d6974206f7665722038383838000000006000830152602082019050919050565b600061434b601c8361510c565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b600061438b60248361510c565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006143f160198361510c565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061443160168361510c565b91507f546f6b656e496420616c726561647920657869737473000000000000000000006000830152602082019050919050565b6000614471602c8361510c565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006144d760108361510c565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b600061451760228361510c565b91507f5468697320746f6b656e2068617320616c7265616479206265656e206d696e7460008301527f65640000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061457d60388361510c565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006145e3601b8361510c565b91507f547279696e6720746f206d696e74206d6f7265207468616e20323000000000006000830152602082019050919050565b6000614623602a8361510c565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061468960298361510c565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006146ef60208361510c565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061472f60088361510c565b91507f53616c6520656e640000000000000000000000000000000000000000000000006000830152602082019050919050565b600061476f602c8361510c565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006147d560208361510c565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614815601b8361510c565b91507f4e6f7420746865206f776e6572206f662074686973204b6f616c6100000000006000830152602082019050919050565b600061485560298361510c565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006148bb602f8361510c565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061492160218361510c565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061498760318361510c565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006149ed602c8361510c565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614a5360308361510c565b91507f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f766564000000000000000000000000000000006020830152604082019050919050565b6000614ab960178361510c565b91507f547279696e6720746f206d696e7420746f6f206d616e790000000000000000006000830152602082019050919050565b614af5816152a7565b82525050565b614b04816152a7565b82525050565b6000614b16828561404f565b9150614b22828461404f565b91508190509392505050565b6000602082019050614b436000830184613f61565b92915050565b6000608082019050614b5e6000830187613f61565b614b6b6020830186613f61565b614b786040830185614afb565b8181036060830152614b8a8184613fdd565b905095945050505050565b60006020820190508181036000830152614baf8184613f70565b905092915050565b6000602082019050614bcc6000830184613fce565b92915050565b60006020820190508181036000830152614bec8184614016565b905092915050565b60006020820190508181036000830152614c0d81614080565b9050919050565b60006020820190508181036000830152614c2d816140e6565b9050919050565b60006020820190508181036000830152614c4d81614126565b9050919050565b60006020820190508181036000830152614c6d8161418c565b9050919050565b60006020820190508181036000830152614c8d816141f2565b9050919050565b60006020820190508181036000830152614cad81614232565b9050919050565b60006020820190508181036000830152614ccd81614298565b9050919050565b60006020820190508181036000830152614ced816142fe565b9050919050565b60006020820190508181036000830152614d0d8161433e565b9050919050565b60006020820190508181036000830152614d2d8161437e565b9050919050565b60006020820190508181036000830152614d4d816143e4565b9050919050565b60006020820190508181036000830152614d6d81614424565b9050919050565b60006020820190508181036000830152614d8d81614464565b9050919050565b60006020820190508181036000830152614dad816144ca565b9050919050565b60006020820190508181036000830152614dcd8161450a565b9050919050565b60006020820190508181036000830152614ded81614570565b9050919050565b60006020820190508181036000830152614e0d816145d6565b9050919050565b60006020820190508181036000830152614e2d81614616565b9050919050565b60006020820190508181036000830152614e4d8161467c565b9050919050565b60006020820190508181036000830152614e6d816146e2565b9050919050565b60006020820190508181036000830152614e8d81614722565b9050919050565b60006020820190508181036000830152614ead81614762565b9050919050565b60006020820190508181036000830152614ecd816147c8565b9050919050565b60006020820190508181036000830152614eed81614808565b9050919050565b60006020820190508181036000830152614f0d81614848565b9050919050565b60006020820190508181036000830152614f2d816148ae565b9050919050565b60006020820190508181036000830152614f4d81614914565b9050919050565b60006020820190508181036000830152614f6d8161497a565b9050919050565b60006020820190508181036000830152614f8d816149e0565b9050919050565b60006020820190508181036000830152614fad81614a46565b9050919050565b60006020820190508181036000830152614fcd81614aac565b9050919050565b6000602082019050614fe96000830184614afb565b92915050565b6000604051905081810181811067ffffffffffffffff821117156150165761501561542c565b5b8060405250919050565b600067ffffffffffffffff82111561503b5761503a61542c565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156150675761506661542c565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156150975761509661542c565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000615133826152a7565b915061513e836152a7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156151735761517261539f565b5b828201905092915050565b6000615189826152a7565b9150615194836152a7565b9250826151a4576151a36153ce565b5b828204905092915050565b60006151ba826152a7565b91506151c5836152a7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156151fe576151fd61539f565b5b828202905092915050565b6000615214826152a7565b915061521f836152a7565b9250828210156152325761523161539f565b5b828203905092915050565b600061524882615287565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156152de5780820151818401526020810190506152c3565b838111156152ed576000848401525b50505050565b6000600282049050600182168061530b57607f821691505b6020821081141561531f5761531e6153fd565b5b50919050565b6000615330826152a7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156153635761536261539f565b5b600182019050919050565b6000615379826152a7565b9150615384836152a7565b925082615394576153936153ce565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6154758161523d565b811461548057600080fd5b50565b61548c8161524f565b811461549757600080fd5b50565b6154a38161525b565b81146154ae57600080fd5b50565b6154ba816152a7565b81146154c557600080fd5b5056fea264697066735822122004f35cf69ed11ff14cb6694be49ddacfac176a0c59f538e9c1a03969ec6ba3ac64736f6c63430008000033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001d68747470733a2f2f6b7564646c796b6f616c61732e636f6d2f6170692f000000

-----Decoded View---------------
Arg [0] : baseURI (string): https://kuddlykoalas.com/api/

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 000000000000000000000000000000000000000000000000000000000000001d
Arg [2] : 68747470733a2f2f6b7564646c796b6f616c61732e636f6d2f6170692f000000


Deployed Bytecode Sourcemap

318:6057:14:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6099:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5115:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2335:98:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3846:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3384:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1530:111:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4710:330:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1206:253:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;758:34:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5106:179:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;433:241:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4767:342:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1748:722;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1713:230:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;941:80:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4247:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1653:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4549:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1032:84:16;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2038:235:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;896:39:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1776:205:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2476:408:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4147:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1596:92:15;;;;;;;;;;;;;:::i;:::-;;3399:219:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1059:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5269:227;;;:::i;:::-;;798:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;964:85:15;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2497:102:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3952:72:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;844:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4130:290:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6286:46:14;;;:::i;:::-;;521:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5502:232;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5351:320:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4651:110:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2665:329:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3624:322:14;;;;;;;;;;;;;:::i;:::-;;1027:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4486:162:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2890:159:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1837:189:15;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6099:177:14;6210:4;6233:36;6257:11;6233:23;:36::i;:::-;6226:43;;6099:177;;;:::o;5115:148::-;1187:12:15;:10;:12::i;:::-;1176:23;;:7;:5;:7::i;:::-;:23;;;1168:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5178:4:14::1;5171:11;;:3;:11;;;5167:70;;;5198:8;:6;:8::i;:::-;5220:7;;5167:70;5246:10;:8;:10::i;:::-;1246:1:15;5115:148:14::0;:::o;2335:98:4:-;2389:13;2421:5;2414:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2335:98;:::o;3846:217::-;3922:7;3949:16;3957:7;3949;:16::i;:::-;3941:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4032:15;:24;4048:7;4032:24;;;;;;;;;;;;;;;;;;;;;4025:31;;3846:217;;;:::o;3384:401::-;3464:13;3480:23;3495:7;3480:14;:23::i;:::-;3464:39;;3527:5;3521:11;;:2;:11;;;;3513:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3618:5;3602:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3627:37;3644:5;3651:12;:10;:12::i;:::-;3627:16;:37::i;:::-;3602:62;3581:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;3757:21;3766:2;3770:7;3757:8;:21::i;:::-;3384:401;;;:::o;1530:111:6:-;1591:7;1617:10;:17;;;;1610:24;;1530:111;:::o;4710:330:4:-;4899:41;4918:12;:10;:12::i;:::-;4932:7;4899:18;:41::i;:::-;4891:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5005:28;5015:4;5021:2;5025:7;5005:9;:28::i;:::-;4710:330;;;:::o;1206:253:6:-;1303:7;1338:23;1355:5;1338:16;:23::i;:::-;1330:5;:31;1322:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1426:12;:19;1439:5;1426:19;;;;;;;;;;;;;;;:26;1446:5;1426:26;;;;;;;;;;;;1419:33;;1206:253;;;;:::o;758:34:14:-;;;;:::o;5106:179:4:-;5239:39;5256:4;5262:2;5266:7;5239:39;;;;;;;;;;;;:16;:39::i;:::-;5106:179;;;:::o;433:241:5:-;549:41;568:12;:10;:12::i;:::-;582:7;549:18;:41::i;:::-;541:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;653:14;659:7;653:5;:14::i;:::-;433:241;:::o;4767:342:14:-;4829:16;4857:18;4878:17;4888:6;4878:9;:17::i;:::-;4857:38;;4905:25;4947:10;4933:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4905:53;;4973:9;4968:110;4992:10;4988:1;:14;4968:110;;;5037:30;5057:6;5065:1;5037:19;:30::i;:::-;5023:8;5032:1;5023:11;;;;;;;;;;;;;;;;;;;;;:44;;;;;5004:3;;;;;:::i;:::-;;;;4968:110;;;;5094:8;5087:15;;;;4767:342;;;:::o;1748:722::-;1395:12;;1377:14;:12;:14::i;:::-;:30;;1369:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;1450:7;:5;:7::i;:::-;1434:23;;:12;:10;:12::i;:::-;:23;;;1430:92;;1482:8;:6;:8::i;:::-;1481:9;1473:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;1430:92;1859:13:::1;1875:17;:24;1859:40;;1909:12;836:2;1943:8;:23;;1935:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;2013:6;2008:379;2029:8;2025:1;:12;2008:379;;;2065:29;2073:17;2091:1;2073:20;;;;;;;;;;;;;;;;;;;;;;2065:7;:29::i;:::-;2064:30;2056:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;2155:22;;;;;;;;;;;:30;;;2186:17;2204:1;2186:20;;;;;;;;;;;;;;;;;;;;;;2155:52;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2141:66;;:10;:66;;;2133:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;2251:39;2264:3;2269:17;2287:1;2269:20;;;;;;;;;;;;;;;;;;;;;;2251:12;:39::i;:::-;2322:17;;2305:14;:12;:14::i;:::-;:34;2302:75;;;2355:9;;;;;:::i;:::-;;;;2302:75;2039:3;;;;;:::i;:::-;;;;2008:379;;;;2409:1;2399:7;:11;2396:68;;;2424:29;2433:10;2445:7;2424:8;:29::i;:::-;2396:68;1531:1;;1748:722:::0;;:::o;1713:230:6:-;1788:7;1823:30;:28;:30::i;:::-;1815:5;:38;1807:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;1919:10;1930:5;1919:17;;;;;;;;;;;;;;;;;;;;;;;;1912:24;;1713:230;;;:::o;941:80:14:-;979:42;941:80;:::o;4247:99::-;1187:12:15;:10;:12::i;:::-;1176:23;;:7;:5;:7::i;:::-;:23;;;1168:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4332:7:14::1;4317:12;:22;;;;;;;;;;;;:::i;:::-;;4247:99:::0;:::o;1653:89::-;1695:7;1721:14;:12;:14::i;:::-;1714:21;;1653:89;:::o;4549:96::-;1187:12:15;:10;:12::i;:::-;1176:23;;:7;:5;:7::i;:::-;:23;;;1168:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4631:7:14::1;4613:15;:25;;;;4549:96:::0;:::o;1032:84:16:-;1079:4;1102:7;;;;;;;;;;;1095:14;;1032:84;:::o;2038:235:4:-;2110:7;2129:13;2145:7;:16;2153:7;2145:16;;;;;;;;;;;;;;;;;;;;;2129:32;;2196:1;2179:19;;:5;:19;;;;2171:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2261:5;2254:12;;;2038:235;;;:::o;896:39:14:-;;;;:::o;1776:205:4:-;1848:7;1892:1;1875:19;;:5;:19;;;;1867:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;1958:9;:16;1968:5;1958:16;;;;;;;;;;;;;;;;1951:23;;1776:205;;;:::o;2476:408:14:-;1187:12:15;:10;:12::i;:::-;1176:23;;:7;:5;:7::i;:::-;:23;;;1168:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2572:13:14::1;2588:17;:24;2572:40;;836:2;2630:8;:23;;2622:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;2696:6;2691:187;2712:8;2708:1;:12;2691:187;;;2748:29;2756:17;2774:1;2756:20;;;;;;;;;;;;;;;;;;;;;;2748:7;:29::i;:::-;2747:30;2739:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;2828:39;2841:3;2846:17;2864:1;2846:20;;;;;;;;;;;;;;;;;;;;;;2828:12;:39::i;:::-;2722:3;;;;;:::i;:::-;;;;2691:187;;;;1246:1:15;2476:408:14::0;;:::o;4147:94::-;4190:13;4222:12;4215:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4147:94;:::o;1596:92:15:-;1187:12;:10;:12::i;:::-;1176:23;;:7;:5;:7::i;:::-;:23;;;1168:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1660:21:::1;1678:1;1660:9;:21::i;:::-;1596:92::o:0;3399:219:14:-;1187:12:15;:10;:12::i;:::-;1176:23;;:7;:5;:7::i;:::-;:23;;;1168:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3475:15:14::1;;;;;;;;;;;3467:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;3543:4;3533:6;:14;;3525:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;3605:6;3590:12;:21;;;;3399:219:::0;:::o;1059:34::-;;;;;;;;;;;;;:::o;5269:227::-;1187:12:15;:10;:12::i;:::-;1176:23;;:7;:5;:7::i;:::-;:23;;;1168:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5327:15:14::1;5345:21;5327:39;;5394:1;5384:7;:11;5376:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;5444:45;979:42;5467:21;5444:9;:45::i;:::-;1246:1:15;5269:227:14:o:0;798:40::-;836:2;798:40;:::o;964:85:15:-;1010:7;1036:6;;;;;;;;;;;1029:13;;964:85;:::o;2497:102:4:-;2553:13;2585:7;2578:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2497:102;:::o;3952:72:14:-;3990:7;3952:72;:::o;844:46::-;;;;:::o;4130:290:4:-;4244:12;:10;:12::i;:::-;4232:24;;:8;:24;;;;4224:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4342:8;4297:18;:32;4316:12;:10;:12::i;:::-;4297:32;;;;;;;;;;;;;;;:42;4330:8;4297:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;4394:8;4365:48;;4380:12;:10;:12::i;:::-;4365:48;;;4404:8;4365:48;;;;;;:::i;:::-;;;;;;;;4130:290;;:::o;6286:46:14:-;:::o;521:81::-;;;;;;;;;;;;;:::o;5502:232::-;1187:12:15;:10;:12::i;:::-;1176:23;;:7;:5;:7::i;:::-;:23;;;1168:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5573:15:14::1;5591:21;5573:39;;5640:7;5630;:17;5622:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;5696:31;979:42;5719:7;5696:9;:31::i;:::-;1246:1:15;5502:232:14::0;:::o;5351:320:4:-;5520:41;5539:12;:10;:12::i;:::-;5553:7;5520:18;:41::i;:::-;5512:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5625:39;5639:4;5645:2;5649:7;5658:5;5625:13;:39::i;:::-;5351:320;;;;:::o;4651:110:14:-;1187:12:15;:10;:12::i;:::-;1176:23;;:7;:5;:7::i;:::-;:23;;;1168:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4745:9:14::1;4725:17;:29;;;;4651:110:::0;:::o;2665:329:4:-;2738:13;2771:16;2779:7;2771;:16::i;:::-;2763:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2850:21;2874:10;:8;:10::i;:::-;2850:34;;2925:1;2907:7;2901:21;:25;:86;;;;;;;;;;;;;;;;;2953:7;2962:18;:7;:16;:18::i;:::-;2936:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2901:86;2894:93;;;2665:329;;;:::o;3624:322:14:-;1187:12:15;:10;:12::i;:::-;1176:23;;:7;:5;:7::i;:::-;:23;;;1168:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3866:15:14::1;;;;;;;;;;;3858:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;3934:5;3916:15;;:23;;;;;;;;;;;;;;;;;;3624:322::o:0;1027:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4486:162:4:-;4583:4;4606:18;:25;4625:5;4606:25;;;;;;;;;;;;;;;:35;4632:8;4606:35;;;;;;;;;;;;;;;;;;;;;;;;;4599:42;;4486:162;;;;:::o;2890:159:14:-;2935:4;2954:8;:6;:8::i;:::-;2951:92;;;2985:5;2978:12;;;;2951:92;3028:4;3021:11;;2890:159;;:::o;1837:189:15:-;1187:12;:10;:12::i;:::-;1176:23;;:7;:5;:7::i;:::-;:23;;;1168:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1945:1:::1;1925:22;;:8;:22;;;;1917:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2000:19;2010:8;2000:9;:19::i;:::-;1837:189:::0;:::o;905:222:6:-;1007:4;1045:35;1030:50;;;:11;:50;;;;:90;;;;1084:36;1108:11;1084:23;:36::i;:::-;1030:90;1023:97;;905:222;;;:::o;586:96:1:-;639:7;665:10;658:17;;586:96;:::o;1797:115:16:-;1346:8;:6;:8::i;:::-;1345:9;1337:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;1866:4:::1;1856:7;;:14;;;;;;;;;;;;;;;;;;1885:20;1892:12;:10;:12::i;:::-;1885:20;;;;;;:::i;:::-;;;;;;;;1797:115::o:0;2044:117::-;1611:8;:6;:8::i;:::-;1603:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;2112:5:::1;2102:7;;:15;;;;;;;;;;;;;;;;;;2132:22;2141:12;:10;:12::i;:::-;2132:22;;;;;;:::i;:::-;;;;;;;;2044:117::o:0;7143:125:4:-;7208:4;7259:1;7231:30;;:7;:16;7239:7;7231:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7224:37;;7143:125;;;:::o;10994:171::-;11095:2;11068:15;:24;11084:7;11068:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11150:7;11146:2;11112:46;;11121:23;11136:7;11121:14;:23::i;:::-;11112:46;;;;;;;;;;;;10994:171;;:::o;7426:344::-;7519:4;7543:16;7551:7;7543;:16::i;:::-;7535:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7618:13;7634:23;7649:7;7634:14;:23::i;:::-;7618:39;;7686:5;7675:16;;:7;:16;;;:51;;;;7719:7;7695:31;;:20;7707:7;7695:11;:20::i;:::-;:31;;;7675:51;:87;;;;7730:32;7747:5;7754:7;7730:16;:32::i;:::-;7675:87;7667:96;;;7426:344;;;;:::o;10323:560::-;10477:4;10450:31;;:23;10465:7;10450:14;:23::i;:::-;:31;;;10442:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10559:1;10545:16;;:2;:16;;;;10537:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10613:39;10634:4;10640:2;10644:7;10613:20;:39::i;:::-;10714:29;10731:1;10735:7;10714:8;:29::i;:::-;10773:1;10754:9;:15;10764:4;10754:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10801:1;10784:9;:13;10794:2;10784:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10831:2;10812:7;:16;10820:7;10812:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10868:7;10864:2;10849:27;;10858:4;10849:27;;;;;;;;;;;;10323:560;;;:::o;9651:348::-;9710:13;9726:23;9741:7;9726:14;:23::i;:::-;9710:39;;9760:48;9781:5;9796:1;9800:7;9760:20;:48::i;:::-;9846:29;9863:1;9867:7;9846:8;:29::i;:::-;9906:1;9886:9;:16;9896:5;9886:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;9924:7;:16;9932:7;9924:16;;;;;;;;;;;;9917:23;;;;;;;;;;;9984:7;9980:1;9956:36;;9965:5;9956:36;;;;;;;;;;;;9651:348;;:::o;1545:102:14:-;1592:4;1615:25;:15;:23;:25::i;:::-;1608:32;;1545:102;:::o;3055:173::-;3123:27;:15;:25;:27::i;:::-;3160:24;3170:3;3175:8;3160:9;:24::i;:::-;3212:8;3199:22;;;;;;;;;;3055:173;;:::o;4352:191::-;4447:15;;4423:21;:39;4420:117;;;4484:3;4476:21;;:50;4516:9;4498:15;;:27;;;;:::i;:::-;4476:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4420:117;4352:191;;:::o;2032:169:15:-;2087:16;2106:6;;;;;;;;;;;2087:25;;2131:8;2122:6;;:17;;;;;;;;;;;;;;;;;;2185:8;2154:40;;2175:8;2154:40;;;;;;;;;;;;2032:169;;:::o;5740:114:14:-;5820:8;5812:26;;:35;5839:7;5812:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5740:114;;:::o;6533:307:4:-;6684:28;6694:4;6700:2;6704:7;6684:9;:28::i;:::-;6730:48;6753:4;6759:2;6763:7;6772:5;6730:22;:48::i;:::-;6722:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6533:307;;;;:::o;4030:111:14:-;4090:13;4122:12;4115:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4030:111;:::o;275:703:18:-;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;928:2;919:11;;;;;:::i;:::-;;;791:150;;;964:6;950:21;;;;;275:703;;;;:::o;1417:300:4:-;1519:4;1569:25;1554:40;;;:11;:40;;;;:104;;;;1625:33;1610:48;;;:11;:48;;;;1554:104;:156;;;;1674:36;1698:11;1674:23;:36::i;:::-;1554:156;1535:175;;1417:300;;;:::o;5860:233:14:-;6041:45;6068:4;6074:2;6078:7;6041:26;:45::i;:::-;5860:233;;;:::o;773:112:2:-;838:7;864;:14;;;857:21;;773:112;;;:::o;891:123::-;996:1;978:7;:14;;;:19;;;;;;;;;;;891:123;:::o;8100:108:4:-;8175:26;8185:2;8189:7;8175:26;;;;;;;;;;;;:9;:26::i;:::-;8100:108;;:::o;11718:782::-;11868:4;11888:15;:2;:13;;;:15::i;:::-;11884:610;;;11939:2;11923:36;;;11960:12;:10;:12::i;:::-;11974:4;11980:7;11989:5;11923:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;11919:523;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12183:1;12166:6;:13;:18;12162:266;;;12208:60;;;;;;;;;;:::i;:::-;;;;;;;;12162:266;12380:6;12374:13;12365:6;12361:2;12357:15;12350:38;11919:523;12055:45;;;12045:55;;;:6;:55;;;;12038:62;;;;;11884:610;12479:4;12472:11;;11718:782;;;;;;;:::o;761:155:3:-;846:4;884:25;869:40;;;:11;:40;;;;862:47;;761:155;;;:::o;604:319:7:-;743:45;770:4;776:2;780:7;743:26;:45::i;:::-;818:7;:5;:7::i;:::-;802:23;;:12;:10;:12::i;:::-;:23;;;798:119;;850:8;:6;:8::i;:::-;849:9;841:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;798:119;604:319;;;:::o;8429:311:4:-;8554:18;8560:2;8564:7;8554:5;:18::i;:::-;8603:54;8634:1;8638:2;8642:7;8651:5;8603:22;:54::i;:::-;8582:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;8429:311;;;:::o;718:377:0:-;778:4;981:12;1046:7;1034:20;1026:28;;1087:1;1080:4;:8;1073:15;;;718:377;;;:::o;2539:572:6:-;2678:45;2705:4;2711:2;2715:7;2678:26;:45::i;:::-;2754:1;2738:18;;:4;:18;;;2734:183;;;2772:40;2804:7;2772:31;:40::i;:::-;2734:183;;;2841:2;2833:10;;:4;:10;;;2829:88;;2859:47;2892:4;2898:7;2859:32;:47::i;:::-;2829:88;2734:183;2944:1;2930:16;;:2;:16;;;2926:179;;;2962:45;2999:7;2962:36;:45::i;:::-;2926:179;;;3034:4;3028:10;;:2;:10;;;3024:81;;3054:40;3082:2;3086:7;3054:27;:40::i;:::-;3024:81;2926:179;2539:572;;;:::o;9062:372:4:-;9155:1;9141:16;;:2;:16;;;;9133:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9213:16;9221:7;9213;:16::i;:::-;9212:17;9204:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9273:45;9302:1;9306:2;9310:7;9273:20;:45::i;:::-;9346:1;9329:9;:13;9339:2;9329:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9376:2;9357:7;:16;9365:7;9357:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9419:7;9415:2;9394:33;;9411:1;9394:33;;;;;;;;;;;;9062:372;;:::o;13056:122::-;;;;:::o;3817:161:6:-;3920:10;:17;;;;3893:15;:24;3909:7;3893:24;;;;;;;;;;;:44;;;;3947:10;3963:7;3947:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3817:161;:::o;4595:970::-;4857:22;4907:1;4882:22;4899:4;4882:16;:22::i;:::-;:26;;;;:::i;:::-;4857:51;;4918:18;4939:17;:26;4957:7;4939:26;;;;;;;;;;;;4918:47;;5083:14;5069:10;:28;5065:323;;5113:19;5135:12;:18;5148:4;5135:18;;;;;;;;;;;;;;;:34;5154:14;5135:34;;;;;;;;;;;;5113:56;;5217:11;5184:12;:18;5197:4;5184:18;;;;;;;;;;;;;;;:30;5203:10;5184:30;;;;;;;;;;;:44;;;;5333:10;5300:17;:30;5318:11;5300:30;;;;;;;;;;;:43;;;;5065:323;;5481:17;:26;5499:7;5481:26;;;;;;;;;;;5474:33;;;5524:12;:18;5537:4;5524:18;;;;;;;;;;;;;;;:34;5543:14;5524:34;;;;;;;;;;;5517:41;;;4595:970;;;;:::o;5853:1061::-;6102:22;6147:1;6127:10;:17;;;;:21;;;;:::i;:::-;6102:46;;6158:18;6179:15;:24;6195:7;6179:24;;;;;;;;;;;;6158:45;;6525:19;6547:10;6558:14;6547:26;;;;;;;;;;;;;;;;;;;;;;;;6525:48;;6609:11;6584:10;6595;6584:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;6719:10;6688:15;:28;6704:11;6688:28;;;;;;;;;;;:41;;;;6857:15;:24;6873:7;6857:24;;;;;;;;;;;6850:31;;;6891:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5853:1061;;;;:::o;3405:217::-;3489:14;3506:20;3523:2;3506:16;:20::i;:::-;3489:37;;3563:7;3536:12;:16;3549:2;3536:16;;;;;;;;;;;;;;;:24;3553:6;3536:24;;;;;;;;;;;:34;;;;3609:6;3580:17;:26;3598:7;3580:26;;;;;;;;;;;:35;;;;3405:217;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:622:19:-;;145:80;160:64;217:6;160:64;:::i;:::-;145:80;:::i;:::-;136:89;;245:5;273:6;266:5;259:21;299:4;292:5;288:16;281:23;;324:6;374:3;366:4;358:6;354:17;349:3;345:27;342:36;339:2;;;391:1;388;381:12;339:2;419:1;404:236;429:6;426:1;423:13;404:236;;;496:3;524:37;557:3;545:10;524:37;:::i;:::-;519:3;512:50;591:4;586:3;582:14;575:21;;625:4;620:3;616:14;609:21;;464:176;451:1;448;444:9;439:14;;404:236;;;408:14;126:520;;;;;;;:::o;652:342::-;;754:64;769:48;810:6;769:48;:::i;:::-;754:64;:::i;:::-;745:73;;841:6;834:5;827:21;879:4;872:5;868:16;917:3;908:6;903:3;899:16;896:25;893:2;;;934:1;931;924:12;893:2;947:41;981:6;976:3;971;947:41;:::i;:::-;735:259;;;;;;:::o;1000:344::-;;1103:65;1118:49;1160:6;1118:49;:::i;:::-;1103:65;:::i;:::-;1094:74;;1191:6;1184:5;1177:21;1229:4;1222:5;1218:16;1267:3;1258:6;1253:3;1249:16;1246:25;1243:2;;;1284:1;1281;1274:12;1243:2;1297:41;1331:6;1326:3;1321;1297:41;:::i;:::-;1084:260;;;;;;:::o;1350:139::-;;1434:6;1421:20;1412:29;;1450:33;1477:5;1450:33;:::i;:::-;1402:87;;;;:::o;1495:143::-;;1583:6;1577:13;1568:22;;1599:33;1626:5;1599:33;:::i;:::-;1558:80;;;;:::o;1661:303::-;;1781:3;1774:4;1766:6;1762:17;1758:27;1748:2;;1799:1;1796;1789:12;1748:2;1839:6;1826:20;1864:94;1954:3;1946:6;1939:4;1931:6;1927:17;1864:94;:::i;:::-;1855:103;;1738:226;;;;;:::o;1970:133::-;;2051:6;2038:20;2029:29;;2067:30;2091:5;2067:30;:::i;:::-;2019:84;;;;:::o;2109:137::-;;2192:6;2179:20;2170:29;;2208:32;2234:5;2208:32;:::i;:::-;2160:86;;;;:::o;2252:141::-;;2339:6;2333:13;2324:22;;2355:32;2381:5;2355:32;:::i;:::-;2314:79;;;;:::o;2412:271::-;;2516:3;2509:4;2501:6;2497:17;2493:27;2483:2;;2534:1;2531;2524:12;2483:2;2574:6;2561:20;2599:78;2673:3;2665:6;2658:4;2650:6;2646:17;2599:78;:::i;:::-;2590:87;;2473:210;;;;;:::o;2703:273::-;;2808:3;2801:4;2793:6;2789:17;2785:27;2775:2;;2826:1;2823;2816:12;2775:2;2866:6;2853:20;2891:79;2966:3;2958:6;2951:4;2943:6;2939:17;2891:79;:::i;:::-;2882:88;;2765:211;;;;;:::o;2982:139::-;;3066:6;3053:20;3044:29;;3082:33;3109:5;3082:33;:::i;:::-;3034:87;;;;:::o;3127:262::-;;3235:2;3223:9;3214:7;3210:23;3206:32;3203:2;;;3251:1;3248;3241:12;3203:2;3294:1;3319:53;3364:7;3355:6;3344:9;3340:22;3319:53;:::i;:::-;3309:63;;3265:117;3193:196;;;;:::o;3395:284::-;;3514:2;3502:9;3493:7;3489:23;3485:32;3482:2;;;3530:1;3527;3520:12;3482:2;3573:1;3598:64;3654:7;3645:6;3634:9;3630:22;3598:64;:::i;:::-;3588:74;;3544:128;3472:207;;;;:::o;3685:407::-;;;3810:2;3798:9;3789:7;3785:23;3781:32;3778:2;;;3826:1;3823;3816:12;3778:2;3869:1;3894:53;3939:7;3930:6;3919:9;3915:22;3894:53;:::i;:::-;3884:63;;3840:117;3996:2;4022:53;4067:7;4058:6;4047:9;4043:22;4022:53;:::i;:::-;4012:63;;3967:118;3768:324;;;;;:::o;4098:552::-;;;;4240:2;4228:9;4219:7;4215:23;4211:32;4208:2;;;4256:1;4253;4246:12;4208:2;4299:1;4324:53;4369:7;4360:6;4349:9;4345:22;4324:53;:::i;:::-;4314:63;;4270:117;4426:2;4452:53;4497:7;4488:6;4477:9;4473:22;4452:53;:::i;:::-;4442:63;;4397:118;4554:2;4580:53;4625:7;4616:6;4605:9;4601:22;4580:53;:::i;:::-;4570:63;;4525:118;4198:452;;;;;:::o;4656:809::-;;;;;4824:3;4812:9;4803:7;4799:23;4795:33;4792:2;;;4841:1;4838;4831:12;4792:2;4884:1;4909:53;4954:7;4945:6;4934:9;4930:22;4909:53;:::i;:::-;4899:63;;4855:117;5011:2;5037:53;5082:7;5073:6;5062:9;5058:22;5037:53;:::i;:::-;5027:63;;4982:118;5139:2;5165:53;5210:7;5201:6;5190:9;5186:22;5165:53;:::i;:::-;5155:63;;5110:118;5295:2;5284:9;5280:18;5267:32;5326:18;5318:6;5315:30;5312:2;;;5358:1;5355;5348:12;5312:2;5386:62;5440:7;5431:6;5420:9;5416:22;5386:62;:::i;:::-;5376:72;;5238:220;4782:683;;;;;;;:::o;5471:550::-;;;5621:2;5609:9;5600:7;5596:23;5592:32;5589:2;;;5637:1;5634;5627:12;5589:2;5680:1;5705:53;5750:7;5741:6;5730:9;5726:22;5705:53;:::i;:::-;5695:63;;5651:117;5835:2;5824:9;5820:18;5807:32;5866:18;5858:6;5855:30;5852:2;;;5898:1;5895;5888:12;5852:2;5926:78;5996:7;5987:6;5976:9;5972:22;5926:78;:::i;:::-;5916:88;;5778:236;5579:442;;;;;:::o;6027:401::-;;;6149:2;6137:9;6128:7;6124:23;6120:32;6117:2;;;6165:1;6162;6155:12;6117:2;6208:1;6233:53;6278:7;6269:6;6258:9;6254:22;6233:53;:::i;:::-;6223:63;;6179:117;6335:2;6361:50;6403:7;6394:6;6383:9;6379:22;6361:50;:::i;:::-;6351:60;;6306:115;6107:321;;;;;:::o;6434:407::-;;;6559:2;6547:9;6538:7;6534:23;6530:32;6527:2;;;6575:1;6572;6565:12;6527:2;6618:1;6643:53;6688:7;6679:6;6668:9;6664:22;6643:53;:::i;:::-;6633:63;;6589:117;6745:2;6771:53;6816:7;6807:6;6796:9;6792:22;6771:53;:::i;:::-;6761:63;;6716:118;6517:324;;;;;:::o;6847:256::-;;6952:2;6940:9;6931:7;6927:23;6923:32;6920:2;;;6968:1;6965;6958:12;6920:2;7011:1;7036:50;7078:7;7069:6;7058:9;7054:22;7036:50;:::i;:::-;7026:60;;6982:114;6910:193;;;;:::o;7109:260::-;;7216:2;7204:9;7195:7;7191:23;7187:32;7184:2;;;7232:1;7229;7222:12;7184:2;7275:1;7300:52;7344:7;7335:6;7324:9;7320:22;7300:52;:::i;:::-;7290:62;;7246:116;7174:195;;;;:::o;7375:282::-;;7493:2;7481:9;7472:7;7468:23;7464:32;7461:2;;;7509:1;7506;7499:12;7461:2;7552:1;7577:63;7632:7;7623:6;7612:9;7608:22;7577:63;:::i;:::-;7567:73;;7523:127;7451:206;;;;:::o;7663:375::-;;7781:2;7769:9;7760:7;7756:23;7752:32;7749:2;;;7797:1;7794;7787:12;7749:2;7868:1;7857:9;7853:17;7840:31;7898:18;7890:6;7887:30;7884:2;;;7930:1;7927;7920:12;7884:2;7958:63;8013:7;8004:6;7993:9;7989:22;7958:63;:::i;:::-;7948:73;;7811:220;7739:299;;;;:::o;8044:262::-;;8152:2;8140:9;8131:7;8127:23;8123:32;8120:2;;;8168:1;8165;8158:12;8120:2;8211:1;8236:53;8281:7;8272:6;8261:9;8257:22;8236:53;:::i;:::-;8226:63;;8182:117;8110:196;;;;:::o;8312:179::-;;8402:46;8444:3;8436:6;8402:46;:::i;:::-;8480:4;8475:3;8471:14;8457:28;;8392:99;;;;:::o;8497:118::-;8584:24;8602:5;8584:24;:::i;:::-;8579:3;8572:37;8562:53;;:::o;8651:732::-;;8799:54;8847:5;8799:54;:::i;:::-;8869:86;8948:6;8943:3;8869:86;:::i;:::-;8862:93;;8979:56;9029:5;8979:56;:::i;:::-;9058:7;9089:1;9074:284;9099:6;9096:1;9093:13;9074:284;;;9175:6;9169:13;9202:63;9261:3;9246:13;9202:63;:::i;:::-;9195:70;;9288:60;9341:6;9288:60;:::i;:::-;9278:70;;9134:224;9121:1;9118;9114:9;9109:14;;9074:284;;;9078:14;9374:3;9367:10;;8775:608;;;;;;;:::o;9389:109::-;9470:21;9485:5;9470:21;:::i;:::-;9465:3;9458:34;9448:50;;:::o;9504:360::-;;9618:38;9650:5;9618:38;:::i;:::-;9672:70;9735:6;9730:3;9672:70;:::i;:::-;9665:77;;9751:52;9796:6;9791:3;9784:4;9777:5;9773:16;9751:52;:::i;:::-;9828:29;9850:6;9828:29;:::i;:::-;9823:3;9819:39;9812:46;;9594:270;;;;;:::o;9870:364::-;;9986:39;10019:5;9986:39;:::i;:::-;10041:71;10105:6;10100:3;10041:71;:::i;:::-;10034:78;;10121:52;10166:6;10161:3;10154:4;10147:5;10143:16;10121:52;:::i;:::-;10198:29;10220:6;10198:29;:::i;:::-;10193:3;10189:39;10182:46;;9962:272;;;;;:::o;10240:377::-;;10374:39;10407:5;10374:39;:::i;:::-;10429:89;10511:6;10506:3;10429:89;:::i;:::-;10422:96;;10527:52;10572:6;10567:3;10560:4;10553:5;10549:16;10527:52;:::i;:::-;10604:6;10599:3;10595:16;10588:23;;10350:267;;;;;:::o;10623:375::-;;10786:67;10850:2;10845:3;10786:67;:::i;:::-;10779:74;;10883:34;10879:1;10874:3;10870:11;10863:55;10949:13;10944:2;10939:3;10935:12;10928:35;10989:2;10984:3;10980:12;10973:19;;10769:229;;;:::o;11004:318::-;;11167:67;11231:2;11226:3;11167:67;:::i;:::-;11160:74;;11264:22;11260:1;11255:3;11251:11;11244:43;11313:2;11308:3;11304:12;11297:19;;11150:172;;;:::o;11328:375::-;;11491:67;11555:2;11550:3;11491:67;:::i;:::-;11484:74;;11588:34;11584:1;11579:3;11575:11;11568:55;11654:13;11649:2;11644:3;11640:12;11633:35;11694:2;11689:3;11685:12;11678:19;;11474:229;;;:::o;11709:382::-;;11872:67;11936:2;11931:3;11872:67;:::i;:::-;11865:74;;11969:34;11965:1;11960:3;11956:11;11949:55;12035:20;12030:2;12025:3;12021:12;12014:42;12082:2;12077:3;12073:12;12066:19;;11855:236;;;:::o;12097:318::-;;12260:67;12324:2;12319:3;12260:67;:::i;:::-;12253:74;;12357:22;12353:1;12348:3;12344:11;12337:43;12406:2;12401:3;12397:12;12390:19;;12243:172;;;:::o;12421:366::-;;12584:67;12648:2;12643:3;12584:67;:::i;:::-;12577:74;;12681:34;12677:1;12672:3;12668:11;12661:55;12747:4;12742:2;12737:3;12733:12;12726:26;12778:2;12773:3;12769:12;12762:19;;12567:220;;;:::o;12793:370::-;;12956:67;13020:2;13015:3;12956:67;:::i;:::-;12949:74;;13053:34;13049:1;13044:3;13040:11;13033:55;13119:8;13114:2;13109:3;13105:12;13098:30;13154:2;13149:3;13145:12;13138:19;;12939:224;;;:::o;13169:326::-;;13332:67;13396:2;13391:3;13332:67;:::i;:::-;13325:74;;13429:30;13425:1;13420:3;13416:11;13409:51;13486:2;13481:3;13477:12;13470:19;;13315:180;;;:::o;13501:326::-;;13664:67;13728:2;13723:3;13664:67;:::i;:::-;13657:74;;13761:30;13757:1;13752:3;13748:11;13741:51;13818:2;13813:3;13809:12;13802:19;;13647:180;;;:::o;13833:368::-;;13996:67;14060:2;14055:3;13996:67;:::i;:::-;13989:74;;14093:34;14089:1;14084:3;14080:11;14073:55;14159:6;14154:2;14149:3;14145:12;14138:28;14192:2;14187:3;14183:12;14176:19;;13979:222;;;:::o;14207:323::-;;14370:67;14434:2;14429:3;14370:67;:::i;:::-;14363:74;;14467:27;14463:1;14458:3;14454:11;14447:48;14521:2;14516:3;14512:12;14505:19;;14353:177;;;:::o;14536:320::-;;14699:67;14763:2;14758:3;14699:67;:::i;:::-;14692:74;;14796:24;14792:1;14787:3;14783:11;14776:45;14847:2;14842:3;14838:12;14831:19;;14682:174;;;:::o;14862:376::-;;15025:67;15089:2;15084:3;15025:67;:::i;:::-;15018:74;;15122:34;15118:1;15113:3;15109:11;15102:55;15188:14;15183:2;15178:3;15174:12;15167:36;15229:2;15224:3;15220:12;15213:19;;15008:230;;;:::o;15244:314::-;;15407:67;15471:2;15466:3;15407:67;:::i;:::-;15400:74;;15504:18;15500:1;15495:3;15491:11;15484:39;15549:2;15544:3;15540:12;15533:19;;15390:168;;;:::o;15564:366::-;;15727:67;15791:2;15786:3;15727:67;:::i;:::-;15720:74;;15824:34;15820:1;15815:3;15811:11;15804:55;15890:4;15885:2;15880:3;15876:12;15869:26;15921:2;15916:3;15912:12;15905:19;;15710:220;;;:::o;15936:388::-;;16099:67;16163:2;16158:3;16099:67;:::i;:::-;16092:74;;16196:34;16192:1;16187:3;16183:11;16176:55;16262:26;16257:2;16252:3;16248:12;16241:48;16315:2;16310:3;16306:12;16299:19;;16082:242;;;:::o;16330:325::-;;16493:67;16557:2;16552:3;16493:67;:::i;:::-;16486:74;;16590:29;16586:1;16581:3;16577:11;16570:50;16646:2;16641:3;16637:12;16630:19;;16476:179;;;:::o;16661:374::-;;16824:67;16888:2;16883:3;16824:67;:::i;:::-;16817:74;;16921:34;16917:1;16912:3;16908:11;16901:55;16987:12;16982:2;16977:3;16973:12;16966:34;17026:2;17021:3;17017:12;17010:19;;16807:228;;;:::o;17041:373::-;;17204:67;17268:2;17263:3;17204:67;:::i;:::-;17197:74;;17301:34;17297:1;17292:3;17288:11;17281:55;17367:11;17362:2;17357:3;17353:12;17346:33;17405:2;17400:3;17396:12;17389:19;;17187:227;;;:::o;17420:330::-;;17583:67;17647:2;17642:3;17583:67;:::i;:::-;17576:74;;17680:34;17676:1;17671:3;17667:11;17660:55;17741:2;17736:3;17732:12;17725:19;;17566:184;;;:::o;17756:305::-;;17919:66;17983:1;17978:3;17919:66;:::i;:::-;17912:73;;18015:10;18011:1;18006:3;18002:11;17995:31;18052:2;18047:3;18043:12;18036:19;;17902:159;;;:::o;18067:376::-;;18230:67;18294:2;18289:3;18230:67;:::i;:::-;18223:74;;18327:34;18323:1;18318:3;18314:11;18307:55;18393:14;18388:2;18383:3;18379:12;18372:36;18434:2;18429:3;18425:12;18418:19;;18213:230;;;:::o;18449:330::-;;18612:67;18676:2;18671:3;18612:67;:::i;:::-;18605:74;;18709:34;18705:1;18700:3;18696:11;18689:55;18770:2;18765:3;18761:12;18754:19;;18595:184;;;:::o;18785:325::-;;18948:67;19012:2;19007:3;18948:67;:::i;:::-;18941:74;;19045:29;19041:1;19036:3;19032:11;19025:50;19101:2;19096:3;19092:12;19085:19;;18931:179;;;:::o;19116:373::-;;19279:67;19343:2;19338:3;19279:67;:::i;:::-;19272:74;;19376:34;19372:1;19367:3;19363:11;19356:55;19442:11;19437:2;19432:3;19428:12;19421:33;19480:2;19475:3;19471:12;19464:19;;19262:227;;;:::o;19495:379::-;;19658:67;19722:2;19717:3;19658:67;:::i;:::-;19651:74;;19755:34;19751:1;19746:3;19742:11;19735:55;19821:17;19816:2;19811:3;19807:12;19800:39;19865:2;19860:3;19856:12;19849:19;;19641:233;;;:::o;19880:365::-;;20043:67;20107:2;20102:3;20043:67;:::i;:::-;20036:74;;20140:34;20136:1;20131:3;20127:11;20120:55;20206:3;20201:2;20196:3;20192:12;20185:25;20236:2;20231:3;20227:12;20220:19;;20026:219;;;:::o;20251:381::-;;20414:67;20478:2;20473:3;20414:67;:::i;:::-;20407:74;;20511:34;20507:1;20502:3;20498:11;20491:55;20577:19;20572:2;20567:3;20563:12;20556:41;20623:2;20618:3;20614:12;20607:19;;20397:235;;;:::o;20638:376::-;;20801:67;20865:2;20860:3;20801:67;:::i;:::-;20794:74;;20898:34;20894:1;20889:3;20885:11;20878:55;20964:14;20959:2;20954:3;20950:12;20943:36;21005:2;21000:3;20996:12;20989:19;;20784:230;;;:::o;21020:380::-;;21183:67;21247:2;21242:3;21183:67;:::i;:::-;21176:74;;21280:34;21276:1;21271:3;21267:11;21260:55;21346:18;21341:2;21336:3;21332:12;21325:40;21391:2;21386:3;21382:12;21375:19;;21166:234;;;:::o;21406:321::-;;21569:67;21633:2;21628:3;21569:67;:::i;:::-;21562:74;;21666:25;21662:1;21657:3;21653:11;21646:46;21718:2;21713:3;21709:12;21702:19;;21552:175;;;:::o;21733:108::-;21810:24;21828:5;21810:24;:::i;:::-;21805:3;21798:37;21788:53;;:::o;21847:118::-;21934:24;21952:5;21934:24;:::i;:::-;21929:3;21922:37;21912:53;;:::o;21971:435::-;;22173:95;22264:3;22255:6;22173:95;:::i;:::-;22166:102;;22285:95;22376:3;22367:6;22285:95;:::i;:::-;22278:102;;22397:3;22390:10;;22155:251;;;;;:::o;22412:222::-;;22543:2;22532:9;22528:18;22520:26;;22556:71;22624:1;22613:9;22609:17;22600:6;22556:71;:::i;:::-;22510:124;;;;:::o;22640:640::-;;22873:3;22862:9;22858:19;22850:27;;22887:71;22955:1;22944:9;22940:17;22931:6;22887:71;:::i;:::-;22968:72;23036:2;23025:9;23021:18;23012:6;22968:72;:::i;:::-;23050;23118:2;23107:9;23103:18;23094:6;23050:72;:::i;:::-;23169:9;23163:4;23159:20;23154:2;23143:9;23139:18;23132:48;23197:76;23268:4;23259:6;23197:76;:::i;:::-;23189:84;;22840:440;;;;;;;:::o;23286:373::-;;23467:2;23456:9;23452:18;23444:26;;23516:9;23510:4;23506:20;23502:1;23491:9;23487:17;23480:47;23544:108;23647:4;23638:6;23544:108;:::i;:::-;23536:116;;23434:225;;;;:::o;23665:210::-;;23790:2;23779:9;23775:18;23767:26;;23803:65;23865:1;23854:9;23850:17;23841:6;23803:65;:::i;:::-;23757:118;;;;:::o;23881:313::-;;24032:2;24021:9;24017:18;24009:26;;24081:9;24075:4;24071:20;24067:1;24056:9;24052:17;24045:47;24109:78;24182:4;24173:6;24109:78;:::i;:::-;24101:86;;23999:195;;;;:::o;24200:419::-;;24404:2;24393:9;24389:18;24381:26;;24453:9;24447:4;24443:20;24439:1;24428:9;24424:17;24417:47;24481:131;24607:4;24481:131;:::i;:::-;24473:139;;24371:248;;;:::o;24625:419::-;;24829:2;24818:9;24814:18;24806:26;;24878:9;24872:4;24868:20;24864:1;24853:9;24849:17;24842:47;24906:131;25032:4;24906:131;:::i;:::-;24898:139;;24796:248;;;:::o;25050:419::-;;25254:2;25243:9;25239:18;25231:26;;25303:9;25297:4;25293:20;25289:1;25278:9;25274:17;25267:47;25331:131;25457:4;25331:131;:::i;:::-;25323:139;;25221:248;;;:::o;25475:419::-;;25679:2;25668:9;25664:18;25656:26;;25728:9;25722:4;25718:20;25714:1;25703:9;25699:17;25692:47;25756:131;25882:4;25756:131;:::i;:::-;25748:139;;25646:248;;;:::o;25900:419::-;;26104:2;26093:9;26089:18;26081:26;;26153:9;26147:4;26143:20;26139:1;26128:9;26124:17;26117:47;26181:131;26307:4;26181:131;:::i;:::-;26173:139;;26071:248;;;:::o;26325:419::-;;26529:2;26518:9;26514:18;26506:26;;26578:9;26572:4;26568:20;26564:1;26553:9;26549:17;26542:47;26606:131;26732:4;26606:131;:::i;:::-;26598:139;;26496:248;;;:::o;26750:419::-;;26954:2;26943:9;26939:18;26931:26;;27003:9;26997:4;26993:20;26989:1;26978:9;26974:17;26967:47;27031:131;27157:4;27031:131;:::i;:::-;27023:139;;26921:248;;;:::o;27175:419::-;;27379:2;27368:9;27364:18;27356:26;;27428:9;27422:4;27418:20;27414:1;27403:9;27399:17;27392:47;27456:131;27582:4;27456:131;:::i;:::-;27448:139;;27346:248;;;:::o;27600:419::-;;27804:2;27793:9;27789:18;27781:26;;27853:9;27847:4;27843:20;27839:1;27828:9;27824:17;27817:47;27881:131;28007:4;27881:131;:::i;:::-;27873:139;;27771:248;;;:::o;28025:419::-;;28229:2;28218:9;28214:18;28206:26;;28278:9;28272:4;28268:20;28264:1;28253:9;28249:17;28242:47;28306:131;28432:4;28306:131;:::i;:::-;28298:139;;28196:248;;;:::o;28450:419::-;;28654:2;28643:9;28639:18;28631:26;;28703:9;28697:4;28693:20;28689:1;28678:9;28674:17;28667:47;28731:131;28857:4;28731:131;:::i;:::-;28723:139;;28621:248;;;:::o;28875:419::-;;29079:2;29068:9;29064:18;29056:26;;29128:9;29122:4;29118:20;29114:1;29103:9;29099:17;29092:47;29156:131;29282:4;29156:131;:::i;:::-;29148:139;;29046:248;;;:::o;29300:419::-;;29504:2;29493:9;29489:18;29481:26;;29553:9;29547:4;29543:20;29539:1;29528:9;29524:17;29517:47;29581:131;29707:4;29581:131;:::i;:::-;29573:139;;29471:248;;;:::o;29725:419::-;;29929:2;29918:9;29914:18;29906:26;;29978:9;29972:4;29968:20;29964:1;29953:9;29949:17;29942:47;30006:131;30132:4;30006:131;:::i;:::-;29998:139;;29896:248;;;:::o;30150:419::-;;30354:2;30343:9;30339:18;30331:26;;30403:9;30397:4;30393:20;30389:1;30378:9;30374:17;30367:47;30431:131;30557:4;30431:131;:::i;:::-;30423:139;;30321:248;;;:::o;30575:419::-;;30779:2;30768:9;30764:18;30756:26;;30828:9;30822:4;30818:20;30814:1;30803:9;30799:17;30792:47;30856:131;30982:4;30856:131;:::i;:::-;30848:139;;30746:248;;;:::o;31000:419::-;;31204:2;31193:9;31189:18;31181:26;;31253:9;31247:4;31243:20;31239:1;31228:9;31224:17;31217:47;31281:131;31407:4;31281:131;:::i;:::-;31273:139;;31171:248;;;:::o;31425:419::-;;31629:2;31618:9;31614:18;31606:26;;31678:9;31672:4;31668:20;31664:1;31653:9;31649:17;31642:47;31706:131;31832:4;31706:131;:::i;:::-;31698:139;;31596:248;;;:::o;31850:419::-;;32054:2;32043:9;32039:18;32031:26;;32103:9;32097:4;32093:20;32089:1;32078:9;32074:17;32067:47;32131:131;32257:4;32131:131;:::i;:::-;32123:139;;32021:248;;;:::o;32275:419::-;;32479:2;32468:9;32464:18;32456:26;;32528:9;32522:4;32518:20;32514:1;32503:9;32499:17;32492:47;32556:131;32682:4;32556:131;:::i;:::-;32548:139;;32446:248;;;:::o;32700:419::-;;32904:2;32893:9;32889:18;32881:26;;32953:9;32947:4;32943:20;32939:1;32928:9;32924:17;32917:47;32981:131;33107:4;32981:131;:::i;:::-;32973:139;;32871:248;;;:::o;33125:419::-;;33329:2;33318:9;33314:18;33306:26;;33378:9;33372:4;33368:20;33364:1;33353:9;33349:17;33342:47;33406:131;33532:4;33406:131;:::i;:::-;33398:139;;33296:248;;;:::o;33550:419::-;;33754:2;33743:9;33739:18;33731:26;;33803:9;33797:4;33793:20;33789:1;33778:9;33774:17;33767:47;33831:131;33957:4;33831:131;:::i;:::-;33823:139;;33721:248;;;:::o;33975:419::-;;34179:2;34168:9;34164:18;34156:26;;34228:9;34222:4;34218:20;34214:1;34203:9;34199:17;34192:47;34256:131;34382:4;34256:131;:::i;:::-;34248:139;;34146:248;;;:::o;34400:419::-;;34604:2;34593:9;34589:18;34581:26;;34653:9;34647:4;34643:20;34639:1;34628:9;34624:17;34617:47;34681:131;34807:4;34681:131;:::i;:::-;34673:139;;34571:248;;;:::o;34825:419::-;;35029:2;35018:9;35014:18;35006:26;;35078:9;35072:4;35068:20;35064:1;35053:9;35049:17;35042:47;35106:131;35232:4;35106:131;:::i;:::-;35098:139;;34996:248;;;:::o;35250:419::-;;35454:2;35443:9;35439:18;35431:26;;35503:9;35497:4;35493:20;35489:1;35478:9;35474:17;35467:47;35531:131;35657:4;35531:131;:::i;:::-;35523:139;;35421:248;;;:::o;35675:419::-;;35879:2;35868:9;35864:18;35856:26;;35928:9;35922:4;35918:20;35914:1;35903:9;35899:17;35892:47;35956:131;36082:4;35956:131;:::i;:::-;35948:139;;35846:248;;;:::o;36100:419::-;;36304:2;36293:9;36289:18;36281:26;;36353:9;36347:4;36343:20;36339:1;36328:9;36324:17;36317:47;36381:131;36507:4;36381:131;:::i;:::-;36373:139;;36271:248;;;:::o;36525:419::-;;36729:2;36718:9;36714:18;36706:26;;36778:9;36772:4;36768:20;36764:1;36753:9;36749:17;36742:47;36806:131;36932:4;36806:131;:::i;:::-;36798:139;;36696:248;;;:::o;36950:419::-;;37154:2;37143:9;37139:18;37131:26;;37203:9;37197:4;37193:20;37189:1;37178:9;37174:17;37167:47;37231:131;37357:4;37231:131;:::i;:::-;37223:139;;37121:248;;;:::o;37375:222::-;;37506:2;37495:9;37491:18;37483:26;;37519:71;37587:1;37576:9;37572:17;37563:6;37519:71;:::i;:::-;37473:124;;;;:::o;37603:283::-;;37669:2;37663:9;37653:19;;37711:4;37703:6;37699:17;37818:6;37806:10;37803:22;37782:18;37770:10;37767:34;37764:62;37761:2;;;37829:18;;:::i;:::-;37761:2;37869:10;37865:2;37858:22;37643:243;;;;:::o;37892:311::-;;38059:18;38051:6;38048:30;38045:2;;;38081:18;;:::i;:::-;38045:2;38131:4;38123:6;38119:17;38111:25;;38191:4;38185;38181:15;38173:23;;37974:229;;;:::o;38209:331::-;;38360:18;38352:6;38349:30;38346:2;;;38382:18;;:::i;:::-;38346:2;38467:4;38463:9;38456:4;38448:6;38444:17;38440:33;38432:41;;38528:4;38522;38518:15;38510:23;;38275:265;;;:::o;38546:332::-;;38698:18;38690:6;38687:30;38684:2;;;38720:18;;:::i;:::-;38684:2;38805:4;38801:9;38794:4;38786:6;38782:17;38778:33;38770:41;;38866:4;38860;38856:15;38848:23;;38613:265;;;:::o;38884:132::-;;38974:3;38966:11;;39004:4;38999:3;38995:14;38987:22;;38956:60;;;:::o;39022:114::-;;39123:5;39117:12;39107:22;;39096:40;;;:::o;39142:98::-;;39227:5;39221:12;39211:22;;39200:40;;;:::o;39246:99::-;;39332:5;39326:12;39316:22;;39305:40;;;:::o;39351:113::-;;39453:4;39448:3;39444:14;39436:22;;39426:38;;;:::o;39470:184::-;;39603:6;39598:3;39591:19;39643:4;39638:3;39634:14;39619:29;;39581:73;;;;:::o;39660:168::-;;39777:6;39772:3;39765:19;39817:4;39812:3;39808:14;39793:29;;39755:73;;;;:::o;39834:169::-;;39952:6;39947:3;39940:19;39992:4;39987:3;39983:14;39968:29;;39930:73;;;;:::o;40009:148::-;;40148:3;40133:18;;40123:34;;;;:::o;40163:305::-;;40222:20;40240:1;40222:20;:::i;:::-;40217:25;;40256:20;40274:1;40256:20;:::i;:::-;40251:25;;40410:1;40342:66;40338:74;40335:1;40332:81;40329:2;;;40416:18;;:::i;:::-;40329:2;40460:1;40457;40453:9;40446:16;;40207:261;;;;:::o;40474:185::-;;40531:20;40549:1;40531:20;:::i;:::-;40526:25;;40565:20;40583:1;40565:20;:::i;:::-;40560:25;;40604:1;40594:2;;40609:18;;:::i;:::-;40594:2;40651:1;40648;40644:9;40639:14;;40516:143;;;;:::o;40665:348::-;;40728:20;40746:1;40728:20;:::i;:::-;40723:25;;40762:20;40780:1;40762:20;:::i;:::-;40757:25;;40950:1;40882:66;40878:74;40875:1;40872:81;40867:1;40860:9;40853:17;40849:105;40846:2;;;40957:18;;:::i;:::-;40846:2;41005:1;41002;40998:9;40987:20;;40713:300;;;;:::o;41019:191::-;;41079:20;41097:1;41079:20;:::i;:::-;41074:25;;41113:20;41131:1;41113:20;:::i;:::-;41108:25;;41152:1;41149;41146:8;41143:2;;;41157:18;;:::i;:::-;41143:2;41202:1;41199;41195:9;41187:17;;41064:146;;;;:::o;41216:96::-;;41282:24;41300:5;41282:24;:::i;:::-;41271:35;;41261:51;;;:::o;41318:90::-;;41395:5;41388:13;41381:21;41370:32;;41360:48;;;:::o;41414:149::-;;41490:66;41483:5;41479:78;41468:89;;41458:105;;;:::o;41569:126::-;;41646:42;41639:5;41635:54;41624:65;;41614:81;;;:::o;41701:77::-;;41767:5;41756:16;;41746:32;;;:::o;41784:154::-;41868:6;41863:3;41858;41845:30;41930:1;41921:6;41916:3;41912:16;41905:27;41835:103;;;:::o;41944:307::-;42012:1;42022:113;42036:6;42033:1;42030:13;42022:113;;;42121:1;42116:3;42112:11;42106:18;42102:1;42097:3;42093:11;42086:39;42058:2;42055:1;42051:10;42046:15;;42022:113;;;42153:6;42150:1;42147:13;42144:2;;;42233:1;42224:6;42219:3;42215:16;42208:27;42144:2;41993:258;;;;:::o;42257:320::-;;42338:1;42332:4;42328:12;42318:22;;42385:1;42379:4;42375:12;42406:18;42396:2;;42462:4;42454:6;42450:17;42440:27;;42396:2;42524;42516:6;42513:14;42493:18;42490:38;42487:2;;;42543:18;;:::i;:::-;42487:2;42308:269;;;;:::o;42583:233::-;;42645:24;42663:5;42645:24;:::i;:::-;42636:33;;42691:66;42684:5;42681:77;42678:2;;;42761:18;;:::i;:::-;42678:2;42808:1;42801:5;42797:13;42790:20;;42626:190;;;:::o;42822:176::-;;42871:20;42889:1;42871:20;:::i;:::-;42866:25;;42905:20;42923:1;42905:20;:::i;:::-;42900:25;;42944:1;42934:2;;42949:18;;:::i;:::-;42934:2;42990:1;42987;42983:9;42978:14;;42856:142;;;;:::o;43004:180::-;43052:77;43049:1;43042:88;43149:4;43146:1;43139:15;43173:4;43170:1;43163:15;43190:180;43238:77;43235:1;43228:88;43335:4;43332:1;43325:15;43359:4;43356:1;43349:15;43376:180;43424:77;43421:1;43414:88;43521:4;43518:1;43511:15;43545:4;43542:1;43535:15;43562:180;43610:77;43607:1;43600:88;43707:4;43704:1;43697:15;43731:4;43728:1;43721:15;43748:102;;43840:2;43836:7;43831:2;43824:5;43820:14;43816:28;43806:38;;43796:54;;;:::o;43856:122::-;43929:24;43947:5;43929:24;:::i;:::-;43922:5;43919:35;43909:2;;43968:1;43965;43958:12;43909:2;43899:79;:::o;43984:116::-;44054:21;44069:5;44054:21;:::i;:::-;44047:5;44044:32;44034:2;;44090:1;44087;44080:12;44034:2;44024:76;:::o;44106:120::-;44178:23;44195:5;44178:23;:::i;:::-;44171:5;44168:34;44158:2;;44216:1;44213;44206:12;44158:2;44148:78;:::o;44232:122::-;44305:24;44323:5;44305:24;:::i;:::-;44298:5;44295:35;44285:2;;44344:1;44341;44334:12;44285:2;44275:79;:::o

Swarm Source

ipfs://04f35cf69ed11ff14cb6694be49ddacfac176a0c59f538e9c1a03969ec6ba3ac
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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