Contract 0xed280a922184cd7bd6634cfe902f433684557439

Contract Overview

Balance:
0 BNB
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x1fec5de8c7d6e975d9bef325c44c1180eae9c58739a0a3ba631f939c1e8787f2Withdraw144222142021-11-25 12:46:4310 days 18 hrs ago0x10b24a9052ed5c05c5c8ec05db7685d1682ad802 IN  0xed280a922184cd7bd6634cfe902f4336845574390 BNB0.00029725
0xdca9c284ab1d7c98604f1d6f1245ab4357477a4b7537ca7b5fcb700b6669232dMint B City144222022021-11-25 12:46:0710 days 18 hrs ago0x82009e723de38fd5bbee36b6a13d2c1bb6fde1c0 IN  0xed280a922184cd7bd6634cfe902f4336845574390.25 BNB0.00150922
0x96f27650fec1a706368cf63d9f5353a5c5343791be1b11533a4be0f2cd3c9fb6Mint B City144213402021-11-25 12:03:0110 days 19 hrs ago0x82009e723de38fd5bbee36b6a13d2c1bb6fde1c0 IN  0xed280a922184cd7bd6634cfe902f4336845574390.25 BNB0.00150922
0x591e472ab19d4d6d8e85c8d7146e33b79581f30209da0aab4932d98d3a4ce74dMint B City144213292021-11-25 12:02:2810 days 19 hrs ago0x82009e723de38fd5bbee36b6a13d2c1bb6fde1c0 IN  0xed280a922184cd7bd6634cfe902f4336845574390.25 BNB0.00150922
0xb7e677c937379a7c67c442ae82aeacf6025186fa2da9cda3ff2f6c3c941340f1Mint B City144213192021-11-25 12:01:5810 days 19 hrs ago0x82009e723de38fd5bbee36b6a13d2c1bb6fde1c0 IN  0xed280a922184cd7bd6634cfe902f4336845574390.25 BNB0.00150922
0xd9c426e1d8c9fe480dbf284c7c38efadda1f594c976ee1896c6213adeeb28055Mint B City144213172021-11-25 12:01:5210 days 19 hrs ago0x82009e723de38fd5bbee36b6a13d2c1bb6fde1c0 IN  0xed280a922184cd7bd6634cfe902f4336845574390.25 BNB0.00150922
0xa117084b02465103e8af0a0702d9b504c3daf0ace8674e028edc27023ea1dceeMint B City144213142021-11-25 12:01:4310 days 19 hrs ago0x82009e723de38fd5bbee36b6a13d2c1bb6fde1c0 IN  0xed280a922184cd7bd6634cfe902f4336845574390.25 BNB0.00150922
0x2c14a12a8e9a4729501d3d96101905a35e790afad8901d0085476fa37ae9d9f9Mint B City144213122021-11-25 12:01:3710 days 19 hrs ago0x82009e723de38fd5bbee36b6a13d2c1bb6fde1c0 IN  0xed280a922184cd7bd6634cfe902f4336845574390.25 BNB0.00146722
0xdc397598ab01883f412def47c347bc95b81410080c5cf7f432bfad2f9c0d1742Mint B City144212882021-11-25 12:00:2510 days 19 hrs ago0x10b24a9052ed5c05c5c8ec05db7685d1682ad802 IN  0xed280a922184cd7bd6634cfe902f4336845574390.25 BNB0.00150922
0xe988b05dc43063e56db941d95c5db0c787fbdd05a414c75a6831a5d65c595669Unpause144212802021-11-25 12:00:0110 days 19 hrs ago0x10b24a9052ed5c05c5c8ec05db7685d1682ad802 IN  0xed280a922184cd7bd6634cfe902f4336845574390 BNB0.00030369
0xf317f9f81a935cbc3fd19a6449ee3bce4676ea20edf1f2cd1025d92e6da936c7Claim88NFT144211982021-11-25 11:55:5510 days 19 hrs ago0x10b24a9052ed5c05c5c8ec05db7685d1682ad802 IN  0xed280a922184cd7bd6634cfe902f4336845574390 BNB0.10045882
0x2caa236c11708a30a8d3e270579e26cb3b585b4be52f1304dac3c01d3614fd490x60806040144207942021-11-25 11:35:4310 days 20 hrs ago0x10b24a9052ed5c05c5c8ec05db7685d1682ad802 IN  Contract Creation0 BNB0.04011985
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0x1fec5de8c7d6e975d9bef325c44c1180eae9c58739a0a3ba631f939c1e8787f2144222142021-11-25 12:46:4310 days 18 hrs ago 0xed280a922184cd7bd6634cfe902f4336845574390x10b24a9052ed5c05c5c8ec05db7685d1682ad8022 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BigCities

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-11-25
*/

//.....................................................................................
//.BBBBBBBBBB...iiii...................CCCCCCC....iiii..ttt..iiii......................
//.BBBBBBBBBBB..iiii..................CCCCCCCCC...iiii.tttt..iiii......................
//.BBBBBBBBBBB.......................CCCCCCCCCCC.......tttt............................
//.BBBB...BBBB..iiii..ggggggggg......CCCC...CCCCC.iiiiittttttiiii..eeeeee...essssss....
//.BBBB...BBBB..iiii.gggggggggg..... CCC.....CCC..iiiiittttttiiii.eeeeeeee.eesssssss...
//.BBBBBBBBBBB..iiiiigggg.ggggg..... CCC..........iiii.tttt..iiiiieee.eeee.eess.ssss...
//.BBBBBBBBBB...iiiiiggg...gggg..... CCC..........iiii.tttt..iiiiieee..eeeeeesss.......
//.BBBBBBBBBBB..iiiiiggg...gggg..... CCC..........iiii.tttt..iiiiieeeeeeeee.esssss.....
//.BBBB....BBBB.iiiiiggg...gggg..... CCC.....CCC..iiii.tttt..iiiiieeeeeeeee..sssssss...
//.BBBB....BBBB.iiiiiggg...gggg......CCCC...CCCCC.iiii.tttt..iiiiieee............ssss..
//.BBBBBBBBBBBB.iiiiigggg.ggggg......CCCCCCCCCCC..iiii.tttt..iiiiieee..eeeeeess..ssss..
//.BBBBBBBBBBB..iiii.gggggggggg.......CCCCCCCCCC..iiii.ttttttiiii.eeeeeeee.eesssssss...
//.BBBBBBBBBB...iiii..ggggggggg........CCCCCCC....iiii.ttttttiiii..eeeeee....ssssss....
//.........................gggg........................................................
//..................igggg.gggg.........................................................
//...................ggggggggg.........................................................
//....................ggggggg..........................................................
//.....................................................................................
                             
// contracts/BCITY.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity >0.8.6;


/**
 * @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);
}

/**
 * @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;
}



/**
 * @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);
}


/**
 * @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);
}


/**
 * @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;
        // solhint-disable-next-line no-inline-assembly
        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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


/*
 * @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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}


/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

}


/**
 * @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;
    }
}



/**
 * @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}. 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 {
                    // solhint-disable-next-line no-inline-assembly
                    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` 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 { }
}




/**
 * @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);
}


/**
 * @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();
    }
}



/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented or decremented by one. 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;
        }
    }
}



/**
 * @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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


// 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. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * 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;
        }
    }
}


/**
 * @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());
    }
}

contract BigCities is ERC721Enumerable, Ownable, Pausable  {
    using Strings for uint256;
    using SafeMath for uint256;

    // Optional mapping for token URIs
    mapping (uint256 => string) private _tokenURIs;

    // Base URI
    string private _baseURIextended;

    // Prices
    uint256 private _price1extended;

    using Counters for Counters.Counter;
    Counters.Counter private _tokenIdentifiers;

    uint256 public constant MAX_NFT_SUPPLY = 4444;
    uint256 public constant MARKETING_TEAM_NFT = 88;

    constructor() ERC721("BigCities", "BCITY") {
        _baseURIextended = "https://bsccities.com/metadata/";

        // 0.25 BNB
        _price1extended = 250000000000000000;

        super._pause();
    }

    function getNFTBalance(address _owner) public view returns (uint256) {
       return ERC721.balanceOf(_owner);
    }

    /**
     * @dev Gets current Price
     */
    function getNFTPrice() public view returns (uint256) {
        require(totalSupply() < MAX_NFT_SUPPLY, "Sale has already ended");
        return _price1extended;
    }

   /**
    * @dev Mints NFT For Free
    */
    function claimNFT() public onlyOwner {
        require(totalSupply() < MAX_NFT_SUPPLY, "Sale has already ended");
        require(totalSupply() < MARKETING_TEAM_NFT, "88 BigCities for the team for marketing");

        // Incrementing ID to create new tokenn
        _tokenIdentifiers.increment();
        uint256 newRECIdentifier = _tokenIdentifiers.current();

        _safeMint(msg.sender, newRECIdentifier);
    }

   /**
    * @dev Mints 88 NFT For Free for marketing
    */
    function claim88NFT() public onlyOwner {
        require(totalSupply().add(MARKETING_TEAM_NFT) <= MAX_NFT_SUPPLY, "Exceeds max nft supply");

        for (uint i = 0; i < MARKETING_TEAM_NFT; i++) {
            // Incrementing ID to create new tokenn
            _tokenIdentifiers.increment();
            uint256 newRECIdentifier = _tokenIdentifiers.current();
            _safeMint(msg.sender, newRECIdentifier);
        }
    }

   /**
    * @dev Mints 1 Big City
    */
    function mintBCity() public payable whenNotPaused {
        require(totalSupply() < MAX_NFT_SUPPLY, "Sale has already ended");
        require(getNFTPrice() == msg.value, "BNB value sent is not correct");

        // Incrementing ID to create new token
        _tokenIdentifiers.increment();
        uint256 newRECIdentifier = _tokenIdentifiers.current();

        _safeMint(msg.sender, newRECIdentifier);
    }

    /**
     * @dev Withdraw bnb from this contract (Callable by owner)
    */
    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        address payable ownerAddress = payable(msg.sender);
        ownerAddress.transfer(balance);
    }

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Return the base URI
     */
    function _baseURI() internal view virtual override returns (string memory) {
        return _baseURIextended;
    }

    /**
     * @dev Set the base URI
     */
    function setBaseURI(string memory baseURI_) external onlyOwner() {
        _baseURIextended = baseURI_;
    }

    /**
     * @dev Return the price 1
     */
    function _price1() public view returns (uint256) {
        return _price1extended;
    }

    /**
     * @dev Set the price 1
     */
    function setPrice1(uint256 _price1extended_) external onlyOwner() {
        _price1extended = _price1extended_;
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

   /**
    * @dev Pause
    */
    function pause() external virtual onlyOwner() {
        super._pause();
    }

   /**
    * @dev Unpause
    */
    function unpause() external virtual onlyOwner() {
        super._unpause();
    }
}

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":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"},{"inputs":[],"name":"MARKETING_TEAM_NFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_NFT_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_price1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim88NFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimNFT","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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getNFTBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNFTPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintBCity","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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":"_price1extended_","type":"uint256"}],"name":"setPrice1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280600981526020017f42696743697469657300000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f4243495459000000000000000000000000000000000000000000000000000000815250816000908051906020019062000096929190620002cd565b508060019080519060200190620000af929190620002cd565b5050506000620000c4620001f660201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506000600a60146101000a81548160ff0219169083151502179055506040518060400160405280601f81526020017f68747470733a2f2f6273636369746965732e636f6d2f6d657461646174612f00815250600c9080519060200190620001cb929190620002cd565b506703782dace9d90000600d81905550620001f0620001fe60201b62001b7e1760201c565b620004c7565b600033905090565b6200020e620002b660201b60201c565b1562000251576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200024890620003de565b60405180910390fd5b6001600a60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586200029d620001f660201b60201c565b604051620002ac919062000445565b60405180910390a1565b6000600a60149054906101000a900460ff16905090565b828054620002db9062000491565b90600052602060002090601f016020900481019282620002ff57600085556200034b565b82601f106200031a57805160ff19168380011785556200034b565b828001600101855582156200034b579182015b828111156200034a5782518255916020019190600101906200032d565b5b5090506200035a91906200035e565b5090565b5b80821115620003795760008160009055506001016200035f565b5090565b600082825260208201905092915050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000620003c66010836200037d565b9150620003d3826200038e565b602082019050919050565b60006020820190508181036000830152620003f981620003b7565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200042d8262000400565b9050919050565b6200043f8162000420565b82525050565b60006020820190506200045c600083018462000434565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004aa57607f821691505b60208210811415620004c157620004c062000462565b5b50919050565b6145ae80620004d76000396000f3fe6080604052600436106101ee5760003560e01c806370a082311161010d578063aa705f94116100a0578063c87b56dd1161006f578063c87b56dd1461069f578063e985e9c5146106dc578063f2fde38b14610719578063f44e41ee14610742578063fb107a4f1461074c576101ee565b8063aa705f94146105f7578063b5077f441461060e578063b88d4fde14610639578063bf8ebd8514610662576101ee565b80638da5cb5b116100dc5780638da5cb5b1461054d57806395d89b4114610578578063a22cb465146105a3578063a691e1a7146105cc576101ee565b806370a08231146104b9578063715018a6146104f65780637316453e1461050d5780638456cb5914610536576101ee565b80633ccfd60b1161018557806355f804b31161015457806355f804b3146104115780635c975abb1461043a5780636352211e14610465578063672756ad146104a2576101ee565b80633ccfd60b1461037d5780633f4ba83a1461039457806342842e0e146103ab5780634f6ccce7146103d4576101ee565b80630bfc1ac8116101c15780630bfc1ac8146102c157806318160ddd146102ec57806323b872dd146103175780632f745c5914610340576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190612eb6565b610777565b6040516102279190612efe565b60405180910390f35b34801561023c57600080fd5b506102456107f1565b6040516102529190612fb2565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d919061300a565b610883565b60405161028f9190613078565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba91906130bf565b610908565b005b3480156102cd57600080fd5b506102d6610a20565b6040516102e3919061310e565b60405180910390f35b3480156102f857600080fd5b50610301610a2a565b60405161030e919061310e565b60405180910390f35b34801561032357600080fd5b5061033e60048036038101906103399190613129565b610a37565b005b34801561034c57600080fd5b50610367600480360381019061036291906130bf565b610a97565b604051610374919061310e565b60405180910390f35b34801561038957600080fd5b50610392610b3c565b005b3480156103a057600080fd5b506103a9610c0d565b005b3480156103b757600080fd5b506103d260048036038101906103cd9190613129565b610c93565b005b3480156103e057600080fd5b506103fb60048036038101906103f6919061300a565b610cb3565b604051610408919061310e565b60405180910390f35b34801561041d57600080fd5b50610438600480360381019061043391906132b1565b610d24565b005b34801561044657600080fd5b5061044f610dba565b60405161045c9190612efe565b60405180910390f35b34801561047157600080fd5b5061048c6004803603810190610487919061300a565b610dd1565b6040516104999190613078565b60405180910390f35b3480156104ae57600080fd5b506104b7610e83565b005b3480156104c557600080fd5b506104e060048036038101906104db91906132fa565b610fb9565b6040516104ed919061310e565b60405180910390f35b34801561050257600080fd5b5061050b611071565b005b34801561051957600080fd5b50610534600480360381019061052f919061300a565b6111ae565b005b34801561054257600080fd5b5061054b611234565b005b34801561055957600080fd5b506105626112ba565b60405161056f9190613078565b60405180910390f35b34801561058457600080fd5b5061058d6112e4565b60405161059a9190612fb2565b60405180910390f35b3480156105af57600080fd5b506105ca60048036038101906105c59190613353565b611376565b005b3480156105d857600080fd5b506105e16114f7565b6040516105ee919061310e565b60405180910390f35b34801561060357600080fd5b5061060c6114fc565b005b34801561061a57600080fd5b5061062361161c565b604051610630919061310e565b60405180910390f35b34801561064557600080fd5b50610660600480360381019061065b9190613434565b611622565b005b34801561066e57600080fd5b50610689600480360381019061068491906132fa565b611684565b604051610696919061310e565b60405180910390f35b3480156106ab57600080fd5b506106c660048036038101906106c1919061300a565b611696565b6040516106d39190612fb2565b60405180910390f35b3480156106e857600080fd5b5061070360048036038101906106fe91906134b7565b6117e8565b6040516107109190612efe565b60405180910390f35b34801561072557600080fd5b50610740600480360381019061073b91906132fa565b61187c565b005b61074a611a28565b005b34801561075857600080fd5b50610761611b29565b60405161076e919061310e565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107ea57506107e982611c21565b5b9050919050565b60606000805461080090613526565b80601f016020809104026020016040519081016040528092919081815260200182805461082c90613526565b80156108795780601f1061084e57610100808354040283529160200191610879565b820191906000526020600020905b81548152906001019060200180831161085c57829003601f168201915b5050505050905090565b600061088e82611d03565b6108cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c4906135ca565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061091382610dd1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610984576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097b9061365c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109a3611d6f565b73ffffffffffffffffffffffffffffffffffffffff1614806109d257506109d1816109cc611d6f565b6117e8565b5b610a11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a08906136ee565b60405180910390fd5b610a1b8383611d77565b505050565b6000600d54905090565b6000600880549050905090565b610a48610a42611d6f565b82611e30565b610a87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7e90613780565b60405180910390fd5b610a92838383611f0e565b505050565b6000610aa283610fb9565b8210610ae3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ada90613812565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610b44611d6f565b73ffffffffffffffffffffffffffffffffffffffff16610b626112ba565b73ffffffffffffffffffffffffffffffffffffffff1614610bb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610baf9061387e565b60405180910390fd5b600047905060003390508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015610c08573d6000803e3d6000fd5b505050565b610c15611d6f565b73ffffffffffffffffffffffffffffffffffffffff16610c336112ba565b73ffffffffffffffffffffffffffffffffffffffff1614610c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c809061387e565b60405180910390fd5b610c9161216a565b565b610cae83838360405180602001604052806000815250611622565b505050565b6000610cbd610a2a565b8210610cfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf590613910565b60405180910390fd5b60088281548110610d1257610d11613930565b5b90600052602060002001549050919050565b610d2c611d6f565b73ffffffffffffffffffffffffffffffffffffffff16610d4a6112ba565b73ffffffffffffffffffffffffffffffffffffffff1614610da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d979061387e565b60405180910390fd5b80600c9080519060200190610db6929190612da7565b5050565b6000600a60149054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e71906139d1565b60405180910390fd5b80915050919050565b610e8b611d6f565b73ffffffffffffffffffffffffffffffffffffffff16610ea96112ba565b73ffffffffffffffffffffffffffffffffffffffff1614610eff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef69061387e565b60405180910390fd5b61115c610f0a610a2a565b10610f4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4190613a3d565b60405180910390fd5b6058610f54610a2a565b10610f94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8b90613acf565b60405180910390fd5b610f9e600e61220c565b6000610faa600e612222565b9050610fb63382612230565b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561102a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102190613b61565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611079611d6f565b73ffffffffffffffffffffffffffffffffffffffff166110976112ba565b73ffffffffffffffffffffffffffffffffffffffff16146110ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e49061387e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6111b6611d6f565b73ffffffffffffffffffffffffffffffffffffffff166111d46112ba565b73ffffffffffffffffffffffffffffffffffffffff161461122a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112219061387e565b60405180910390fd5b80600d8190555050565b61123c611d6f565b73ffffffffffffffffffffffffffffffffffffffff1661125a6112ba565b73ffffffffffffffffffffffffffffffffffffffff16146112b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a79061387e565b60405180910390fd5b6112b8611b7e565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546112f390613526565b80601f016020809104026020016040519081016040528092919081815260200182805461131f90613526565b801561136c5780601f106113415761010080835404028352916020019161136c565b820191906000526020600020905b81548152906001019060200180831161134f57829003601f168201915b5050505050905090565b61137e611d6f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e390613bcd565b60405180910390fd5b80600560006113f9611d6f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114a6611d6f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114eb9190612efe565b60405180910390a35050565b605881565b611504611d6f565b73ffffffffffffffffffffffffffffffffffffffff166115226112ba565b73ffffffffffffffffffffffffffffffffffffffff1614611578576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156f9061387e565b60405180910390fd5b61115c6115966058611588610a2a565b61224e90919063ffffffff16565b11156115d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ce90613c39565b60405180910390fd5b60005b6058811015611619576115ed600e61220c565b60006115f9600e612222565b90506116053382612230565b50808061161190613c88565b9150506115da565b50565b61115c81565b61163361162d611d6f565b83611e30565b611672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166990613780565b60405180910390fd5b61167e84848484612264565b50505050565b600061168f82610fb9565b9050919050565b60606116a182611d03565b6116e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d790613d43565b60405180910390fd5b6000600b6000848152602001908152602001600020805461170090613526565b80601f016020809104026020016040519081016040528092919081815260200182805461172c90613526565b80156117795780601f1061174e57610100808354040283529160200191611779565b820191906000526020600020905b81548152906001019060200180831161175c57829003601f168201915b50505050509050600061178a6122c0565b90506000815114156117a05781925050506117e3565b6000825111156117d55780826040516020016117bd929190613d9f565b604051602081830303815290604052925050506117e3565b6117de84612352565b925050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611884611d6f565b73ffffffffffffffffffffffffffffffffffffffff166118a26112ba565b73ffffffffffffffffffffffffffffffffffffffff16146118f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ef9061387e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611968576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195f90613e35565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611a30610dba565b15611a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6790613ea1565b60405180910390fd5b61115c611a7b610a2a565b10611abb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab290613a3d565b60405180910390fd5b34611ac4611b29565b14611b04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afb90613f0d565b60405180910390fd5b611b0e600e61220c565b6000611b1a600e612222565b9050611b263382612230565b50565b600061115c611b36610a2a565b10611b76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6d90613a3d565b60405180910390fd5b600d54905090565b611b86610dba565b15611bc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbd90613ea1565b60405180910390fd5b6001600a60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611c0a611d6f565b604051611c179190613078565b60405180910390a1565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611cec57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611cfc5750611cfb826123f9565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611dea83610dd1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611e3b82611d03565b611e7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7190613f9f565b60405180910390fd5b6000611e8583610dd1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ef457508373ffffffffffffffffffffffffffffffffffffffff16611edc84610883565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f055750611f0481856117e8565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f2e82610dd1565b73ffffffffffffffffffffffffffffffffffffffff1614611f84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7b90614031565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611feb906140c3565b60405180910390fd5b611fff838383612463565b61200a600082611d77565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461205a91906140e3565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120b19190614117565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612172610dba565b6121b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a8906141b9565b60405180910390fd5b6000600a60146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6121f5611d6f565b6040516122029190613078565b60405180910390a1565b6001816000016000828254019250508190555050565b600081600001549050919050565b61224a828260405180602001604052806000815250612577565b5050565b6000818361225c9190614117565b905092915050565b61226f848484611f0e565b61227b848484846125d2565b6122ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b19061424b565b60405180910390fd5b50505050565b6060600c80546122cf90613526565b80601f01602080910402602001604051908101604052809291908181526020018280546122fb90613526565b80156123485780601f1061231d57610100808354040283529160200191612348565b820191906000526020600020905b81548152906001019060200180831161232b57829003601f168201915b5050505050905090565b606061235d82611d03565b61239c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612393906142dd565b60405180910390fd5b60006123a66122c0565b905060008151116123c657604051806020016040528060008152506123f1565b806123d08461275a565b6040516020016123e1929190613d9f565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61246e8383836128bb565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124b1576124ac816128c0565b6124f0565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146124ef576124ee8382612909565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125335761252e81612a76565b612572565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612571576125708282612b47565b5b5b505050565b6125818383612bc6565b61258e60008484846125d2565b6125cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c49061424b565b60405180910390fd5b505050565b60006125f38473ffffffffffffffffffffffffffffffffffffffff16612d94565b1561274d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261261c611d6f565b8786866040518563ffffffff1660e01b815260040161263e9493929190614352565b6020604051808303816000875af192505050801561267a57506040513d601f19601f8201168201806040525081019061267791906143b3565b60015b6126fd573d80600081146126aa576040519150601f19603f3d011682016040523d82523d6000602084013e6126af565b606091505b506000815114156126f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ec9061424b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612752565b600190505b949350505050565b606060008214156127a2576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506128b6565b600082905060005b600082146127d45780806127bd90613c88565b915050600a826127cd919061440f565b91506127aa565b60008167ffffffffffffffff8111156127f0576127ef613186565b5b6040519080825280601f01601f1916602001820160405280156128225781602001600182028036833780820191505090505b5090505b600085146128af5760018261283b91906140e3565b9150600a8561284a9190614440565b60306128569190614117565b60f81b81838151811061286c5761286b613930565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128a8919061440f565b9450612826565b8093505050505b919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161291684610fb9565b61292091906140e3565b9050600060076000848152602001908152602001600020549050818114612a05576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612a8a91906140e3565b9050600060096000848152602001908152602001600020549050600060088381548110612aba57612ab9613930565b5b906000526020600020015490508060088381548110612adc57612adb613930565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612b2b57612b2a614471565b5b6001900381819060005260206000200160009055905550505050565b6000612b5283610fb9565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2d906144ec565b60405180910390fd5b612c3f81611d03565b15612c7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7690614558565b60405180910390fd5b612c8b60008383612463565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cdb9190614117565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612db390613526565b90600052602060002090601f016020900481019282612dd55760008555612e1c565b82601f10612dee57805160ff1916838001178555612e1c565b82800160010185558215612e1c579182015b82811115612e1b578251825591602001919060010190612e00565b5b509050612e299190612e2d565b5090565b5b80821115612e46576000816000905550600101612e2e565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612e9381612e5e565b8114612e9e57600080fd5b50565b600081359050612eb081612e8a565b92915050565b600060208284031215612ecc57612ecb612e54565b5b6000612eda84828501612ea1565b91505092915050565b60008115159050919050565b612ef881612ee3565b82525050565b6000602082019050612f136000830184612eef565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612f53578082015181840152602081019050612f38565b83811115612f62576000848401525b50505050565b6000601f19601f8301169050919050565b6000612f8482612f19565b612f8e8185612f24565b9350612f9e818560208601612f35565b612fa781612f68565b840191505092915050565b60006020820190508181036000830152612fcc8184612f79565b905092915050565b6000819050919050565b612fe781612fd4565b8114612ff257600080fd5b50565b60008135905061300481612fde565b92915050565b6000602082840312156130205761301f612e54565b5b600061302e84828501612ff5565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061306282613037565b9050919050565b61307281613057565b82525050565b600060208201905061308d6000830184613069565b92915050565b61309c81613057565b81146130a757600080fd5b50565b6000813590506130b981613093565b92915050565b600080604083850312156130d6576130d5612e54565b5b60006130e4858286016130aa565b92505060206130f585828601612ff5565b9150509250929050565b61310881612fd4565b82525050565b600060208201905061312360008301846130ff565b92915050565b60008060006060848603121561314257613141612e54565b5b6000613150868287016130aa565b9350506020613161868287016130aa565b925050604061317286828701612ff5565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6131be82612f68565b810181811067ffffffffffffffff821117156131dd576131dc613186565b5b80604052505050565b60006131f0612e4a565b90506131fc82826131b5565b919050565b600067ffffffffffffffff82111561321c5761321b613186565b5b61322582612f68565b9050602081019050919050565b82818337600083830152505050565b600061325461324f84613201565b6131e6565b9050828152602081018484840111156132705761326f613181565b5b61327b848285613232565b509392505050565b600082601f8301126132985761329761317c565b5b81356132a8848260208601613241565b91505092915050565b6000602082840312156132c7576132c6612e54565b5b600082013567ffffffffffffffff8111156132e5576132e4612e59565b5b6132f184828501613283565b91505092915050565b6000602082840312156133105761330f612e54565b5b600061331e848285016130aa565b91505092915050565b61333081612ee3565b811461333b57600080fd5b50565b60008135905061334d81613327565b92915050565b6000806040838503121561336a57613369612e54565b5b6000613378858286016130aa565b92505060206133898582860161333e565b9150509250929050565b600067ffffffffffffffff8211156133ae576133ad613186565b5b6133b782612f68565b9050602081019050919050565b60006133d76133d284613393565b6131e6565b9050828152602081018484840111156133f3576133f2613181565b5b6133fe848285613232565b509392505050565b600082601f83011261341b5761341a61317c565b5b813561342b8482602086016133c4565b91505092915050565b6000806000806080858703121561344e5761344d612e54565b5b600061345c878288016130aa565b945050602061346d878288016130aa565b935050604061347e87828801612ff5565b925050606085013567ffffffffffffffff81111561349f5761349e612e59565b5b6134ab87828801613406565b91505092959194509250565b600080604083850312156134ce576134cd612e54565b5b60006134dc858286016130aa565b92505060206134ed858286016130aa565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061353e57607f821691505b60208210811415613552576135516134f7565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006135b4602c83612f24565b91506135bf82613558565b604082019050919050565b600060208201905081810360008301526135e3816135a7565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613646602183612f24565b9150613651826135ea565b604082019050919050565b6000602082019050818103600083015261367581613639565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006136d8603883612f24565b91506136e38261367c565b604082019050919050565b60006020820190508181036000830152613707816136cb565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b600061376a603183612f24565b91506137758261370e565b604082019050919050565b600060208201905081810360008301526137998161375d565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006137fc602b83612f24565b9150613807826137a0565b604082019050919050565b6000602082019050818103600083015261382b816137ef565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613868602083612f24565b915061387382613832565b602082019050919050565b600060208201905081810360008301526138978161385b565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006138fa602c83612f24565b91506139058261389e565b604082019050919050565b60006020820190508181036000830152613929816138ed565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006139bb602983612f24565b91506139c68261395f565b604082019050919050565b600060208201905081810360008301526139ea816139ae565b9050919050565b7f53616c652068617320616c726561647920656e64656400000000000000000000600082015250565b6000613a27601683612f24565b9150613a32826139f1565b602082019050919050565b60006020820190508181036000830152613a5681613a1a565b9050919050565b7f38382042696743697469657320666f7220746865207465616d20666f72206d6160008201527f726b6574696e6700000000000000000000000000000000000000000000000000602082015250565b6000613ab9602783612f24565b9150613ac482613a5d565b604082019050919050565b60006020820190508181036000830152613ae881613aac565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613b4b602a83612f24565b9150613b5682613aef565b604082019050919050565b60006020820190508181036000830152613b7a81613b3e565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613bb7601983612f24565b9150613bc282613b81565b602082019050919050565b60006020820190508181036000830152613be681613baa565b9050919050565b7f45786365656473206d6178206e667420737570706c7900000000000000000000600082015250565b6000613c23601683612f24565b9150613c2e82613bed565b602082019050919050565b60006020820190508181036000830152613c5281613c16565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613c9382612fd4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613cc657613cc5613c59565b5b600182019050919050565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b6000613d2d603183612f24565b9150613d3882613cd1565b604082019050919050565b60006020820190508181036000830152613d5c81613d20565b9050919050565b600081905092915050565b6000613d7982612f19565b613d838185613d63565b9350613d93818560208601612f35565b80840191505092915050565b6000613dab8285613d6e565b9150613db78284613d6e565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613e1f602683612f24565b9150613e2a82613dc3565b604082019050919050565b60006020820190508181036000830152613e4e81613e12565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000613e8b601083612f24565b9150613e9682613e55565b602082019050919050565b60006020820190508181036000830152613eba81613e7e565b9050919050565b7f424e422076616c75652073656e74206973206e6f7420636f7272656374000000600082015250565b6000613ef7601d83612f24565b9150613f0282613ec1565b602082019050919050565b60006020820190508181036000830152613f2681613eea565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613f89602c83612f24565b9150613f9482613f2d565b604082019050919050565b60006020820190508181036000830152613fb881613f7c565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b600061401b602983612f24565b915061402682613fbf565b604082019050919050565b6000602082019050818103600083015261404a8161400e565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006140ad602483612f24565b91506140b882614051565b604082019050919050565b600060208201905081810360008301526140dc816140a0565b9050919050565b60006140ee82612fd4565b91506140f983612fd4565b92508282101561410c5761410b613c59565b5b828203905092915050565b600061412282612fd4565b915061412d83612fd4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561416257614161613c59565b5b828201905092915050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006141a3601483612f24565b91506141ae8261416d565b602082019050919050565b600060208201905081810360008301526141d281614196565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614235603283612f24565b9150614240826141d9565b604082019050919050565b6000602082019050818103600083015261426481614228565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006142c7602f83612f24565b91506142d28261426b565b604082019050919050565b600060208201905081810360008301526142f6816142ba565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614324826142fd565b61432e8185614308565b935061433e818560208601612f35565b61434781612f68565b840191505092915050565b60006080820190506143676000830187613069565b6143746020830186613069565b61438160408301856130ff565b81810360608301526143938184614319565b905095945050505050565b6000815190506143ad81612e8a565b92915050565b6000602082840312156143c9576143c8612e54565b5b60006143d78482850161439e565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061441a82612fd4565b915061442583612fd4565b925082614435576144346143e0565b5b828204905092915050565b600061444b82612fd4565b915061445683612fd4565b925082614466576144656143e0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006144d6602083612f24565b91506144e1826144a0565b602082019050919050565b60006020820190508181036000830152614505816144c9565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614542601c83612f24565b915061454d8261450c565b602082019050919050565b6000602082019050818103600083015261457181614535565b905091905056fea26469706673582212206e298a4b4c51b3703fe79ee904d96523487e48131e426a4a020a0025fe866eff64736f6c634300080a0033

Deployed ByteCode Sourcemap

53780:4893:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35037:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22465:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23925:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23462:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57785:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35690:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24815:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35358:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56440:194;;;;;;;;;;;;;:::i;:::-;;58587:83;;;;;;;;;;;;;:::i;:::-;;25191:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35880:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57616:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52594:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22159:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54941:426;;;;;;;;;;;;;:::i;:::-;;21889:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44061:148;;;;;;;;;;;;;:::i;:::-;;57930:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58464:79;;;;;;;;;;;;;:::i;:::-;;43410:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22634:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24218:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54265:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55439:438;;;;;;;;;;;;;:::i;:::-;;54213:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25413:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54540:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56705:679;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24584:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44364:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55930:420;;;:::i;:::-;;54716:170;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35037:237;35139:4;35178:35;35163:50;;;:11;:50;;;;:103;;;;35230:36;35254:11;35230:23;:36::i;:::-;35163:103;35156:110;;35037:237;;;:::o;22465:100::-;22519:13;22552:5;22545:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22465:100;:::o;23925:221::-;24001:7;24029:16;24037:7;24029;:16::i;:::-;24021:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24114:15;:24;24130:7;24114:24;;;;;;;;;;;;;;;;;;;;;24107:31;;23925:221;;;:::o;23462:397::-;23543:13;23559:23;23574:7;23559:14;:23::i;:::-;23543:39;;23607:5;23601:11;;:2;:11;;;;23593:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23687:5;23671:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23696:37;23713:5;23720:12;:10;:12::i;:::-;23696:16;:37::i;:::-;23671:62;23663:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;23830:21;23839:2;23843:7;23830:8;:21::i;:::-;23532:327;23462:397;;:::o;57785:90::-;57825:7;57852:15;;57845:22;;57785:90;:::o;35690:113::-;35751:7;35778:10;:17;;;;35771:24;;35690:113;:::o;24815:305::-;24976:41;24995:12;:10;:12::i;:::-;25009:7;24976:18;:41::i;:::-;24968:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25084:28;25094:4;25100:2;25104:7;25084:9;:28::i;:::-;24815:305;;;:::o;35358:256::-;35455:7;35491:23;35508:5;35491:16;:23::i;:::-;35483:5;:31;35475:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35580:12;:19;35593:5;35580:19;;;;;;;;;;;;;;;:26;35600:5;35580:26;;;;;;;;;;;;35573:33;;35358:256;;;;:::o;56440:194::-;43641:12;:10;:12::i;:::-;43630:23;;:7;:5;:7::i;:::-;:23;;;43622:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56488:12:::1;56503:21;56488:36;;56535:28;56574:10;56535:50;;56596:12;:21;;:30;56618:7;56596:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;56477:157;;56440:194::o:0;58587:83::-;43641:12;:10;:12::i;:::-;43630:23;;:7;:5;:7::i;:::-;:23;;;43622:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58646:16:::1;:14;:16::i;:::-;58587:83::o:0;25191:151::-;25295:39;25312:4;25318:2;25322:7;25295:39;;;;;;;;;;;;:16;:39::i;:::-;25191:151;;;:::o;35880:233::-;35955:7;35991:30;:28;:30::i;:::-;35983:5;:38;35975:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;36088:10;36099:5;36088:17;;;;;;;;:::i;:::-;;;;;;;;;;36081:24;;35880:233;;;:::o;57616:111::-;43641:12;:10;:12::i;:::-;43630:23;;:7;:5;:7::i;:::-;:23;;;43622:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57711:8:::1;57692:16;:27;;;;;;;;;;;;:::i;:::-;;57616:111:::0;:::o;52594:86::-;52641:4;52665:7;;;;;;;;;;;52658:14;;52594:86;:::o;22159:239::-;22231:7;22251:13;22267:7;:16;22275:7;22267:16;;;;;;;;;;;;;;;;;;;;;22251:32;;22319:1;22302:19;;:5;:19;;;;22294:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22385:5;22378:12;;;22159:239;;;:::o;54941:426::-;43641:12;:10;:12::i;:::-;43630:23;;:7;:5;:7::i;:::-;:23;;;43622:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54254:4:::1;54997:13;:11;:13::i;:::-;:30;54989:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;54310:2;55073:13;:11;:13::i;:::-;:34;55065:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;55213:29;:17;:27;:29::i;:::-;55253:24;55280:27;:17;:25;:27::i;:::-;55253:54;;55320:39;55330:10;55342:16;55320:9;:39::i;:::-;54978:389;54941:426::o:0;21889:208::-;21961:7;22006:1;21989:19;;:5;:19;;;;21981:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;22073:9;:16;22083:5;22073:16;;;;;;;;;;;;;;;;22066:23;;21889:208;;;:::o;44061:148::-;43641:12;:10;:12::i;:::-;43630:23;;:7;:5;:7::i;:::-;:23;;;43622:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44168:1:::1;44131:40;;44152:6;;;;;;;;;;;44131:40;;;;;;;;;;;;44199:1;44182:6;;:19;;;;;;;;;;;;;;;;;;44061:148::o:0;57930:119::-;43641:12;:10;:12::i;:::-;43630:23;;:7;:5;:7::i;:::-;:23;;;43622:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58025:16:::1;58007:15;:34;;;;57930:119:::0;:::o;58464:79::-;43641:12;:10;:12::i;:::-;43630:23;;:7;:5;:7::i;:::-;:23;;;43622:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58521:14:::1;:12;:14::i;:::-;58464:79::o:0;43410:87::-;43456:7;43483:6;;;;;;;;;;;43476:13;;43410:87;:::o;22634:104::-;22690:13;22723:7;22716:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22634:104;:::o;24218:295::-;24333:12;:10;:12::i;:::-;24321:24;;:8;:24;;;;24313:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;24433:8;24388:18;:32;24407:12;:10;:12::i;:::-;24388:32;;;;;;;;;;;;;;;:42;24421:8;24388:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;24486:8;24457:48;;24472:12;:10;:12::i;:::-;24457:48;;;24496:8;24457:48;;;;;;:::i;:::-;;;;;;;;24218:295;;:::o;54265:47::-;54310:2;54265:47;:::o;55439:438::-;43641:12;:10;:12::i;:::-;43630:23;;:7;:5;:7::i;:::-;:23;;;43622:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54254:4:::1;55497:37;54310:2;55497:13;:11;:13::i;:::-;:17;;:37;;;;:::i;:::-;:55;;55489:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;55597:6;55592:278;54310:2;55609:1;:22;55592:278;;;55706:29;:17;:27;:29::i;:::-;55750:24;55777:27;:17;:25;:27::i;:::-;55750:54;;55819:39;55829:10;55841:16;55819:9;:39::i;:::-;55638:232;55633:3;;;;;:::i;:::-;;;;55592:278;;;;55439:438::o:0;54213:45::-;54254:4;54213:45;:::o;25413:285::-;25545:41;25564:12;:10;:12::i;:::-;25578:7;25545:18;:41::i;:::-;25537:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25651:39;25665:4;25671:2;25675:7;25684:5;25651:13;:39::i;:::-;25413:285;;;;:::o;54540:118::-;54600:7;54626:24;54643:6;54626:16;:24::i;:::-;54619:31;;54540:118;;;:::o;56705:679::-;56778:13;56812:16;56820:7;56812;:16::i;:::-;56804:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;56895:23;56921:10;:19;56932:7;56921:19;;;;;;;;;;;56895:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56951:18;56972:10;:8;:10::i;:::-;56951:31;;57080:1;57064:4;57058:18;:23;57054:72;;;57105:9;57098:16;;;;;;57054:72;57256:1;57236:9;57230:23;:27;57226:108;;;57305:4;57311:9;57288:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57274:48;;;;;;57226:108;57353:23;57368:7;57353:14;:23::i;:::-;57346:30;;;;56705:679;;;;:::o;24584:164::-;24681:4;24705:18;:25;24724:5;24705:25;;;;;;;;;;;;;;;:35;24731:8;24705:35;;;;;;;;;;;;;;;;;;;;;;;;;24698:42;;24584:164;;;;:::o;44364:244::-;43641:12;:10;:12::i;:::-;43630:23;;:7;:5;:7::i;:::-;:23;;;43622:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44473:1:::1;44453:22;;:8;:22;;;;44445:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44563:8;44534:38;;44555:6;;;;;;;;;;;44534:38;;;;;;;;;;;;44592:8;44583:6;;:17;;;;;;;;;;;;;;;;;;44364:244:::0;:::o;55930:420::-;52920:8;:6;:8::i;:::-;52919:9;52911:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;54254:4:::1;55999:13;:11;:13::i;:::-;:30;55991:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;56092:9;56075:13;:11;:13::i;:::-;:26;56067:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56196:29;:17;:27;:29::i;:::-;56236:24;56263:27;:17;:25;:27::i;:::-;56236:54;;56303:39;56313:10;56325:16;56303:9;:39::i;:::-;55980:370;55930:420::o:0;54716:170::-;54760:7;54254:4;54788:13;:11;:13::i;:::-;:30;54780:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;54863:15;;54856:22;;54716:170;:::o;53394:118::-;52920:8;:6;:8::i;:::-;52919:9;52911:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;53464:4:::1;53454:7;;:14;;;;;;;;;;;;;;;;;;53484:20;53491:12;:10;:12::i;:::-;53484:20;;;;;;:::i;:::-;;;;;;;;53394:118::o:0;21533:292::-;21635:4;21674:25;21659:40;;;:11;:40;;;;:105;;;;21731:33;21716:48;;;:11;:48;;;;21659:105;:158;;;;21781:36;21805:11;21781:23;:36::i;:::-;21659:158;21652:165;;21533:292;;;:::o;27165:127::-;27230:4;27282:1;27254:30;;:7;:16;27262:7;27254:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27247:37;;27165:127;;;:::o;17103:98::-;17156:7;17183:10;17176:17;;17103:98;:::o;31042:174::-;31144:2;31117:15;:24;31133:7;31117:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31200:7;31196:2;31162:46;;31171:23;31186:7;31171:14;:23::i;:::-;31162:46;;;;;;;;;;;;31042:174;;:::o;27459:348::-;27552:4;27577:16;27585:7;27577;:16::i;:::-;27569:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27653:13;27669:23;27684:7;27669:14;:23::i;:::-;27653:39;;27722:5;27711:16;;:7;:16;;;:51;;;;27755:7;27731:31;;:20;27743:7;27731:11;:20::i;:::-;:31;;;27711:51;:87;;;;27766:32;27783:5;27790:7;27766:16;:32::i;:::-;27711:87;27703:96;;;27459:348;;;;:::o;30380:544::-;30505:4;30478:31;;:23;30493:7;30478:14;:23::i;:::-;:31;;;30470:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30588:1;30574:16;;:2;:16;;;;30566:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30644:39;30665:4;30671:2;30675:7;30644:20;:39::i;:::-;30748:29;30765:1;30769:7;30748:8;:29::i;:::-;30809:1;30790:9;:15;30800:4;30790:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30838:1;30821:9;:13;30831:2;30821:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30869:2;30850:7;:16;30858:7;30850:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30908:7;30904:2;30889:27;;30898:4;30889:27;;;;;;;;;;;;30380:544;;;:::o;53653:120::-;53197:8;:6;:8::i;:::-;53189:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;53722:5:::1;53712:7;;:15;;;;;;;;;;;;;;;;;;53743:22;53752:12;:10;:12::i;:::-;53743:22;;;;;;:::i;:::-;;;;;;;;53653:120::o:0;42021:127::-;42128:1;42110:7;:14;;;:19;;;;;;;;;;;42021:127;:::o;41899:114::-;41964:7;41991;:14;;;41984:21;;41899:114;;;:::o;28149:110::-;28225:26;28235:2;28239:7;28225:26;;;;;;;;;;;;:9;:26::i;:::-;28149:110;;:::o;47318:98::-;47376:7;47407:1;47403;:5;;;;:::i;:::-;47396:12;;47318:98;;;;:::o;26580:272::-;26694:28;26704:4;26710:2;26714:7;26694:9;:28::i;:::-;26741:48;26764:4;26770:2;26774:7;26783:5;26741:22;:48::i;:::-;26733:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26580:272;;;;:::o;57443:117::-;57503:13;57536:16;57529:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57443:117;:::o;22809:360::-;22882:13;22916:16;22924:7;22916;:16::i;:::-;22908:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22997:21;23021:10;:8;:10::i;:::-;22997:34;;23073:1;23055:7;23049:21;:25;:112;;;;;;;;;;;;;;;;;23114:7;23123:18;:7;:16;:18::i;:::-;23097:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23049:112;23042:119;;;22809:360;;;:::o;20132:157::-;20217:4;20256:25;20241:40;;;:11;:40;;;;20234:47;;20132:157;;;:::o;36726:555::-;36836:45;36863:4;36869:2;36873:7;36836:26;:45::i;:::-;36914:1;36898:18;;:4;:18;;;36894:187;;;36933:40;36965:7;36933:31;:40::i;:::-;36894:187;;;37003:2;36995:10;;:4;:10;;;36991:90;;37022:47;37055:4;37061:7;37022:32;:47::i;:::-;36991:90;36894:187;37109:1;37095:16;;:2;:16;;;37091:183;;;37128:45;37165:7;37128:36;:45::i;:::-;37091:183;;;37201:4;37195:10;;:2;:10;;;37191:83;;37222:40;37250:2;37254:7;37222:27;:40::i;:::-;37191:83;37091:183;36726:555;;;:::o;28486:250::-;28582:18;28588:2;28592:7;28582:5;:18::i;:::-;28619:54;28650:1;28654:2;28658:7;28667:5;28619:22;:54::i;:::-;28611:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;28486:250;;;:::o;31781:843::-;31902:4;31928:15;:2;:13;;;:15::i;:::-;31924:693;;;31980:2;31964:36;;;32001:12;:10;:12::i;:::-;32015:4;32021:7;32030:5;31964:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31960:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32227:1;32210:6;:13;:18;32206:341;;;32253:60;;;;;;;;;;:::i;:::-;;;;;;;;32206:341;32497:6;32491:13;32482:6;32478:2;32474:15;32467:38;31960:602;32097:45;;;32087:55;;;:6;:55;;;;32080:62;;;;;31924:693;32601:4;32594:11;;31781:843;;;;;;;:::o;17675:723::-;17731:13;17961:1;17952:5;:10;17948:53;;;17979:10;;;;;;;;;;;;;;;;;;;;;17948:53;18011:12;18026:5;18011:20;;18042:14;18067:78;18082:1;18074:4;:9;18067:78;;18100:8;;;;;:::i;:::-;;;;18131:2;18123:10;;;;;:::i;:::-;;;18067:78;;;18155:19;18187:6;18177:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18155:39;;18205:154;18221:1;18212:5;:10;18205:154;;18249:1;18239:11;;;;;:::i;:::-;;;18316:2;18308:5;:10;;;;:::i;:::-;18295:2;:24;;;;:::i;:::-;18282:39;;18265:6;18272;18265:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18345:2;18336:11;;;;;:::i;:::-;;;18205:154;;;18383:6;18369:21;;;;;17675:723;;;;:::o;33237:93::-;;;;:::o;38004:164::-;38108:10;:17;;;;38081:15;:24;38097:7;38081:24;;;;;;;;;;;:44;;;;38136:10;38152:7;38136:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38004:164;:::o;38795:988::-;39061:22;39111:1;39086:22;39103:4;39086:16;:22::i;:::-;:26;;;;:::i;:::-;39061:51;;39123:18;39144:17;:26;39162:7;39144:26;;;;;;;;;;;;39123:47;;39291:14;39277:10;:28;39273:328;;39322:19;39344:12;:18;39357:4;39344:18;;;;;;;;;;;;;;;:34;39363:14;39344:34;;;;;;;;;;;;39322:56;;39428:11;39395:12;:18;39408:4;39395:18;;;;;;;;;;;;;;;:30;39414:10;39395:30;;;;;;;;;;;:44;;;;39545:10;39512:17;:30;39530:11;39512:30;;;;;;;;;;;:43;;;;39307:294;39273:328;39697:17;:26;39715:7;39697:26;;;;;;;;;;;39690:33;;;39741:12;:18;39754:4;39741:18;;;;;;;;;;;;;;;:34;39760:14;39741:34;;;;;;;;;;;39734:41;;;38876:907;;38795:988;;:::o;40078:1079::-;40331:22;40376:1;40356:10;:17;;;;:21;;;;:::i;:::-;40331:46;;40388:18;40409:15;:24;40425:7;40409:24;;;;;;;;;;;;40388:45;;40760:19;40782:10;40793:14;40782:26;;;;;;;;:::i;:::-;;;;;;;;;;40760:48;;40846:11;40821:10;40832;40821:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;40957:10;40926:15;:28;40942:11;40926:28;;;;;;;;;;;:41;;;;41098:15;:24;41114:7;41098:24;;;;;;;;;;;41091:31;;;41133:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40149:1008;;;40078:1079;:::o;37582:221::-;37667:14;37684:20;37701:2;37684:16;:20::i;:::-;37667:37;;37742:7;37715:12;:16;37728:2;37715:16;;;;;;;;;;;;;;;:24;37732:6;37715:24;;;;;;;;;;;:34;;;;37789:6;37760:17;:26;37778:7;37760:26;;;;;;;;;;;:35;;;;37656:147;37582:221;;:::o;29072:382::-;29166:1;29152:16;;:2;:16;;;;29144:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29225:16;29233:7;29225;:16::i;:::-;29224:17;29216:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29287:45;29316:1;29320:2;29324:7;29287:20;:45::i;:::-;29362:1;29345:9;:13;29355:2;29345:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29393:2;29374:7;:16;29382:7;29374:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29438:7;29434:2;29413:33;;29430:1;29413:33;;;;;;;;;;;;29072:382;;:::o;9303:422::-;9363:4;9571:12;9682:7;9670:20;9662:28;;9716:1;9709:4;:8;9702:15;;;9303:422;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:117::-;6024:1;6021;6014:12;6038:117;6147:1;6144;6137:12;6161:180;6209:77;6206:1;6199:88;6306:4;6303:1;6296:15;6330:4;6327:1;6320:15;6347:281;6430:27;6452:4;6430:27;:::i;:::-;6422:6;6418:40;6560:6;6548:10;6545:22;6524:18;6512:10;6509:34;6506:62;6503:88;;;6571:18;;:::i;:::-;6503:88;6611:10;6607:2;6600:22;6390:238;6347:281;;:::o;6634:129::-;6668:6;6695:20;;:::i;:::-;6685:30;;6724:33;6752:4;6744:6;6724:33;:::i;:::-;6634:129;;;:::o;6769:308::-;6831:4;6921:18;6913:6;6910:30;6907:56;;;6943:18;;:::i;:::-;6907:56;6981:29;7003:6;6981:29;:::i;:::-;6973:37;;7065:4;7059;7055:15;7047:23;;6769:308;;;:::o;7083:154::-;7167:6;7162:3;7157;7144:30;7229:1;7220:6;7215:3;7211:16;7204:27;7083:154;;;:::o;7243:412::-;7321:5;7346:66;7362:49;7404:6;7362:49;:::i;:::-;7346:66;:::i;:::-;7337:75;;7435:6;7428:5;7421:21;7473:4;7466:5;7462:16;7511:3;7502:6;7497:3;7493:16;7490:25;7487:112;;;7518:79;;:::i;:::-;7487:112;7608:41;7642:6;7637:3;7632;7608:41;:::i;:::-;7327:328;7243:412;;;;;:::o;7675:340::-;7731:5;7780:3;7773:4;7765:6;7761:17;7757:27;7747:122;;7788:79;;:::i;:::-;7747:122;7905:6;7892:20;7930:79;8005:3;7997:6;7990:4;7982:6;7978:17;7930:79;:::i;:::-;7921:88;;7737:278;7675:340;;;;:::o;8021:509::-;8090:6;8139:2;8127:9;8118:7;8114:23;8110:32;8107:119;;;8145:79;;:::i;:::-;8107:119;8293:1;8282:9;8278:17;8265:31;8323:18;8315:6;8312:30;8309:117;;;8345:79;;:::i;:::-;8309:117;8450:63;8505:7;8496:6;8485:9;8481:22;8450:63;:::i;:::-;8440:73;;8236:287;8021:509;;;;:::o;8536:329::-;8595:6;8644:2;8632:9;8623:7;8619:23;8615:32;8612:119;;;8650:79;;:::i;:::-;8612:119;8770:1;8795:53;8840:7;8831:6;8820:9;8816:22;8795:53;:::i;:::-;8785:63;;8741:117;8536:329;;;;:::o;8871:116::-;8941:21;8956:5;8941:21;:::i;:::-;8934:5;8931:32;8921:60;;8977:1;8974;8967:12;8921:60;8871:116;:::o;8993:133::-;9036:5;9074:6;9061:20;9052:29;;9090:30;9114:5;9090:30;:::i;:::-;8993:133;;;;:::o;9132:468::-;9197:6;9205;9254:2;9242:9;9233:7;9229:23;9225:32;9222:119;;;9260:79;;:::i;:::-;9222:119;9380:1;9405:53;9450:7;9441:6;9430:9;9426:22;9405:53;:::i;:::-;9395:63;;9351:117;9507:2;9533:50;9575:7;9566:6;9555:9;9551:22;9533:50;:::i;:::-;9523:60;;9478:115;9132:468;;;;;:::o;9606:307::-;9667:4;9757:18;9749:6;9746:30;9743:56;;;9779:18;;:::i;:::-;9743:56;9817:29;9839:6;9817:29;:::i;:::-;9809:37;;9901:4;9895;9891:15;9883:23;;9606:307;;;:::o;9919:410::-;9996:5;10021:65;10037:48;10078:6;10037:48;:::i;:::-;10021:65;:::i;:::-;10012:74;;10109:6;10102:5;10095:21;10147:4;10140:5;10136:16;10185:3;10176:6;10171:3;10167:16;10164:25;10161:112;;;10192:79;;:::i;:::-;10161:112;10282:41;10316:6;10311:3;10306;10282:41;:::i;:::-;10002:327;9919:410;;;;;:::o;10348:338::-;10403:5;10452:3;10445:4;10437:6;10433:17;10429:27;10419:122;;10460:79;;:::i;:::-;10419:122;10577:6;10564:20;10602:78;10676:3;10668:6;10661:4;10653:6;10649:17;10602:78;:::i;:::-;10593:87;;10409:277;10348:338;;;;:::o;10692:943::-;10787:6;10795;10803;10811;10860:3;10848:9;10839:7;10835:23;10831:33;10828:120;;;10867:79;;:::i;:::-;10828:120;10987:1;11012:53;11057:7;11048:6;11037:9;11033:22;11012:53;:::i;:::-;11002:63;;10958:117;11114:2;11140:53;11185:7;11176:6;11165:9;11161:22;11140:53;:::i;:::-;11130:63;;11085:118;11242:2;11268:53;11313:7;11304:6;11293:9;11289:22;11268:53;:::i;:::-;11258:63;;11213:118;11398:2;11387:9;11383:18;11370:32;11429:18;11421:6;11418:30;11415:117;;;11451:79;;:::i;:::-;11415:117;11556:62;11610:7;11601:6;11590:9;11586:22;11556:62;:::i;:::-;11546:72;;11341:287;10692:943;;;;;;;:::o;11641:474::-;11709:6;11717;11766:2;11754:9;11745:7;11741:23;11737:32;11734:119;;;11772:79;;:::i;:::-;11734:119;11892:1;11917:53;11962:7;11953:6;11942:9;11938:22;11917:53;:::i;:::-;11907:63;;11863:117;12019:2;12045:53;12090:7;12081:6;12070:9;12066:22;12045:53;:::i;:::-;12035:63;;11990:118;11641:474;;;;;:::o;12121:180::-;12169:77;12166:1;12159:88;12266:4;12263:1;12256:15;12290:4;12287:1;12280:15;12307:320;12351:6;12388:1;12382:4;12378:12;12368:22;;12435:1;12429:4;12425:12;12456:18;12446:81;;12512:4;12504:6;12500:17;12490:27;;12446:81;12574:2;12566:6;12563:14;12543:18;12540:38;12537:84;;;12593:18;;:::i;:::-;12537:84;12358:269;12307:320;;;:::o;12633:231::-;12773:34;12769:1;12761:6;12757:14;12750:58;12842:14;12837:2;12829:6;12825:15;12818:39;12633:231;:::o;12870:366::-;13012:3;13033:67;13097:2;13092:3;13033:67;:::i;:::-;13026:74;;13109:93;13198:3;13109:93;:::i;:::-;13227:2;13222:3;13218:12;13211:19;;12870:366;;;:::o;13242:419::-;13408:4;13446:2;13435:9;13431:18;13423:26;;13495:9;13489:4;13485:20;13481:1;13470:9;13466:17;13459:47;13523:131;13649:4;13523:131;:::i;:::-;13515:139;;13242:419;;;:::o;13667:220::-;13807:34;13803:1;13795:6;13791:14;13784:58;13876:3;13871:2;13863:6;13859:15;13852:28;13667:220;:::o;13893:366::-;14035:3;14056:67;14120:2;14115:3;14056:67;:::i;:::-;14049:74;;14132:93;14221:3;14132:93;:::i;:::-;14250:2;14245:3;14241:12;14234:19;;13893:366;;;:::o;14265:419::-;14431:4;14469:2;14458:9;14454:18;14446:26;;14518:9;14512:4;14508:20;14504:1;14493:9;14489:17;14482:47;14546:131;14672:4;14546:131;:::i;:::-;14538:139;;14265:419;;;:::o;14690:243::-;14830:34;14826:1;14818:6;14814:14;14807:58;14899:26;14894:2;14886:6;14882:15;14875:51;14690:243;:::o;14939:366::-;15081:3;15102:67;15166:2;15161:3;15102:67;:::i;:::-;15095:74;;15178:93;15267:3;15178:93;:::i;:::-;15296:2;15291:3;15287:12;15280:19;;14939:366;;;:::o;15311:419::-;15477:4;15515:2;15504:9;15500:18;15492:26;;15564:9;15558:4;15554:20;15550:1;15539:9;15535:17;15528:47;15592:131;15718:4;15592:131;:::i;:::-;15584:139;;15311:419;;;:::o;15736:236::-;15876:34;15872:1;15864:6;15860:14;15853:58;15945:19;15940:2;15932:6;15928:15;15921:44;15736:236;:::o;15978:366::-;16120:3;16141:67;16205:2;16200:3;16141:67;:::i;:::-;16134:74;;16217:93;16306:3;16217:93;:::i;:::-;16335:2;16330:3;16326:12;16319:19;;15978:366;;;:::o;16350:419::-;16516:4;16554:2;16543:9;16539:18;16531:26;;16603:9;16597:4;16593:20;16589:1;16578:9;16574:17;16567:47;16631:131;16757:4;16631:131;:::i;:::-;16623:139;;16350:419;;;:::o;16775:230::-;16915:34;16911:1;16903:6;16899:14;16892:58;16984:13;16979:2;16971:6;16967:15;16960:38;16775:230;:::o;17011:366::-;17153:3;17174:67;17238:2;17233:3;17174:67;:::i;:::-;17167:74;;17250:93;17339:3;17250:93;:::i;:::-;17368:2;17363:3;17359:12;17352:19;;17011:366;;;:::o;17383:419::-;17549:4;17587:2;17576:9;17572:18;17564:26;;17636:9;17630:4;17626:20;17622:1;17611:9;17607:17;17600:47;17664:131;17790:4;17664:131;:::i;:::-;17656:139;;17383:419;;;:::o;17808:182::-;17948:34;17944:1;17936:6;17932:14;17925:58;17808:182;:::o;17996:366::-;18138:3;18159:67;18223:2;18218:3;18159:67;:::i;:::-;18152:74;;18235:93;18324:3;18235:93;:::i;:::-;18353:2;18348:3;18344:12;18337:19;;17996:366;;;:::o;18368:419::-;18534:4;18572:2;18561:9;18557:18;18549:26;;18621:9;18615:4;18611:20;18607:1;18596:9;18592:17;18585:47;18649:131;18775:4;18649:131;:::i;:::-;18641:139;;18368:419;;;:::o;18793:231::-;18933:34;18929:1;18921:6;18917:14;18910:58;19002:14;18997:2;18989:6;18985:15;18978:39;18793:231;:::o;19030:366::-;19172:3;19193:67;19257:2;19252:3;19193:67;:::i;:::-;19186:74;;19269:93;19358:3;19269:93;:::i;:::-;19387:2;19382:3;19378:12;19371:19;;19030:366;;;:::o;19402:419::-;19568:4;19606:2;19595:9;19591:18;19583:26;;19655:9;19649:4;19645:20;19641:1;19630:9;19626:17;19619:47;19683:131;19809:4;19683:131;:::i;:::-;19675:139;;19402:419;;;:::o;19827:180::-;19875:77;19872:1;19865:88;19972:4;19969:1;19962:15;19996:4;19993:1;19986:15;20013:228;20153:34;20149:1;20141:6;20137:14;20130:58;20222:11;20217:2;20209:6;20205:15;20198:36;20013:228;:::o;20247:366::-;20389:3;20410:67;20474:2;20469:3;20410:67;:::i;:::-;20403:74;;20486:93;20575:3;20486:93;:::i;:::-;20604:2;20599:3;20595:12;20588:19;;20247:366;;;:::o;20619:419::-;20785:4;20823:2;20812:9;20808:18;20800:26;;20872:9;20866:4;20862:20;20858:1;20847:9;20843:17;20836:47;20900:131;21026:4;20900:131;:::i;:::-;20892:139;;20619:419;;;:::o;21044:172::-;21184:24;21180:1;21172:6;21168:14;21161:48;21044:172;:::o;21222:366::-;21364:3;21385:67;21449:2;21444:3;21385:67;:::i;:::-;21378:74;;21461:93;21550:3;21461:93;:::i;:::-;21579:2;21574:3;21570:12;21563:19;;21222:366;;;:::o;21594:419::-;21760:4;21798:2;21787:9;21783:18;21775:26;;21847:9;21841:4;21837:20;21833:1;21822:9;21818:17;21811:47;21875:131;22001:4;21875:131;:::i;:::-;21867:139;;21594:419;;;:::o;22019:226::-;22159:34;22155:1;22147:6;22143:14;22136:58;22228:9;22223:2;22215:6;22211:15;22204:34;22019:226;:::o;22251:366::-;22393:3;22414:67;22478:2;22473:3;22414:67;:::i;:::-;22407:74;;22490:93;22579:3;22490:93;:::i;:::-;22608:2;22603:3;22599:12;22592:19;;22251:366;;;:::o;22623:419::-;22789:4;22827:2;22816:9;22812:18;22804:26;;22876:9;22870:4;22866:20;22862:1;22851:9;22847:17;22840:47;22904:131;23030:4;22904:131;:::i;:::-;22896:139;;22623:419;;;:::o;23048:229::-;23188:34;23184:1;23176:6;23172:14;23165:58;23257:12;23252:2;23244:6;23240:15;23233:37;23048:229;:::o;23283:366::-;23425:3;23446:67;23510:2;23505:3;23446:67;:::i;:::-;23439:74;;23522:93;23611:3;23522:93;:::i;:::-;23640:2;23635:3;23631:12;23624:19;;23283:366;;;:::o;23655:419::-;23821:4;23859:2;23848:9;23844:18;23836:26;;23908:9;23902:4;23898:20;23894:1;23883:9;23879:17;23872:47;23936:131;24062:4;23936:131;:::i;:::-;23928:139;;23655:419;;;:::o;24080:175::-;24220:27;24216:1;24208:6;24204:14;24197:51;24080:175;:::o;24261:366::-;24403:3;24424:67;24488:2;24483:3;24424:67;:::i;:::-;24417:74;;24500:93;24589:3;24500:93;:::i;:::-;24618:2;24613:3;24609:12;24602:19;;24261:366;;;:::o;24633:419::-;24799:4;24837:2;24826:9;24822:18;24814:26;;24886:9;24880:4;24876:20;24872:1;24861:9;24857:17;24850:47;24914:131;25040:4;24914:131;:::i;:::-;24906:139;;24633:419;;;:::o;25058:172::-;25198:24;25194:1;25186:6;25182:14;25175:48;25058:172;:::o;25236:366::-;25378:3;25399:67;25463:2;25458:3;25399:67;:::i;:::-;25392:74;;25475:93;25564:3;25475:93;:::i;:::-;25593:2;25588:3;25584:12;25577:19;;25236:366;;;:::o;25608:419::-;25774:4;25812:2;25801:9;25797:18;25789:26;;25861:9;25855:4;25851:20;25847:1;25836:9;25832:17;25825:47;25889:131;26015:4;25889:131;:::i;:::-;25881:139;;25608:419;;;:::o;26033:180::-;26081:77;26078:1;26071:88;26178:4;26175:1;26168:15;26202:4;26199:1;26192:15;26219:233;26258:3;26281:24;26299:5;26281:24;:::i;:::-;26272:33;;26327:66;26320:5;26317:77;26314:103;;;26397:18;;:::i;:::-;26314:103;26444:1;26437:5;26433:13;26426:20;;26219:233;;;:::o;26458:236::-;26598:34;26594:1;26586:6;26582:14;26575:58;26667:19;26662:2;26654:6;26650:15;26643:44;26458:236;:::o;26700:366::-;26842:3;26863:67;26927:2;26922:3;26863:67;:::i;:::-;26856:74;;26939:93;27028:3;26939:93;:::i;:::-;27057:2;27052:3;27048:12;27041:19;;26700:366;;;:::o;27072:419::-;27238:4;27276:2;27265:9;27261:18;27253:26;;27325:9;27319:4;27315:20;27311:1;27300:9;27296:17;27289:47;27353:131;27479:4;27353:131;:::i;:::-;27345:139;;27072:419;;;:::o;27497:148::-;27599:11;27636:3;27621:18;;27497:148;;;;:::o;27651:377::-;27757:3;27785:39;27818:5;27785:39;:::i;:::-;27840:89;27922:6;27917:3;27840:89;:::i;:::-;27833:96;;27938:52;27983:6;27978:3;27971:4;27964:5;27960:16;27938:52;:::i;:::-;28015:6;28010:3;28006:16;27999:23;;27761:267;27651:377;;;;:::o;28034:435::-;28214:3;28236:95;28327:3;28318:6;28236:95;:::i;:::-;28229:102;;28348:95;28439:3;28430:6;28348:95;:::i;:::-;28341:102;;28460:3;28453:10;;28034:435;;;;;:::o;28475:225::-;28615:34;28611:1;28603:6;28599:14;28592:58;28684:8;28679:2;28671:6;28667:15;28660:33;28475:225;:::o;28706:366::-;28848:3;28869:67;28933:2;28928:3;28869:67;:::i;:::-;28862:74;;28945:93;29034:3;28945:93;:::i;:::-;29063:2;29058:3;29054:12;29047:19;;28706:366;;;:::o;29078:419::-;29244:4;29282:2;29271:9;29267:18;29259:26;;29331:9;29325:4;29321:20;29317:1;29306:9;29302:17;29295:47;29359:131;29485:4;29359:131;:::i;:::-;29351:139;;29078:419;;;:::o;29503:166::-;29643:18;29639:1;29631:6;29627:14;29620:42;29503:166;:::o;29675:366::-;29817:3;29838:67;29902:2;29897:3;29838:67;:::i;:::-;29831:74;;29914:93;30003:3;29914:93;:::i;:::-;30032:2;30027:3;30023:12;30016:19;;29675:366;;;:::o;30047:419::-;30213:4;30251:2;30240:9;30236:18;30228:26;;30300:9;30294:4;30290:20;30286:1;30275:9;30271:17;30264:47;30328:131;30454:4;30328:131;:::i;:::-;30320:139;;30047:419;;;:::o;30472:179::-;30612:31;30608:1;30600:6;30596:14;30589:55;30472:179;:::o;30657:366::-;30799:3;30820:67;30884:2;30879:3;30820:67;:::i;:::-;30813:74;;30896:93;30985:3;30896:93;:::i;:::-;31014:2;31009:3;31005:12;30998:19;;30657:366;;;:::o;31029:419::-;31195:4;31233:2;31222:9;31218:18;31210:26;;31282:9;31276:4;31272:20;31268:1;31257:9;31253:17;31246:47;31310:131;31436:4;31310:131;:::i;:::-;31302:139;;31029:419;;;:::o;31454:231::-;31594:34;31590:1;31582:6;31578:14;31571:58;31663:14;31658:2;31650:6;31646:15;31639:39;31454:231;:::o;31691:366::-;31833:3;31854:67;31918:2;31913:3;31854:67;:::i;:::-;31847:74;;31930:93;32019:3;31930:93;:::i;:::-;32048:2;32043:3;32039:12;32032:19;;31691:366;;;:::o;32063:419::-;32229:4;32267:2;32256:9;32252:18;32244:26;;32316:9;32310:4;32306:20;32302:1;32291:9;32287:17;32280:47;32344:131;32470:4;32344:131;:::i;:::-;32336:139;;32063:419;;;:::o;32488:228::-;32628:34;32624:1;32616:6;32612:14;32605:58;32697:11;32692:2;32684:6;32680:15;32673:36;32488:228;:::o;32722:366::-;32864:3;32885:67;32949:2;32944:3;32885:67;:::i;:::-;32878:74;;32961:93;33050:3;32961:93;:::i;:::-;33079:2;33074:3;33070:12;33063:19;;32722:366;;;:::o;33094:419::-;33260:4;33298:2;33287:9;33283:18;33275:26;;33347:9;33341:4;33337:20;33333:1;33322:9;33318:17;33311:47;33375:131;33501:4;33375:131;:::i;:::-;33367:139;;33094:419;;;:::o;33519:223::-;33659:34;33655:1;33647:6;33643:14;33636:58;33728:6;33723:2;33715:6;33711:15;33704:31;33519:223;:::o;33748:366::-;33890:3;33911:67;33975:2;33970:3;33911:67;:::i;:::-;33904:74;;33987:93;34076:3;33987:93;:::i;:::-;34105:2;34100:3;34096:12;34089:19;;33748:366;;;:::o;34120:419::-;34286:4;34324:2;34313:9;34309:18;34301:26;;34373:9;34367:4;34363:20;34359:1;34348:9;34344:17;34337:47;34401:131;34527:4;34401:131;:::i;:::-;34393:139;;34120:419;;;:::o;34545:191::-;34585:4;34605:20;34623:1;34605:20;:::i;:::-;34600:25;;34639:20;34657:1;34639:20;:::i;:::-;34634:25;;34678:1;34675;34672:8;34669:34;;;34683:18;;:::i;:::-;34669:34;34728:1;34725;34721:9;34713:17;;34545:191;;;;:::o;34742:305::-;34782:3;34801:20;34819:1;34801:20;:::i;:::-;34796:25;;34835:20;34853:1;34835:20;:::i;:::-;34830:25;;34989:1;34921:66;34917:74;34914:1;34911:81;34908:107;;;34995:18;;:::i;:::-;34908:107;35039:1;35036;35032:9;35025:16;;34742:305;;;;:::o;35053:170::-;35193:22;35189:1;35181:6;35177:14;35170:46;35053:170;:::o;35229:366::-;35371:3;35392:67;35456:2;35451:3;35392:67;:::i;:::-;35385:74;;35468:93;35557:3;35468:93;:::i;:::-;35586:2;35581:3;35577:12;35570:19;;35229:366;;;:::o;35601:419::-;35767:4;35805:2;35794:9;35790:18;35782:26;;35854:9;35848:4;35844:20;35840:1;35829:9;35825:17;35818:47;35882:131;36008:4;35882:131;:::i;:::-;35874:139;;35601:419;;;:::o;36026:237::-;36166:34;36162:1;36154:6;36150:14;36143:58;36235:20;36230:2;36222:6;36218:15;36211:45;36026:237;:::o;36269:366::-;36411:3;36432:67;36496:2;36491:3;36432:67;:::i;:::-;36425:74;;36508:93;36597:3;36508:93;:::i;:::-;36626:2;36621:3;36617:12;36610:19;;36269:366;;;:::o;36641:419::-;36807:4;36845:2;36834:9;36830:18;36822:26;;36894:9;36888:4;36884:20;36880:1;36869:9;36865:17;36858:47;36922:131;37048:4;36922:131;:::i;:::-;36914:139;;36641:419;;;:::o;37066:234::-;37206:34;37202:1;37194:6;37190:14;37183:58;37275:17;37270:2;37262:6;37258:15;37251:42;37066:234;:::o;37306:366::-;37448:3;37469:67;37533:2;37528:3;37469:67;:::i;:::-;37462:74;;37545:93;37634:3;37545:93;:::i;:::-;37663:2;37658:3;37654:12;37647:19;;37306:366;;;:::o;37678:419::-;37844:4;37882:2;37871:9;37867:18;37859:26;;37931:9;37925:4;37921:20;37917:1;37906:9;37902:17;37895:47;37959:131;38085:4;37959:131;:::i;:::-;37951:139;;37678:419;;;:::o;38103:98::-;38154:6;38188:5;38182:12;38172:22;;38103:98;;;:::o;38207:168::-;38290:11;38324:6;38319:3;38312:19;38364:4;38359:3;38355:14;38340:29;;38207:168;;;;:::o;38381:360::-;38467:3;38495:38;38527:5;38495:38;:::i;:::-;38549:70;38612:6;38607:3;38549:70;:::i;:::-;38542:77;;38628:52;38673:6;38668:3;38661:4;38654:5;38650:16;38628:52;:::i;:::-;38705:29;38727:6;38705:29;:::i;:::-;38700:3;38696:39;38689:46;;38471:270;38381:360;;;;:::o;38747:640::-;38942:4;38980:3;38969:9;38965:19;38957:27;;38994:71;39062:1;39051:9;39047:17;39038:6;38994:71;:::i;:::-;39075:72;39143:2;39132:9;39128:18;39119:6;39075:72;:::i;:::-;39157;39225:2;39214:9;39210:18;39201:6;39157:72;:::i;:::-;39276:9;39270:4;39266:20;39261:2;39250:9;39246:18;39239:48;39304:76;39375:4;39366:6;39304:76;:::i;:::-;39296:84;;38747:640;;;;;;;:::o;39393:141::-;39449:5;39480:6;39474:13;39465:22;;39496:32;39522:5;39496:32;:::i;:::-;39393:141;;;;:::o;39540:349::-;39609:6;39658:2;39646:9;39637:7;39633:23;39629:32;39626:119;;;39664:79;;:::i;:::-;39626:119;39784:1;39809:63;39864:7;39855:6;39844:9;39840:22;39809:63;:::i;:::-;39799:73;;39755:127;39540:349;;;;:::o;39895:180::-;39943:77;39940:1;39933:88;40040:4;40037:1;40030:15;40064:4;40061:1;40054:15;40081:185;40121:1;40138:20;40156:1;40138:20;:::i;:::-;40133:25;;40172:20;40190:1;40172:20;:::i;:::-;40167:25;;40211:1;40201:35;;40216:18;;:::i;:::-;40201:35;40258:1;40255;40251:9;40246:14;;40081:185;;;;:::o;40272:176::-;40304:1;40321:20;40339:1;40321:20;:::i;:::-;40316:25;;40355:20;40373:1;40355:20;:::i;:::-;40350:25;;40394:1;40384:35;;40399:18;;:::i;:::-;40384:35;40440:1;40437;40433:9;40428:14;;40272:176;;;;:::o;40454:180::-;40502:77;40499:1;40492:88;40599:4;40596:1;40589:15;40623:4;40620:1;40613:15;40640:182;40780:34;40776:1;40768:6;40764:14;40757:58;40640:182;:::o;40828:366::-;40970:3;40991:67;41055:2;41050:3;40991:67;:::i;:::-;40984:74;;41067:93;41156:3;41067:93;:::i;:::-;41185:2;41180:3;41176:12;41169:19;;40828:366;;;:::o;41200:419::-;41366:4;41404:2;41393:9;41389:18;41381:26;;41453:9;41447:4;41443:20;41439:1;41428:9;41424:17;41417:47;41481:131;41607:4;41481:131;:::i;:::-;41473:139;;41200:419;;;:::o;41625:178::-;41765:30;41761:1;41753:6;41749:14;41742:54;41625:178;:::o;41809:366::-;41951:3;41972:67;42036:2;42031:3;41972:67;:::i;:::-;41965:74;;42048:93;42137:3;42048:93;:::i;:::-;42166:2;42161:3;42157:12;42150:19;;41809:366;;;:::o;42181:419::-;42347:4;42385:2;42374:9;42370:18;42362:26;;42434:9;42428:4;42424:20;42420:1;42409:9;42405:17;42398:47;42462:131;42588:4;42462:131;:::i;:::-;42454:139;;42181:419;;;:::o

Swarm Source

ipfs://6e298a4b4c51b3703fe79ee904d96523487e48131e426a4a020a0025fe866eff
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading