ETH Price: $2,309.46 (-0.05%)

Token

Dragons of Zobrotera (DOZ)
 

Overview

Max Total Supply

201 DOZ

Holders

127

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
illuminatigem.eth
Balance
1 DOZ
0x399b282c17f8ed9f542c2376917947d6b79e2cc6
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
DOZ

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 4 of 17: DOZ.sol
import "./ERC721.sol";
import "./SafeMath.sol";
import "./AccessControl.sol";

//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

/**
 * @title Dragons of Zobrotera contract
 * @dev Extends ERC721 Non-Fungible Token Standard implementation
 */
contract DOZ is ERC721, AccessControl{
    using SafeMath for uint256;

    // White listed role
    bytes32 private constant whiteListedRole = keccak256("wl");
    // Giveaway winner role
    bytes32 private constant giveawayWinnerRole = keccak256("gw");

    // Max mint per transaction
    uint public constant maxNftPurchase = 20; 

    // Mapping from address to number of mint during presale
    mapping(address => uint256) private presaled;
    // Mapping from address to number of claimable giveaway
    mapping(address => uint256) private giveaways;

    // Tokens total count
    uint256 private count = 0;
    // Test tokens total count
    uint256 private testCount = 1 * (10 ** 10);
    // NFT price => 0.069 ETH
    uint256 private nftPrice = 0.069 * (10 ** 18);
    // Reserved number of giveaway
    uint256 private NUMBER_OF_GIVEAWAY = 100;
    // Maximum number of nft that can be minted
    uint256 private MAX_NFTS = 10000 - NUMBER_OF_GIVEAWAY;
    // Status of the official sale
    bool private saleIsActive = false;
    // Status of the presale
    bool private presaleIsActive = false;

    // Surprise :)
    uint256 private NUMBER_OF_CHOLRONE = 1;
    // Surprise :)
    uint256 private cholroneMintedCount = 0;

    // Event emitted when a token as been minted safly
    event SafeMinted(address who, uint64 timestamp, uint256[] tokenIds, bool isTestMint);
    // Event emitted when a token as been minted safly througt a giveaway
    event GiveawaySafeMinted(address[] winners);
    // Event emitted for the surprise
    event CholroneSafeMinted(address who);


    /**
        Initialize and setup the admin role for the owner
    */
    constructor() ERC721("Dragons of Zobrotera", "DOZ") {
        _setRoleAdmin(whiteListedRole, DEFAULT_ADMIN_ROLE);
        _setupRole(getRoleAdmin(whiteListedRole), msg.sender);
    }

    /**
        Update the number of reserved giveaway
        @param _numberOfGiveaway the new number of reserved giveaway
    */
    function reserveGiveaways(uint256 _numberOfGiveaway) public onlyOwner {
        NUMBER_OF_GIVEAWAY = _numberOfGiveaway;
        MAX_NFTS = 10000 - _numberOfGiveaway;
    }

    /**
        Mint a token only for the contract owner
        Used to setup a first mint to list the OpenSea collection
    */
    function testMintToOwner() public onlyOwner {
        uint mintIndex = totalSupply();
        _safeMint(owner(), mintIndex);
        count += 1;
    }

    /**
        Withdraw ether from the contract to the owner's wallet
    */
    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        payable(owner()).transfer(balance);
    }

    /**
        Add new white listed addresses
        Used to identify the presale authorized wallets
        @param addresses the new addresses to add to the white list  
    */
    function whitelistAddressesForPresale(address[] memory addresses) public onlyOwner{
        for(uint32 i = 0; i < addresses.length; i++){
            grantRole(whiteListedRole, addresses[i]);
        }
    }

    /**
        Register new giveaway winners
        Grant access ro the "claimMyGiveAways" function
        @param winners the winners addresses
    */
    function registerGiveawayWinners(address[] memory winners) public onlyOwner {
        for(uint32 i = 0; i < winners.length; i++){
            if(!hasRole(giveawayWinnerRole, winners[i])){
                grantRole(giveawayWinnerRole, winners[i]); 
            }
            giveaways[winners[i]]++;
        }
    }

    /**
        Toggle the presale state
    */
    function flipPresaleState() public onlyOwner {
        presaleIsActive = !presaleIsActive;
    }

    /**
        Toggle the official sale state
    */
    function flipSaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }

    /**
        Mint a unique surprise :)
        @param winner the big winner of the surprise
    */
    function mintCholrone(address winner) public onlyOwner {
        require(cholroneMintedCount < NUMBER_OF_CHOLRONE, "Cholrone as already been minted");
        require(winner != owner(), "Cholrone cannot be minted by the owner");
        _safeMint(
            winner, 
            MAX_NFTS.add(
                NUMBER_OF_GIVEAWAY.add(
                    cholroneMintedCount.add(1)
                )
            )
        );
        cholroneMintedCount++;
        emit CholroneSafeMinted(winner);
    }

 
    /**
        Claim all the sender's giveaway 
    */
    function claimMyGiveAways() public onlyRole(giveawayWinnerRole){
        require(hasRole(giveawayWinnerRole, msg.sender), "You didn't won any giveaway");
        require(giveaways[msg.sender] > 0, "You already claim all your givaways, wait for the next one");

        for(uint32 i = 0; i < giveaways[msg.sender]; i++){
            uint mintIndex = totalSupply();
            _safeMint(msg.sender, mintIndex);
            count += 1;
        }

        giveaways[msg.sender] = 0;
    }

    
    /**
        Mint a nft during the presale
    */
    function buyNftOnPresale() public payable onlyRole(whiteListedRole) {
        require(presaleIsActive, "Preale must be active to mint Nft");
        require(!saleIsActive, "Presale as been closed");
        require(totalSupply().add(1) <= MAX_NFTS.add(NUMBER_OF_GIVEAWAY), "Purchase would exceed max supply of Nfts");
        require(nftPrice <= msg.value, "Ether value sent is not correct");
        require(presaled[msg.sender] == 0, "You can't mint more than 1 token with the same account");

        uint256[] memory output = new uint256[](1);

        uint mintIndex = totalSupply();
        _safeMint(msg.sender, mintIndex);
        output[0] = mintIndex;
        count += 1;

        presaled[msg.sender] = count;
        
        emit SafeMinted(msg.sender, 0, output, false);
    }

    /**
        Mint a nft during the official sale
        @param timeStamp the current timestamp, used for the dragons of zobrotera quest/game
        @param numberOfToken the number of token to mint
    */
    function mintNft(uint64 timeStamp, uint64 numberOfToken) public payable {
        require(saleIsActive, "Sale must be active to mint Nft");
        require(totalSupply().add(numberOfToken) <= MAX_NFTS.add(NUMBER_OF_GIVEAWAY), "Purchase would exceed max supply of Nfts");
        require(nftPrice.mul(numberOfToken) <= msg.value, "Ether value sent is not correct");
        require(numberOfToken <= maxNftPurchase, "You can't mint more than 20 token in the same transaction");

        uint256[] memory output = new uint256[](numberOfToken);

        for(uint32 i = 0; i < numberOfToken; i++){
            uint mintIndex = totalSupply();
            _safeMint(msg.sender, mintIndex);
            output[i] = mintIndex;
            count += 1;
        }

        emit SafeMinted(msg.sender, timeStamp, output, false);
    }

    /**
        Get the current number of minted tokens 
        @return uint256
    */
    function getCount() public view returns(uint256) {
        return count;
    }

    /**
        Get the current total supply
        @return uint256
    */
    function totalSupply() public view returns (uint256) {
        return getCount();
    }

    /**
        Get the current official sale state
        @return boolean
    */
    function isSaleActive() public view returns (bool) {
        return saleIsActive;
    }

    /**
        Get the current presale state
        @return boolean
    */
    function isPresaleActive() public view returns (bool) {
        return presaleIsActive;
    }

    /**
        Check if an address is white listed for the presale
        @param addr the address to check
        @return boolean
    */
    function isAddressWhitelisted(address addr) public view returns (bool){
        return hasRole(whiteListedRole, addr);
    }

    /**
        Check if the sender already bought the nft he could buy on presale, return the bought tokenID plus 1 or 0 if not token as been bought on presale
        @return uint256
    */
    function didSenderBoughtOnPresale() public view returns (uint256){
        return presaled[msg.sender];
    }

    /**
        Emergency: price can be changed in case of large fluctuations in ETH price.
        This feature is here to prevent nft from having prices that are too different from each other.
        WITH A MAXIMUM OF 0.1 ETH
        @param newPrice the new nft price
    */
    function emergencyChangePrice(uint256 newPrice) public onlyOwner {
        require(newPrice <= 0.1 * (10 ** 18), "Price can't exceed 0.1 ETH");
        nftPrice = newPrice;
    }
}

File 1 of 17: AccessControl.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IAccessControl.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

abstract contract AccessControl is Context, IAccessControl {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    function _grantRole(bytes32 role, address account) private {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _revokeRole(bytes32 role, address account) private {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

File 2 of 17: Address.sol
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // 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);
            }
        }
    }
}

File 3 of 17: Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

File 5 of 17: EnumerableMap.sol
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

/**
 * @dev Library for managing an enumerable variant of Solidity's
 * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`]
 * type.
 *
 * Maps have the following properties:
 *
 * - Entries are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Entries are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableMap for EnumerableMap.UintToAddressMap;
 *
 *     // Declare a set state variable
 *     EnumerableMap.UintToAddressMap private myMap;
 * }
 * ```
 *
 * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are
 * supported.
 */
library EnumerableMap {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Map type with
    // bytes32 keys and values.
    // The Map implementation uses private functions, and user-facing
    // implementations (such as Uint256ToAddressMap) are just wrappers around
    // the underlying Map.
    // This means that we can only create new EnumerableMaps for types that fit
    // in bytes32.

    struct MapEntry {
        bytes32 _key;
        bytes32 _value;
    }

    struct Map {
        // Storage of map keys and values
        MapEntry[] _entries;

        // Position of the entry defined by a key in the `entries` array, plus 1
        // because index 0 means a key is not in the map.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) {
        // We read and store the key's index to prevent multiple reads from the same storage slot
        uint256 keyIndex = map._indexes[key];

        if (keyIndex == 0) { // Equivalent to !contains(map, key)
            map._entries.push(MapEntry({ _key: key, _value: value }));
            // The entry is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            map._indexes[key] = map._entries.length;
            return true;
        } else {
            map._entries[keyIndex - 1]._value = value;
            return false;
        }
    }

    /**
     * @dev Removes a key-value pair from a map. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function _remove(Map storage map, bytes32 key) private returns (bool) {
        // We read and store the key's index to prevent multiple reads from the same storage slot
        uint256 keyIndex = map._indexes[key];

        if (keyIndex != 0) { // Equivalent to contains(map, key)
            // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one
            // in the array, and then remove the last entry (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = keyIndex - 1;
            uint256 lastIndex = map._entries.length - 1;

            // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            MapEntry storage lastEntry = map._entries[lastIndex];

            // Move the last entry to the index where the entry to delete is
            map._entries[toDeleteIndex] = lastEntry;
            // Update the index for the moved entry
            map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved entry was stored
            map._entries.pop();

            // Delete the index for the deleted slot
            delete map._indexes[key];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the key is in the map. O(1).
     */
    function _contains(Map storage map, bytes32 key) private view returns (bool) {
        return map._indexes[key] != 0;
    }

    /**
     * @dev Returns the number of key-value pairs in the map. O(1).
     */
    function _length(Map storage map) private view returns (uint256) {
        return map._entries.length;
    }

   /**
    * @dev Returns the key-value pair stored at position `index` in the map. O(1).
    *
    * Note that there are no guarantees on the ordering of entries inside the
    * array, and it may change when more entries are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) {
        require(map._entries.length > index, "EnumerableMap: index out of bounds");

        MapEntry storage entry = map._entries[index];
        return (entry._key, entry._value);
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     */
    function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) {
        uint256 keyIndex = map._indexes[key];
        if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key)
        return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function _get(Map storage map, bytes32 key) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    /**
     * @dev Same as {_get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {_tryGet}.
     */
    function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    // UintToAddressMap

    struct UintToAddressMap {
        Map _inner;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) {
        return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) {
        return _remove(map._inner, bytes32(key));
    }

    /**
     * @dev Returns true if the key is in the map. O(1).
     */
    function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) {
        return _contains(map._inner, bytes32(key));
    }

    /**
     * @dev Returns the number of elements in the map. O(1).
     */
    function length(UintToAddressMap storage map) internal view returns (uint256) {
        return _length(map._inner);
    }

   /**
    * @dev Returns the element stored at position `index` in the set. O(1).
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {
        (bytes32 key, bytes32 value) = _at(map._inner, index);
        return (uint256(key), address(uint160(uint256(value))));
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     *
     * _Available since v3.4._
     */
    function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) {
        (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key));
        return (success, address(uint160(uint256(value))));
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key)))));
    }

    /**
     * @dev Same as {get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryGet}.
     */
    function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage))));
    }
}

File 6 of 17: EnumerableSet.sol
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }


    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}

File 7 of 17: ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 8 of 17: ERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Tokens base uri
    string private baseURI;

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

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

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

    function _setBaseURI(string memory newBaseURI) public onlyOwner {
        baseURI = newBaseURI;
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

File 9 of 17: IAccessControl.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

File 10 of 17: IERC165.sol
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

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

File 11 of 17: IERC721.sol
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

import "./IERC165.sol";


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

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

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

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

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

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

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

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

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

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

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

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

File 12 of 17: IERC721Enumerable.sol
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

File 13 of 17: IERC721Metadata.sol
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

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

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

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

File 14 of 17: IERC721Receiver.sol
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

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

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

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

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

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

File 16 of 17: SafeMath.sol
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
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) {
        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) {
        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) {
        // 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) {
        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) {
        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) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @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) {
        require(b <= a, "SafeMath: subtraction overflow");
        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) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @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. 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) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        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) {
        require(b > 0, "SafeMath: modulo by zero");
        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) {
        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.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * 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) {
        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) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"who","type":"address"}],"name":"CholroneSafeMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"winners","type":"address[]"}],"name":"GiveawaySafeMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"who","type":"address"},{"indexed":false,"internalType":"uint64","name":"timestamp","type":"uint64"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"bool","name":"isTestMint","type":"bool"}],"name":"SafeMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"_setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyNftOnPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claimMyGiveAways","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"didSenderBoughtOnPresale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"emergencyChangePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPresaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isAddressWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxNftPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"winner","type":"address"}],"name":"mintCholrone","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"timeStamp","type":"uint64"},{"internalType":"uint64","name":"numberOfToken","type":"uint64"}],"name":"mintNft","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":[{"internalType":"address[]","name":"winners","type":"address[]"}],"name":"registerGiveawayWinners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numberOfGiveaway","type":"uint256"}],"name":"reserveGiveaways","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","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":"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":[],"name":"testMintToOwner","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"whitelistAddressesForPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600b556402540be400600c5566f5232269808000600d556064600e55600e5461271062000034919062000535565b600f556000601060006101000a81548160ff0219169083151502179055506000601060016101000a81548160ff021916908315150217905550600160115560006012553480156200008457600080fd5b506040518060400160405280601481526020017f447261676f6e73206f66205a6f62726f746572610000000000000000000000008152506040518060400160405280600381526020017f444f5a00000000000000000000000000000000000000000000000000000000008152506200011162000105620001c260201b60201c565b620001ca60201b60201c565b81600190805190602001906200012992919062000485565b5080600290805190602001906200014292919062000485565b5050506200017a7f0f888941bd07ea31c6e78b607c9e2c2f0a375eb86daa19a04e532dffc7545ca86000801b6200028e60201b60201c565b620001bc620001af7f0f888941bd07ea31c6e78b607c9e2c2f0a375eb86daa19a04e532dffc7545ca8620002f260201b60201c565b336200031260201b60201c565b6200060e565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000620002a183620002f260201b60201c565b90508160086000858152602001908152602001600020600101819055508181847fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff60405160405180910390a4505050565b600060086000838152602001908152602001600020600101549050919050565b6200032482826200032860201b60201c565b5050565b6200033a82826200041a60201b60201c565b620004165760016008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620003bb620001c260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b82805462000493906200057a565b90600052602060002090601f016020900481019282620004b7576000855562000503565b82601f10620004d257805160ff191683800117855562000503565b8280016001018555821562000503579182015b8281111562000502578251825591602001919060010190620004e5565b5b50905062000512919062000516565b5090565b5b808211156200053157600081600090555060010162000517565b5090565b6000620005428262000570565b91506200054f8362000570565b925082821015620005655762000564620005b0565b5b828203905092915050565b6000819050919050565b600060028204905060018216806200059357607f821691505b60208210811415620005aa57620005a9620005df565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615909806200061e6000396000f3fe6080604052600436106102515760003560e01c80636352211e11610139578063a22cb465116100b6578063c87b56dd1161007a578063c87b56dd14610834578063cbb8451414610871578063d547741f1461089a578063e985e9c5146108c3578063f2fde38b14610900578063f81227d41461092957610251565b8063a22cb46514610761578063a87d942c1461078a578063b88d4fde146107b5578063bde708f4146107de578063bf124bc41461080957610251565b80638da5cb5b116100fd5780638da5cb5b1461067a57806391d14854146106a557806395d89b41146106e25780639a58332d1461070d578063a217fddf1461073657610251565b80636352211e146105a9578063650237c3146105e657806370a082311461060f578063715018a61461064c578063747f15541461066357610251565b80632d92a9ca116101d25780633b0b04c7116101965780633b0b04c7146104ce5780633ccfd60b146104f757806342842e0e1461050e578063564566a8146105375780635ef636171461056257806360d938dc1461057e57610251565b80632d92a9ca146104325780632f2ff15d1461043c57806331b5b9071461046557806334918dfd1461048e57806336568abe146104a557610251565b806318160ddd1161021957806318160ddd146103615780631da36bca1461038c5780631e26ed3f146103a357806323b872dd146103cc578063248a9ca3146103f557610251565b806301ffc9a71461025657806306fdde0314610293578063081812fc146102be578063095ea7b3146102fb57806313f44d1014610324575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190613cc0565b610940565b60405161028a91906145d4565b60405180910390f35b34801561029f57600080fd5b506102a8610a22565b6040516102b5919061460a565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e09190613d63565b610ab4565b6040516102f291906144d5565b60405180910390f35b34801561030757600080fd5b50610322600480360381019061031d9190613bca565b610b39565b005b34801561033057600080fd5b5061034b60048036038101906103469190613a47565b610c51565b60405161035891906145d4565b60405180910390f35b34801561036d57600080fd5b50610376610c84565b6040516103839190614a2c565b60405180910390f35b34801561039857600080fd5b506103a1610c93565b005b3480156103af57600080fd5b506103ca60048036038101906103c59190613c0a565b610d49565b005b3480156103d857600080fd5b506103f360048036038101906103ee9190613ab4565b610efc565b005b34801561040157600080fd5b5061041c60048036038101906104179190613c53565b610f5c565b60405161042991906145ef565b60405180910390f35b61043a610f7c565b005b34801561044857600080fd5b50610463600480360381019061045e9190613c80565b6112b0565b005b34801561047157600080fd5b5061048c60048036038101906104879190613d1a565b6112d9565b005b34801561049a57600080fd5b506104a361136f565b005b3480156104b157600080fd5b506104cc60048036038101906104c79190613c80565b611417565b005b3480156104da57600080fd5b506104f560048036038101906104f09190613d63565b61149a565b005b34801561050357600080fd5b5061050c611534565b005b34801561051a57600080fd5b5061053560048036038101906105309190613ab4565b611606565b005b34801561054357600080fd5b5061054c611626565b60405161055991906145d4565b60405180910390f35b61057c60048036038101906105779190613d90565b61163d565b005b34801561058a57600080fd5b506105936118d7565b6040516105a091906145d4565b60405180910390f35b3480156105b557600080fd5b506105d060048036038101906105cb9190613d63565b6118ee565b6040516105dd91906144d5565b60405180910390f35b3480156105f257600080fd5b5061060d60048036038101906106089190613c0a565b6119a0565b005b34801561061b57600080fd5b5061063660048036038101906106319190613a47565b611a8f565b6040516106439190614a2c565b60405180910390f35b34801561065857600080fd5b50610661611b47565b005b34801561066f57600080fd5b50610678611bcf565b005b34801561068657600080fd5b5061068f611dc9565b60405161069c91906144d5565b60405180910390f35b3480156106b157600080fd5b506106cc60048036038101906106c79190613c80565b611df2565b6040516106d991906145d4565b60405180910390f35b3480156106ee57600080fd5b506106f7611e5d565b604051610704919061460a565b60405180910390f35b34801561071957600080fd5b50610734600480360381019061072f9190613d63565b611eef565b005b34801561074257600080fd5b5061074b611fc0565b60405161075891906145ef565b60405180910390f35b34801561076d57600080fd5b5061078860048036038101906107839190613b8a565b611fc7565b005b34801561079657600080fd5b5061079f612148565b6040516107ac9190614a2c565b60405180910390f35b3480156107c157600080fd5b506107dc60048036038101906107d79190613b07565b612152565b005b3480156107ea57600080fd5b506107f36121b4565b6040516108009190614a2c565b60405180910390f35b34801561081557600080fd5b5061081e6121b9565b60405161082b9190614a2c565b60405180910390f35b34801561084057600080fd5b5061085b60048036038101906108569190613d63565b612200565b604051610868919061460a565b60405180910390f35b34801561087d57600080fd5b5061089860048036038101906108939190613a47565b6122a8565b005b3480156108a657600080fd5b506108c160048036038101906108bc9190613c80565b612479565b005b3480156108cf57600080fd5b506108ea60048036038101906108e59190613a74565b6124a2565b6040516108f791906145d4565b60405180910390f35b34801561090c57600080fd5b5061092760048036038101906109229190613a47565b612536565b005b34801561093557600080fd5b5061093e61262e565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a0b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a1b5750610a1a826126d6565b5b9050919050565b606060018054610a3190614dc0565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5d90614dc0565b8015610aaa5780601f10610a7f57610100808354040283529160200191610aaa565b820191906000526020600020905b815481529060010190602001808311610a8d57829003601f168201915b5050505050905090565b6000610abf82612740565b610afe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af5906148ac565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b44826118ee565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bac9061492c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bd46127ac565b73ffffffffffffffffffffffffffffffffffffffff161480610c035750610c0281610bfd6127ac565b6124a2565b5b610c42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c39906147ac565b60405180910390fd5b610c4c83836127b4565b505050565b6000610c7d7f0f888941bd07ea31c6e78b607c9e2c2f0a375eb86daa19a04e532dffc7545ca883611df2565b9050919050565b6000610c8e612148565b905090565b610c9b6127ac565b73ffffffffffffffffffffffffffffffffffffffff16610cb9611dc9565b73ffffffffffffffffffffffffffffffffffffffff1614610d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d06906148cc565b60405180910390fd5b6000610d19610c84565b9050610d2c610d26611dc9565b8261286d565b6001600b6000828254610d3f9190614b8b565b9250508190555050565b610d516127ac565b73ffffffffffffffffffffffffffffffffffffffff16610d6f611dc9565b73ffffffffffffffffffffffffffffffffffffffff1614610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc906148cc565b60405180910390fd5b60005b81518163ffffffff161015610ef857610e217f38c830a0bfdbb6cf96d04365c79874a85961d7124f3140ea40bc9cec2f6431cc838363ffffffff1681518110610e1457610e13614f57565b5b6020026020010151611df2565b610e7057610e6f7f38c830a0bfdbb6cf96d04365c79874a85961d7124f3140ea40bc9cec2f6431cc838363ffffffff1681518110610e6257610e61614f57565b5b60200260200101516112b0565b5b600a6000838363ffffffff1681518110610e8d57610e8c614f57565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610ee090614e23565b91905055508080610ef090614e6c565b915050610dc8565b5050565b610f0d610f076127ac565b8261288b565b610f4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f439061494c565b60405180910390fd5b610f57838383612969565b505050565b600060086000838152602001908152602001600020600101549050919050565b7f0f888941bd07ea31c6e78b607c9e2c2f0a375eb86daa19a04e532dffc7545ca8610fae81610fa96127ac565b612bc5565b601060019054906101000a900460ff16610ffd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff49061486c565b60405180910390fd5b601060009054906101000a900460ff161561104d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110449061464c565b60405180910390fd5b611064600e54600f54612c6290919063ffffffff16565b61107f6001611071610c84565b612c6290919063ffffffff16565b11156110c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b79061496c565b60405180910390fd5b34600d541115611105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fc9061474c565b60405180910390fd5b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117e906149ac565b60405180910390fd5b6000600167ffffffffffffffff8111156111a4576111a3614f86565b5b6040519080825280602002602001820160405280156111d25781602001602082028036833780820191505090505b50905060006111df610c84565b90506111eb338261286d565b8082600081518110611200576111ff614f57565b5b6020026020010181815250506001600b600082825461121f9190614b8b565b92505081905550600b54600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f66c885093f8b60d89579c8ca08ef6abfe917fd3b86cf658e8c36a42f7231f7803360008460006040516112a3949392919061453c565b60405180910390a1505050565b6112b982610f5c565b6112ca816112c56127ac565b612bc5565b6112d48383612cc0565b505050565b6112e16127ac565b73ffffffffffffffffffffffffffffffffffffffff166112ff611dc9565b73ffffffffffffffffffffffffffffffffffffffff1614611355576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134c906148cc565b60405180910390fd5b806003908051906020019061136b929190613793565b5050565b6113776127ac565b73ffffffffffffffffffffffffffffffffffffffff16611395611dc9565b73ffffffffffffffffffffffffffffffffffffffff16146113eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e2906148cc565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b61141f6127ac565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461148c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611483906149ec565b60405180910390fd5b6114968282612da1565b5050565b6114a26127ac565b73ffffffffffffffffffffffffffffffffffffffff166114c0611dc9565b73ffffffffffffffffffffffffffffffffffffffff1614611516576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150d906148cc565b60405180910390fd5b80600e819055508061271061152b9190614c6c565b600f8190555050565b61153c6127ac565b73ffffffffffffffffffffffffffffffffffffffff1661155a611dc9565b73ffffffffffffffffffffffffffffffffffffffff16146115b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a7906148cc565b60405180910390fd5b60004790506115bd611dc9565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611602573d6000803e3d6000fd5b5050565b61162183838360405180602001604052806000815250612152565b505050565b6000601060009054906101000a900460ff16905090565b601060009054906101000a900460ff1661168c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611683906149cc565b60405180910390fd5b6116a3600e54600f54612c6290919063ffffffff16565b6116c78267ffffffffffffffff166116b9610c84565b612c6290919063ffffffff16565b1115611708576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ff9061496c565b60405180910390fd5b346117288267ffffffffffffffff16600d54612e8390919063ffffffff16565b1115611769576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117609061474c565b60405180910390fd5b60148167ffffffffffffffff1611156117b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ae9061498c565b60405180910390fd5b60008167ffffffffffffffff1667ffffffffffffffff8111156117dd576117dc614f86565b5b60405190808252806020026020018201604052801561180b5781602001602082028036833780820191505090505b50905060005b8267ffffffffffffffff168163ffffffff161015611893576000611833610c84565b905061183f338261286d565b80838363ffffffff168151811061185957611858614f57565b5b6020026020010181815250506001600b60008282546118789190614b8b565b9250508190555050808061188b90614e6c565b915050611811565b507f66c885093f8b60d89579c8ca08ef6abfe917fd3b86cf658e8c36a42f7231f78033848360006040516118ca9493929190614588565b60405180910390a1505050565b6000601060019054906101000a900460ff16905090565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198e906147ec565b60405180910390fd5b80915050919050565b6119a86127ac565b73ffffffffffffffffffffffffffffffffffffffff166119c6611dc9565b73ffffffffffffffffffffffffffffffffffffffff1614611a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a13906148cc565b60405180910390fd5b60005b81518163ffffffff161015611a8b57611a787f0f888941bd07ea31c6e78b607c9e2c2f0a375eb86daa19a04e532dffc7545ca8838363ffffffff1681518110611a6b57611a6a614f57565b5b60200260200101516112b0565b8080611a8390614e6c565b915050611a1f565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af7906147cc565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611b4f6127ac565b73ffffffffffffffffffffffffffffffffffffffff16611b6d611dc9565b73ffffffffffffffffffffffffffffffffffffffff1614611bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bba906148cc565b60405180910390fd5b611bcd6000612efe565b565b7f38c830a0bfdbb6cf96d04365c79874a85961d7124f3140ea40bc9cec2f6431cc611c0181611bfc6127ac565b612bc5565b611c2b7f38c830a0bfdbb6cf96d04365c79874a85961d7124f3140ea40bc9cec2f6431cc33611df2565b611c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c61906146ec565b60405180910390fd5b6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611cec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce39061484c565b60405180910390fd5b60005b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548163ffffffff161015611d80576000611d46610c84565b9050611d52338261286d565b6001600b6000828254611d659190614b8b565b92505081905550508080611d7890614e6c565b915050611cef565b506000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060028054611e6c90614dc0565b80601f0160208091040260200160405190810160405280929190818152602001828054611e9890614dc0565b8015611ee55780601f10611eba57610100808354040283529160200191611ee5565b820191906000526020600020905b815481529060010190602001808311611ec857829003601f168201915b5050505050905090565b611ef76127ac565b73ffffffffffffffffffffffffffffffffffffffff16611f15611dc9565b73ffffffffffffffffffffffffffffffffffffffff1614611f6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f62906148cc565b60405180910390fd5b67016345785d8a0000811115611fb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fad9061478c565b60405180910390fd5b80600d8190555050565b6000801b81565b611fcf6127ac565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561203d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120349061472c565b60405180910390fd5b806007600061204a6127ac565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120f76127ac565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161213c91906145d4565b60405180910390a35050565b6000600b54905090565b61216361215d6127ac565b8361288b565b6121a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121999061494c565b60405180910390fd5b6121ae84848484612fc2565b50505050565b601481565b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b606061220b82612740565b61224a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122419061490c565b60405180910390fd5b60006003805461225990614dc0565b90501161227557604051806020016040528060008152506122a1565b60036122808361301e565b604051602001612291929190614477565b6040516020818303038152906040525b9050919050565b6122b06127ac565b73ffffffffffffffffffffffffffffffffffffffff166122ce611dc9565b73ffffffffffffffffffffffffffffffffffffffff1614612324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231b906148cc565b60405180910390fd5b6011546012541061236a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123619061480c565b60405180910390fd5b612372611dc9565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d790614a0c565b60405180910390fd5b612427816124226124116124006001601254612c6290919063ffffffff16565b600e54612c6290919063ffffffff16565b600f54612c6290919063ffffffff16565b61286d565b6012600081548092919061243a90614e23565b91905055507f896fee137490044e865f8ba89cd69efa690a55330c5fbaf2fe523b637eccbb418160405161246e91906144d5565b60405180910390a150565b61248282610f5c565b6124938161248e6127ac565b612bc5565b61249d8383612da1565b505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61253e6127ac565b73ffffffffffffffffffffffffffffffffffffffff1661255c611dc9565b73ffffffffffffffffffffffffffffffffffffffff16146125b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a9906148cc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612622576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126199061468c565b60405180910390fd5b61262b81612efe565b50565b6126366127ac565b73ffffffffffffffffffffffffffffffffffffffff16612654611dc9565b73ffffffffffffffffffffffffffffffffffffffff16146126aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a1906148cc565b60405180910390fd5b601060019054906101000a900460ff1615601060016101000a81548160ff021916908315150217905550565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612827836118ee565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61288782826040518060200160405280600081525061317f565b5050565b600061289682612740565b6128d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128cc9061476c565b60405180910390fd5b60006128e0836118ee565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061294f57508373ffffffffffffffffffffffffffffffffffffffff1661293784610ab4565b73ffffffffffffffffffffffffffffffffffffffff16145b80612960575061295f81856124a2565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612989826118ee565b73ffffffffffffffffffffffffffffffffffffffff16146129df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d6906148ec565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a469061470c565b60405180910390fd5b612a5a8383836131da565b612a656000826127b4565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ab59190614c6c565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b0c9190614b8b565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612bcf8282611df2565b612c5e57612bf48173ffffffffffffffffffffffffffffffffffffffff1660146131df565b612c028360001c60206131df565b604051602001612c1392919061449b565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c55919061460a565b60405180910390fd5b5050565b6000808284612c719190614b8b565b905083811015612cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cad906146cc565b60405180910390fd5b8091505092915050565b612cca8282611df2565b612d9d5760016008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612d426127ac565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b612dab8282611df2565b15612e7f5760006008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612e246127ac565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600080831415612e965760009050612ef8565b60008284612ea49190614c12565b9050828482612eb39190614be1565b14612ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eea9061488c565b60405180910390fd5b809150505b92915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612fcd848484612969565b612fd98484848461341b565b613018576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300f9061466c565b60405180910390fd5b50505050565b60606000821415613066576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061317a565b600082905060005b6000821461309857808061308190614e23565b915050600a826130919190614be1565b915061306e565b60008167ffffffffffffffff8111156130b4576130b3614f86565b5b6040519080825280601f01601f1916602001820160405280156130e65781602001600182028036833780820191505090505b5090505b60008514613173576001826130ff9190614c6c565b9150600a8561310e9190614e99565b603061311a9190614b8b565b60f81b8183815181106131305761312f614f57565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561316c9190614be1565b94506130ea565b8093505050505b919050565b61318983836135b2565b613196600084848461341b565b6131d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131cc9061466c565b60405180910390fd5b505050565b505050565b6060600060028360026131f29190614c12565b6131fc9190614b8b565b67ffffffffffffffff81111561321557613214614f86565b5b6040519080825280601f01601f1916602001820160405280156132475781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061327f5761327e614f57565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106132e3576132e2614f57565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026133239190614c12565b61332d9190614b8b565b90505b60018111156133cd577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061336f5761336e614f57565b5b1a60f81b82828151811061338657613385614f57565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806133c690614d96565b9050613330565b5060008414613411576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134089061462c565b60405180910390fd5b8091505092915050565b600061343c8473ffffffffffffffffffffffffffffffffffffffff16613780565b156135a5578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026134656127ac565b8786866040518563ffffffff1660e01b815260040161348794939291906144f0565b602060405180830381600087803b1580156134a157600080fd5b505af19250505080156134d257506040513d601f19601f820116820180604052508101906134cf9190613ced565b60015b613555573d8060008114613502576040519150601f19603f3d011682016040523d82523d6000602084013e613507565b606091505b5060008151141561354d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135449061466c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506135aa565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613622576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136199061482c565b60405180910390fd5b61362b81612740565b1561366b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613662906146ac565b60405180910390fd5b613677600083836131da565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546136c79190614b8b565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461379f90614dc0565b90600052602060002090601f0160209004810192826137c15760008555613808565b82601f106137da57805160ff1916838001178555613808565b82800160010185558215613808579182015b828111156138075782518255916020019190600101906137ec565b5b5090506138159190613819565b5090565b5b8082111561383257600081600090555060010161381a565b5090565b600061384961384484614a6c565b614a47565b9050808382526020820190508285602086028201111561386c5761386b614fba565b5b60005b8581101561389c5781613882888261392a565b84526020840193506020830192505060018101905061386f565b5050509392505050565b60006138b96138b484614a98565b614a47565b9050828152602081018484840111156138d5576138d4614fbf565b5b6138e0848285614d54565b509392505050565b60006138fb6138f684614ac9565b614a47565b90508281526020810184848401111561391757613916614fbf565b5b613922848285614d54565b509392505050565b60008135905061393981615849565b92915050565b600082601f83011261395457613953614fb5565b5b8135613964848260208601613836565b91505092915050565b60008135905061397c81615860565b92915050565b60008135905061399181615877565b92915050565b6000813590506139a68161588e565b92915050565b6000815190506139bb8161588e565b92915050565b600082601f8301126139d6576139d5614fb5565b5b81356139e68482602086016138a6565b91505092915050565b600082601f830112613a0457613a03614fb5565b5b8135613a148482602086016138e8565b91505092915050565b600081359050613a2c816158a5565b92915050565b600081359050613a41816158bc565b92915050565b600060208284031215613a5d57613a5c614fc9565b5b6000613a6b8482850161392a565b91505092915050565b60008060408385031215613a8b57613a8a614fc9565b5b6000613a998582860161392a565b9250506020613aaa8582860161392a565b9150509250929050565b600080600060608486031215613acd57613acc614fc9565b5b6000613adb8682870161392a565b9350506020613aec8682870161392a565b9250506040613afd86828701613a1d565b9150509250925092565b60008060008060808587031215613b2157613b20614fc9565b5b6000613b2f8782880161392a565b9450506020613b408782880161392a565b9350506040613b5187828801613a1d565b925050606085013567ffffffffffffffff811115613b7257613b71614fc4565b5b613b7e878288016139c1565b91505092959194509250565b60008060408385031215613ba157613ba0614fc9565b5b6000613baf8582860161392a565b9250506020613bc08582860161396d565b9150509250929050565b60008060408385031215613be157613be0614fc9565b5b6000613bef8582860161392a565b9250506020613c0085828601613a1d565b9150509250929050565b600060208284031215613c2057613c1f614fc9565b5b600082013567ffffffffffffffff811115613c3e57613c3d614fc4565b5b613c4a8482850161393f565b91505092915050565b600060208284031215613c6957613c68614fc9565b5b6000613c7784828501613982565b91505092915050565b60008060408385031215613c9757613c96614fc9565b5b6000613ca585828601613982565b9250506020613cb68582860161392a565b9150509250929050565b600060208284031215613cd657613cd5614fc9565b5b6000613ce484828501613997565b91505092915050565b600060208284031215613d0357613d02614fc9565b5b6000613d11848285016139ac565b91505092915050565b600060208284031215613d3057613d2f614fc9565b5b600082013567ffffffffffffffff811115613d4e57613d4d614fc4565b5b613d5a848285016139ef565b91505092915050565b600060208284031215613d7957613d78614fc9565b5b6000613d8784828501613a1d565b91505092915050565b60008060408385031215613da757613da6614fc9565b5b6000613db585828601613a32565b9250506020613dc685828601613a32565b9150509250929050565b6000613ddc838361444a565b60208301905092915050565b613df181614ca0565b82525050565b6000613e0282614b1f565b613e0c8185614b4d565b9350613e1783614afa565b8060005b83811015613e48578151613e2f8882613dd0565b9750613e3a83614b40565b925050600181019050613e1b565b5085935050505092915050565b613e5e81614cb2565b82525050565b613e6d81614cbe565b82525050565b6000613e7e82614b2a565b613e888185614b5e565b9350613e98818560208601614d63565b613ea181614fce565b840191505092915050565b613eb581614d42565b82525050565b6000613ec682614b35565b613ed08185614b6f565b9350613ee0818560208601614d63565b613ee981614fce565b840191505092915050565b6000613eff82614b35565b613f098185614b80565b9350613f19818560208601614d63565b80840191505092915050565b60008154613f3281614dc0565b613f3c8186614b80565b94506001821660008114613f575760018114613f6857613f9b565b60ff19831686528186019350613f9b565b613f7185614b0a565b60005b83811015613f9357815481890152600182019150602081019050613f74565b838801955050505b50505092915050565b6000613fb1602083614b6f565b9150613fbc82614fdf565b602082019050919050565b6000613fd4601683614b6f565b9150613fdf82615008565b602082019050919050565b6000613ff7603283614b6f565b915061400282615031565b604082019050919050565b600061401a602683614b6f565b915061402582615080565b604082019050919050565b600061403d601c83614b6f565b9150614048826150cf565b602082019050919050565b6000614060601b83614b6f565b915061406b826150f8565b602082019050919050565b6000614083601b83614b6f565b915061408e82615121565b602082019050919050565b60006140a6602483614b6f565b91506140b18261514a565b604082019050919050565b60006140c9601983614b6f565b91506140d482615199565b602082019050919050565b60006140ec601f83614b6f565b91506140f7826151c2565b602082019050919050565b600061410f602c83614b6f565b915061411a826151eb565b604082019050919050565b6000614132601a83614b6f565b915061413d8261523a565b602082019050919050565b6000614155603883614b6f565b915061416082615263565b604082019050919050565b6000614178602a83614b6f565b9150614183826152b2565b604082019050919050565b600061419b602983614b6f565b91506141a682615301565b604082019050919050565b60006141be601f83614b6f565b91506141c982615350565b602082019050919050565b60006141e1602083614b6f565b91506141ec82615379565b602082019050919050565b6000614204603a83614b6f565b915061420f826153a2565b604082019050919050565b6000614227602183614b6f565b9150614232826153f1565b604082019050919050565b600061424a602183614b6f565b915061425582615440565b604082019050919050565b600061426d602c83614b6f565b91506142788261548f565b604082019050919050565b6000614290602083614b6f565b915061429b826154de565b602082019050919050565b60006142b3602983614b6f565b91506142be82615507565b604082019050919050565b60006142d6602f83614b6f565b91506142e182615556565b604082019050919050565b60006142f9602183614b6f565b9150614304826155a5565b604082019050919050565b600061431c603183614b6f565b9150614327826155f4565b604082019050919050565b600061433f602883614b6f565b915061434a82615643565b604082019050919050565b6000614362603983614b6f565b915061436d82615692565b604082019050919050565b6000614385603683614b6f565b9150614390826156e1565b604082019050919050565b60006143a8601783614b80565b91506143b382615730565b601782019050919050565b60006143cb601f83614b6f565b91506143d682615759565b602082019050919050565b60006143ee601183614b80565b91506143f982615782565b601182019050919050565b6000614411602f83614b6f565b915061441c826157ab565b604082019050919050565b6000614434602683614b6f565b915061443f826157fa565b604082019050919050565b61445381614d14565b82525050565b61446281614d14565b82525050565b61447181614d2e565b82525050565b60006144838285613f25565b915061448f8284613ef4565b91508190509392505050565b60006144a68261439b565b91506144b28285613ef4565b91506144bd826143e1565b91506144c98284613ef4565b91508190509392505050565b60006020820190506144ea6000830184613de8565b92915050565b60006080820190506145056000830187613de8565b6145126020830186613de8565b61451f6040830185614459565b81810360608301526145318184613e73565b905095945050505050565b60006080820190506145516000830187613de8565b61455e6020830186613eac565b81810360408301526145708185613df7565b905061457f6060830184613e55565b95945050505050565b600060808201905061459d6000830187613de8565b6145aa6020830186614468565b81810360408301526145bc8185613df7565b90506145cb6060830184613e55565b95945050505050565b60006020820190506145e96000830184613e55565b92915050565b60006020820190506146046000830184613e64565b92915050565b600060208201905081810360008301526146248184613ebb565b905092915050565b6000602082019050818103600083015261464581613fa4565b9050919050565b6000602082019050818103600083015261466581613fc7565b9050919050565b6000602082019050818103600083015261468581613fea565b9050919050565b600060208201905081810360008301526146a58161400d565b9050919050565b600060208201905081810360008301526146c581614030565b9050919050565b600060208201905081810360008301526146e581614053565b9050919050565b6000602082019050818103600083015261470581614076565b9050919050565b6000602082019050818103600083015261472581614099565b9050919050565b60006020820190508181036000830152614745816140bc565b9050919050565b60006020820190508181036000830152614765816140df565b9050919050565b6000602082019050818103600083015261478581614102565b9050919050565b600060208201905081810360008301526147a581614125565b9050919050565b600060208201905081810360008301526147c581614148565b9050919050565b600060208201905081810360008301526147e58161416b565b9050919050565b600060208201905081810360008301526148058161418e565b9050919050565b60006020820190508181036000830152614825816141b1565b9050919050565b60006020820190508181036000830152614845816141d4565b9050919050565b60006020820190508181036000830152614865816141f7565b9050919050565b600060208201905081810360008301526148858161421a565b9050919050565b600060208201905081810360008301526148a58161423d565b9050919050565b600060208201905081810360008301526148c581614260565b9050919050565b600060208201905081810360008301526148e581614283565b9050919050565b60006020820190508181036000830152614905816142a6565b9050919050565b60006020820190508181036000830152614925816142c9565b9050919050565b60006020820190508181036000830152614945816142ec565b9050919050565b600060208201905081810360008301526149658161430f565b9050919050565b6000602082019050818103600083015261498581614332565b9050919050565b600060208201905081810360008301526149a581614355565b9050919050565b600060208201905081810360008301526149c581614378565b9050919050565b600060208201905081810360008301526149e5816143be565b9050919050565b60006020820190508181036000830152614a0581614404565b9050919050565b60006020820190508181036000830152614a2581614427565b9050919050565b6000602082019050614a416000830184614459565b92915050565b6000614a51614a62565b9050614a5d8282614df2565b919050565b6000604051905090565b600067ffffffffffffffff821115614a8757614a86614f86565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614ab357614ab2614f86565b5b614abc82614fce565b9050602081019050919050565b600067ffffffffffffffff821115614ae457614ae3614f86565b5b614aed82614fce565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614b9682614d14565b9150614ba183614d14565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614bd657614bd5614eca565b5b828201905092915050565b6000614bec82614d14565b9150614bf783614d14565b925082614c0757614c06614ef9565b5b828204905092915050565b6000614c1d82614d14565b9150614c2883614d14565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614c6157614c60614eca565b5b828202905092915050565b6000614c7782614d14565b9150614c8283614d14565b925082821015614c9557614c94614eca565b5b828203905092915050565b6000614cab82614cf4565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b6000614d4d82614d2e565b9050919050565b82818337600083830152505050565b60005b83811015614d81578082015181840152602081019050614d66565b83811115614d90576000848401525b50505050565b6000614da182614d14565b91506000821415614db557614db4614eca565b5b600182039050919050565b60006002820490506001821680614dd857607f821691505b60208210811415614dec57614deb614f28565b5b50919050565b614dfb82614fce565b810181811067ffffffffffffffff82111715614e1a57614e19614f86565b5b80604052505050565b6000614e2e82614d14565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e6157614e60614eca565b5b600182019050919050565b6000614e7782614d1e565b915063ffffffff821415614e8e57614e8d614eca565b5b600182019050919050565b6000614ea482614d14565b9150614eaf83614d14565b925082614ebf57614ebe614ef9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f50726573616c65206173206265656e20636c6f73656400000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b7f596f75206469646e277420776f6e20616e792067697665617761790000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f50726963652063616e27742065786365656420302e3120455448000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f43686f6c726f6e6520617320616c7265616479206265656e206d696e74656400600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f596f7520616c726561647920636c61696d20616c6c20796f757220676976617760008201527f6179732c207761697420666f7220746865206e657874206f6e65000000000000602082015250565b7f507265616c65206d7573742062652061637469766520746f206d696e74204e6660008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f66204e667473000000000000000000000000000000000000000000000000602082015250565b7f596f752063616e2774206d696e74206d6f7265207468616e20323020746f6b6560008201527f6e20696e207468652073616d65207472616e73616374696f6e00000000000000602082015250565b7f596f752063616e2774206d696e74206d6f7265207468616e203120746f6b656e60008201527f2077697468207468652073616d65206163636f756e7400000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f53616c65206d7573742062652061637469766520746f206d696e74204e667400600082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b7f43686f6c726f6e652063616e6e6f74206265206d696e7465642062792074686560008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b61585281614ca0565b811461585d57600080fd5b50565b61586981614cb2565b811461587457600080fd5b50565b61588081614cbe565b811461588b57600080fd5b50565b61589781614cc8565b81146158a257600080fd5b50565b6158ae81614d14565b81146158b957600080fd5b50565b6158c581614d2e565b81146158d057600080fd5b5056fea26469706673582212201b5e3c78f5d65189ec39bc1c02cc8152aeb53029e04ade6498e75242eca2be3664736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102515760003560e01c80636352211e11610139578063a22cb465116100b6578063c87b56dd1161007a578063c87b56dd14610834578063cbb8451414610871578063d547741f1461089a578063e985e9c5146108c3578063f2fde38b14610900578063f81227d41461092957610251565b8063a22cb46514610761578063a87d942c1461078a578063b88d4fde146107b5578063bde708f4146107de578063bf124bc41461080957610251565b80638da5cb5b116100fd5780638da5cb5b1461067a57806391d14854146106a557806395d89b41146106e25780639a58332d1461070d578063a217fddf1461073657610251565b80636352211e146105a9578063650237c3146105e657806370a082311461060f578063715018a61461064c578063747f15541461066357610251565b80632d92a9ca116101d25780633b0b04c7116101965780633b0b04c7146104ce5780633ccfd60b146104f757806342842e0e1461050e578063564566a8146105375780635ef636171461056257806360d938dc1461057e57610251565b80632d92a9ca146104325780632f2ff15d1461043c57806331b5b9071461046557806334918dfd1461048e57806336568abe146104a557610251565b806318160ddd1161021957806318160ddd146103615780631da36bca1461038c5780631e26ed3f146103a357806323b872dd146103cc578063248a9ca3146103f557610251565b806301ffc9a71461025657806306fdde0314610293578063081812fc146102be578063095ea7b3146102fb57806313f44d1014610324575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190613cc0565b610940565b60405161028a91906145d4565b60405180910390f35b34801561029f57600080fd5b506102a8610a22565b6040516102b5919061460a565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e09190613d63565b610ab4565b6040516102f291906144d5565b60405180910390f35b34801561030757600080fd5b50610322600480360381019061031d9190613bca565b610b39565b005b34801561033057600080fd5b5061034b60048036038101906103469190613a47565b610c51565b60405161035891906145d4565b60405180910390f35b34801561036d57600080fd5b50610376610c84565b6040516103839190614a2c565b60405180910390f35b34801561039857600080fd5b506103a1610c93565b005b3480156103af57600080fd5b506103ca60048036038101906103c59190613c0a565b610d49565b005b3480156103d857600080fd5b506103f360048036038101906103ee9190613ab4565b610efc565b005b34801561040157600080fd5b5061041c60048036038101906104179190613c53565b610f5c565b60405161042991906145ef565b60405180910390f35b61043a610f7c565b005b34801561044857600080fd5b50610463600480360381019061045e9190613c80565b6112b0565b005b34801561047157600080fd5b5061048c60048036038101906104879190613d1a565b6112d9565b005b34801561049a57600080fd5b506104a361136f565b005b3480156104b157600080fd5b506104cc60048036038101906104c79190613c80565b611417565b005b3480156104da57600080fd5b506104f560048036038101906104f09190613d63565b61149a565b005b34801561050357600080fd5b5061050c611534565b005b34801561051a57600080fd5b5061053560048036038101906105309190613ab4565b611606565b005b34801561054357600080fd5b5061054c611626565b60405161055991906145d4565b60405180910390f35b61057c60048036038101906105779190613d90565b61163d565b005b34801561058a57600080fd5b506105936118d7565b6040516105a091906145d4565b60405180910390f35b3480156105b557600080fd5b506105d060048036038101906105cb9190613d63565b6118ee565b6040516105dd91906144d5565b60405180910390f35b3480156105f257600080fd5b5061060d60048036038101906106089190613c0a565b6119a0565b005b34801561061b57600080fd5b5061063660048036038101906106319190613a47565b611a8f565b6040516106439190614a2c565b60405180910390f35b34801561065857600080fd5b50610661611b47565b005b34801561066f57600080fd5b50610678611bcf565b005b34801561068657600080fd5b5061068f611dc9565b60405161069c91906144d5565b60405180910390f35b3480156106b157600080fd5b506106cc60048036038101906106c79190613c80565b611df2565b6040516106d991906145d4565b60405180910390f35b3480156106ee57600080fd5b506106f7611e5d565b604051610704919061460a565b60405180910390f35b34801561071957600080fd5b50610734600480360381019061072f9190613d63565b611eef565b005b34801561074257600080fd5b5061074b611fc0565b60405161075891906145ef565b60405180910390f35b34801561076d57600080fd5b5061078860048036038101906107839190613b8a565b611fc7565b005b34801561079657600080fd5b5061079f612148565b6040516107ac9190614a2c565b60405180910390f35b3480156107c157600080fd5b506107dc60048036038101906107d79190613b07565b612152565b005b3480156107ea57600080fd5b506107f36121b4565b6040516108009190614a2c565b60405180910390f35b34801561081557600080fd5b5061081e6121b9565b60405161082b9190614a2c565b60405180910390f35b34801561084057600080fd5b5061085b60048036038101906108569190613d63565b612200565b604051610868919061460a565b60405180910390f35b34801561087d57600080fd5b5061089860048036038101906108939190613a47565b6122a8565b005b3480156108a657600080fd5b506108c160048036038101906108bc9190613c80565b612479565b005b3480156108cf57600080fd5b506108ea60048036038101906108e59190613a74565b6124a2565b6040516108f791906145d4565b60405180910390f35b34801561090c57600080fd5b5061092760048036038101906109229190613a47565b612536565b005b34801561093557600080fd5b5061093e61262e565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a0b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a1b5750610a1a826126d6565b5b9050919050565b606060018054610a3190614dc0565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5d90614dc0565b8015610aaa5780601f10610a7f57610100808354040283529160200191610aaa565b820191906000526020600020905b815481529060010190602001808311610a8d57829003601f168201915b5050505050905090565b6000610abf82612740565b610afe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af5906148ac565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b44826118ee565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bac9061492c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bd46127ac565b73ffffffffffffffffffffffffffffffffffffffff161480610c035750610c0281610bfd6127ac565b6124a2565b5b610c42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c39906147ac565b60405180910390fd5b610c4c83836127b4565b505050565b6000610c7d7f0f888941bd07ea31c6e78b607c9e2c2f0a375eb86daa19a04e532dffc7545ca883611df2565b9050919050565b6000610c8e612148565b905090565b610c9b6127ac565b73ffffffffffffffffffffffffffffffffffffffff16610cb9611dc9565b73ffffffffffffffffffffffffffffffffffffffff1614610d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d06906148cc565b60405180910390fd5b6000610d19610c84565b9050610d2c610d26611dc9565b8261286d565b6001600b6000828254610d3f9190614b8b565b9250508190555050565b610d516127ac565b73ffffffffffffffffffffffffffffffffffffffff16610d6f611dc9565b73ffffffffffffffffffffffffffffffffffffffff1614610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc906148cc565b60405180910390fd5b60005b81518163ffffffff161015610ef857610e217f38c830a0bfdbb6cf96d04365c79874a85961d7124f3140ea40bc9cec2f6431cc838363ffffffff1681518110610e1457610e13614f57565b5b6020026020010151611df2565b610e7057610e6f7f38c830a0bfdbb6cf96d04365c79874a85961d7124f3140ea40bc9cec2f6431cc838363ffffffff1681518110610e6257610e61614f57565b5b60200260200101516112b0565b5b600a6000838363ffffffff1681518110610e8d57610e8c614f57565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610ee090614e23565b91905055508080610ef090614e6c565b915050610dc8565b5050565b610f0d610f076127ac565b8261288b565b610f4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f439061494c565b60405180910390fd5b610f57838383612969565b505050565b600060086000838152602001908152602001600020600101549050919050565b7f0f888941bd07ea31c6e78b607c9e2c2f0a375eb86daa19a04e532dffc7545ca8610fae81610fa96127ac565b612bc5565b601060019054906101000a900460ff16610ffd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff49061486c565b60405180910390fd5b601060009054906101000a900460ff161561104d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110449061464c565b60405180910390fd5b611064600e54600f54612c6290919063ffffffff16565b61107f6001611071610c84565b612c6290919063ffffffff16565b11156110c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b79061496c565b60405180910390fd5b34600d541115611105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fc9061474c565b60405180910390fd5b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117e906149ac565b60405180910390fd5b6000600167ffffffffffffffff8111156111a4576111a3614f86565b5b6040519080825280602002602001820160405280156111d25781602001602082028036833780820191505090505b50905060006111df610c84565b90506111eb338261286d565b8082600081518110611200576111ff614f57565b5b6020026020010181815250506001600b600082825461121f9190614b8b565b92505081905550600b54600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f66c885093f8b60d89579c8ca08ef6abfe917fd3b86cf658e8c36a42f7231f7803360008460006040516112a3949392919061453c565b60405180910390a1505050565b6112b982610f5c565b6112ca816112c56127ac565b612bc5565b6112d48383612cc0565b505050565b6112e16127ac565b73ffffffffffffffffffffffffffffffffffffffff166112ff611dc9565b73ffffffffffffffffffffffffffffffffffffffff1614611355576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134c906148cc565b60405180910390fd5b806003908051906020019061136b929190613793565b5050565b6113776127ac565b73ffffffffffffffffffffffffffffffffffffffff16611395611dc9565b73ffffffffffffffffffffffffffffffffffffffff16146113eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e2906148cc565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b61141f6127ac565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461148c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611483906149ec565b60405180910390fd5b6114968282612da1565b5050565b6114a26127ac565b73ffffffffffffffffffffffffffffffffffffffff166114c0611dc9565b73ffffffffffffffffffffffffffffffffffffffff1614611516576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150d906148cc565b60405180910390fd5b80600e819055508061271061152b9190614c6c565b600f8190555050565b61153c6127ac565b73ffffffffffffffffffffffffffffffffffffffff1661155a611dc9565b73ffffffffffffffffffffffffffffffffffffffff16146115b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a7906148cc565b60405180910390fd5b60004790506115bd611dc9565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611602573d6000803e3d6000fd5b5050565b61162183838360405180602001604052806000815250612152565b505050565b6000601060009054906101000a900460ff16905090565b601060009054906101000a900460ff1661168c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611683906149cc565b60405180910390fd5b6116a3600e54600f54612c6290919063ffffffff16565b6116c78267ffffffffffffffff166116b9610c84565b612c6290919063ffffffff16565b1115611708576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ff9061496c565b60405180910390fd5b346117288267ffffffffffffffff16600d54612e8390919063ffffffff16565b1115611769576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117609061474c565b60405180910390fd5b60148167ffffffffffffffff1611156117b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ae9061498c565b60405180910390fd5b60008167ffffffffffffffff1667ffffffffffffffff8111156117dd576117dc614f86565b5b60405190808252806020026020018201604052801561180b5781602001602082028036833780820191505090505b50905060005b8267ffffffffffffffff168163ffffffff161015611893576000611833610c84565b905061183f338261286d565b80838363ffffffff168151811061185957611858614f57565b5b6020026020010181815250506001600b60008282546118789190614b8b565b9250508190555050808061188b90614e6c565b915050611811565b507f66c885093f8b60d89579c8ca08ef6abfe917fd3b86cf658e8c36a42f7231f78033848360006040516118ca9493929190614588565b60405180910390a1505050565b6000601060019054906101000a900460ff16905090565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198e906147ec565b60405180910390fd5b80915050919050565b6119a86127ac565b73ffffffffffffffffffffffffffffffffffffffff166119c6611dc9565b73ffffffffffffffffffffffffffffffffffffffff1614611a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a13906148cc565b60405180910390fd5b60005b81518163ffffffff161015611a8b57611a787f0f888941bd07ea31c6e78b607c9e2c2f0a375eb86daa19a04e532dffc7545ca8838363ffffffff1681518110611a6b57611a6a614f57565b5b60200260200101516112b0565b8080611a8390614e6c565b915050611a1f565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af7906147cc565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611b4f6127ac565b73ffffffffffffffffffffffffffffffffffffffff16611b6d611dc9565b73ffffffffffffffffffffffffffffffffffffffff1614611bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bba906148cc565b60405180910390fd5b611bcd6000612efe565b565b7f38c830a0bfdbb6cf96d04365c79874a85961d7124f3140ea40bc9cec2f6431cc611c0181611bfc6127ac565b612bc5565b611c2b7f38c830a0bfdbb6cf96d04365c79874a85961d7124f3140ea40bc9cec2f6431cc33611df2565b611c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c61906146ec565b60405180910390fd5b6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611cec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce39061484c565b60405180910390fd5b60005b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548163ffffffff161015611d80576000611d46610c84565b9050611d52338261286d565b6001600b6000828254611d659190614b8b565b92505081905550508080611d7890614e6c565b915050611cef565b506000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060028054611e6c90614dc0565b80601f0160208091040260200160405190810160405280929190818152602001828054611e9890614dc0565b8015611ee55780601f10611eba57610100808354040283529160200191611ee5565b820191906000526020600020905b815481529060010190602001808311611ec857829003601f168201915b5050505050905090565b611ef76127ac565b73ffffffffffffffffffffffffffffffffffffffff16611f15611dc9565b73ffffffffffffffffffffffffffffffffffffffff1614611f6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f62906148cc565b60405180910390fd5b67016345785d8a0000811115611fb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fad9061478c565b60405180910390fd5b80600d8190555050565b6000801b81565b611fcf6127ac565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561203d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120349061472c565b60405180910390fd5b806007600061204a6127ac565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120f76127ac565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161213c91906145d4565b60405180910390a35050565b6000600b54905090565b61216361215d6127ac565b8361288b565b6121a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121999061494c565b60405180910390fd5b6121ae84848484612fc2565b50505050565b601481565b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b606061220b82612740565b61224a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122419061490c565b60405180910390fd5b60006003805461225990614dc0565b90501161227557604051806020016040528060008152506122a1565b60036122808361301e565b604051602001612291929190614477565b6040516020818303038152906040525b9050919050565b6122b06127ac565b73ffffffffffffffffffffffffffffffffffffffff166122ce611dc9565b73ffffffffffffffffffffffffffffffffffffffff1614612324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231b906148cc565b60405180910390fd5b6011546012541061236a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123619061480c565b60405180910390fd5b612372611dc9565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d790614a0c565b60405180910390fd5b612427816124226124116124006001601254612c6290919063ffffffff16565b600e54612c6290919063ffffffff16565b600f54612c6290919063ffffffff16565b61286d565b6012600081548092919061243a90614e23565b91905055507f896fee137490044e865f8ba89cd69efa690a55330c5fbaf2fe523b637eccbb418160405161246e91906144d5565b60405180910390a150565b61248282610f5c565b6124938161248e6127ac565b612bc5565b61249d8383612da1565b505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61253e6127ac565b73ffffffffffffffffffffffffffffffffffffffff1661255c611dc9565b73ffffffffffffffffffffffffffffffffffffffff16146125b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a9906148cc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612622576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126199061468c565b60405180910390fd5b61262b81612efe565b50565b6126366127ac565b73ffffffffffffffffffffffffffffffffffffffff16612654611dc9565b73ffffffffffffffffffffffffffffffffffffffff16146126aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a1906148cc565b60405180910390fd5b601060019054906101000a900460ff1615601060016101000a81548160ff021916908315150217905550565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612827836118ee565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61288782826040518060200160405280600081525061317f565b5050565b600061289682612740565b6128d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128cc9061476c565b60405180910390fd5b60006128e0836118ee565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061294f57508373ffffffffffffffffffffffffffffffffffffffff1661293784610ab4565b73ffffffffffffffffffffffffffffffffffffffff16145b80612960575061295f81856124a2565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612989826118ee565b73ffffffffffffffffffffffffffffffffffffffff16146129df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d6906148ec565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a469061470c565b60405180910390fd5b612a5a8383836131da565b612a656000826127b4565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ab59190614c6c565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b0c9190614b8b565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612bcf8282611df2565b612c5e57612bf48173ffffffffffffffffffffffffffffffffffffffff1660146131df565b612c028360001c60206131df565b604051602001612c1392919061449b565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c55919061460a565b60405180910390fd5b5050565b6000808284612c719190614b8b565b905083811015612cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cad906146cc565b60405180910390fd5b8091505092915050565b612cca8282611df2565b612d9d5760016008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612d426127ac565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b612dab8282611df2565b15612e7f5760006008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612e246127ac565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600080831415612e965760009050612ef8565b60008284612ea49190614c12565b9050828482612eb39190614be1565b14612ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eea9061488c565b60405180910390fd5b809150505b92915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612fcd848484612969565b612fd98484848461341b565b613018576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300f9061466c565b60405180910390fd5b50505050565b60606000821415613066576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061317a565b600082905060005b6000821461309857808061308190614e23565b915050600a826130919190614be1565b915061306e565b60008167ffffffffffffffff8111156130b4576130b3614f86565b5b6040519080825280601f01601f1916602001820160405280156130e65781602001600182028036833780820191505090505b5090505b60008514613173576001826130ff9190614c6c565b9150600a8561310e9190614e99565b603061311a9190614b8b565b60f81b8183815181106131305761312f614f57565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561316c9190614be1565b94506130ea565b8093505050505b919050565b61318983836135b2565b613196600084848461341b565b6131d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131cc9061466c565b60405180910390fd5b505050565b505050565b6060600060028360026131f29190614c12565b6131fc9190614b8b565b67ffffffffffffffff81111561321557613214614f86565b5b6040519080825280601f01601f1916602001820160405280156132475781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061327f5761327e614f57565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106132e3576132e2614f57565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026133239190614c12565b61332d9190614b8b565b90505b60018111156133cd577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061336f5761336e614f57565b5b1a60f81b82828151811061338657613385614f57565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806133c690614d96565b9050613330565b5060008414613411576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134089061462c565b60405180910390fd5b8091505092915050565b600061343c8473ffffffffffffffffffffffffffffffffffffffff16613780565b156135a5578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026134656127ac565b8786866040518563ffffffff1660e01b815260040161348794939291906144f0565b602060405180830381600087803b1580156134a157600080fd5b505af19250505080156134d257506040513d601f19601f820116820180604052508101906134cf9190613ced565b60015b613555573d8060008114613502576040519150601f19603f3d011682016040523d82523d6000602084013e613507565b606091505b5060008151141561354d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135449061466c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506135aa565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613622576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136199061482c565b60405180910390fd5b61362b81612740565b1561366b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613662906146ac565b60405180910390fd5b613677600083836131da565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546136c79190614b8b565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461379f90614dc0565b90600052602060002090601f0160209004810192826137c15760008555613808565b82601f106137da57805160ff1916838001178555613808565b82800160010185558215613808579182015b828111156138075782518255916020019190600101906137ec565b5b5090506138159190613819565b5090565b5b8082111561383257600081600090555060010161381a565b5090565b600061384961384484614a6c565b614a47565b9050808382526020820190508285602086028201111561386c5761386b614fba565b5b60005b8581101561389c5781613882888261392a565b84526020840193506020830192505060018101905061386f565b5050509392505050565b60006138b96138b484614a98565b614a47565b9050828152602081018484840111156138d5576138d4614fbf565b5b6138e0848285614d54565b509392505050565b60006138fb6138f684614ac9565b614a47565b90508281526020810184848401111561391757613916614fbf565b5b613922848285614d54565b509392505050565b60008135905061393981615849565b92915050565b600082601f83011261395457613953614fb5565b5b8135613964848260208601613836565b91505092915050565b60008135905061397c81615860565b92915050565b60008135905061399181615877565b92915050565b6000813590506139a68161588e565b92915050565b6000815190506139bb8161588e565b92915050565b600082601f8301126139d6576139d5614fb5565b5b81356139e68482602086016138a6565b91505092915050565b600082601f830112613a0457613a03614fb5565b5b8135613a148482602086016138e8565b91505092915050565b600081359050613a2c816158a5565b92915050565b600081359050613a41816158bc565b92915050565b600060208284031215613a5d57613a5c614fc9565b5b6000613a6b8482850161392a565b91505092915050565b60008060408385031215613a8b57613a8a614fc9565b5b6000613a998582860161392a565b9250506020613aaa8582860161392a565b9150509250929050565b600080600060608486031215613acd57613acc614fc9565b5b6000613adb8682870161392a565b9350506020613aec8682870161392a565b9250506040613afd86828701613a1d565b9150509250925092565b60008060008060808587031215613b2157613b20614fc9565b5b6000613b2f8782880161392a565b9450506020613b408782880161392a565b9350506040613b5187828801613a1d565b925050606085013567ffffffffffffffff811115613b7257613b71614fc4565b5b613b7e878288016139c1565b91505092959194509250565b60008060408385031215613ba157613ba0614fc9565b5b6000613baf8582860161392a565b9250506020613bc08582860161396d565b9150509250929050565b60008060408385031215613be157613be0614fc9565b5b6000613bef8582860161392a565b9250506020613c0085828601613a1d565b9150509250929050565b600060208284031215613c2057613c1f614fc9565b5b600082013567ffffffffffffffff811115613c3e57613c3d614fc4565b5b613c4a8482850161393f565b91505092915050565b600060208284031215613c6957613c68614fc9565b5b6000613c7784828501613982565b91505092915050565b60008060408385031215613c9757613c96614fc9565b5b6000613ca585828601613982565b9250506020613cb68582860161392a565b9150509250929050565b600060208284031215613cd657613cd5614fc9565b5b6000613ce484828501613997565b91505092915050565b600060208284031215613d0357613d02614fc9565b5b6000613d11848285016139ac565b91505092915050565b600060208284031215613d3057613d2f614fc9565b5b600082013567ffffffffffffffff811115613d4e57613d4d614fc4565b5b613d5a848285016139ef565b91505092915050565b600060208284031215613d7957613d78614fc9565b5b6000613d8784828501613a1d565b91505092915050565b60008060408385031215613da757613da6614fc9565b5b6000613db585828601613a32565b9250506020613dc685828601613a32565b9150509250929050565b6000613ddc838361444a565b60208301905092915050565b613df181614ca0565b82525050565b6000613e0282614b1f565b613e0c8185614b4d565b9350613e1783614afa565b8060005b83811015613e48578151613e2f8882613dd0565b9750613e3a83614b40565b925050600181019050613e1b565b5085935050505092915050565b613e5e81614cb2565b82525050565b613e6d81614cbe565b82525050565b6000613e7e82614b2a565b613e888185614b5e565b9350613e98818560208601614d63565b613ea181614fce565b840191505092915050565b613eb581614d42565b82525050565b6000613ec682614b35565b613ed08185614b6f565b9350613ee0818560208601614d63565b613ee981614fce565b840191505092915050565b6000613eff82614b35565b613f098185614b80565b9350613f19818560208601614d63565b80840191505092915050565b60008154613f3281614dc0565b613f3c8186614b80565b94506001821660008114613f575760018114613f6857613f9b565b60ff19831686528186019350613f9b565b613f7185614b0a565b60005b83811015613f9357815481890152600182019150602081019050613f74565b838801955050505b50505092915050565b6000613fb1602083614b6f565b9150613fbc82614fdf565b602082019050919050565b6000613fd4601683614b6f565b9150613fdf82615008565b602082019050919050565b6000613ff7603283614b6f565b915061400282615031565b604082019050919050565b600061401a602683614b6f565b915061402582615080565b604082019050919050565b600061403d601c83614b6f565b9150614048826150cf565b602082019050919050565b6000614060601b83614b6f565b915061406b826150f8565b602082019050919050565b6000614083601b83614b6f565b915061408e82615121565b602082019050919050565b60006140a6602483614b6f565b91506140b18261514a565b604082019050919050565b60006140c9601983614b6f565b91506140d482615199565b602082019050919050565b60006140ec601f83614b6f565b91506140f7826151c2565b602082019050919050565b600061410f602c83614b6f565b915061411a826151eb565b604082019050919050565b6000614132601a83614b6f565b915061413d8261523a565b602082019050919050565b6000614155603883614b6f565b915061416082615263565b604082019050919050565b6000614178602a83614b6f565b9150614183826152b2565b604082019050919050565b600061419b602983614b6f565b91506141a682615301565b604082019050919050565b60006141be601f83614b6f565b91506141c982615350565b602082019050919050565b60006141e1602083614b6f565b91506141ec82615379565b602082019050919050565b6000614204603a83614b6f565b915061420f826153a2565b604082019050919050565b6000614227602183614b6f565b9150614232826153f1565b604082019050919050565b600061424a602183614b6f565b915061425582615440565b604082019050919050565b600061426d602c83614b6f565b91506142788261548f565b604082019050919050565b6000614290602083614b6f565b915061429b826154de565b602082019050919050565b60006142b3602983614b6f565b91506142be82615507565b604082019050919050565b60006142d6602f83614b6f565b91506142e182615556565b604082019050919050565b60006142f9602183614b6f565b9150614304826155a5565b604082019050919050565b600061431c603183614b6f565b9150614327826155f4565b604082019050919050565b600061433f602883614b6f565b915061434a82615643565b604082019050919050565b6000614362603983614b6f565b915061436d82615692565b604082019050919050565b6000614385603683614b6f565b9150614390826156e1565b604082019050919050565b60006143a8601783614b80565b91506143b382615730565b601782019050919050565b60006143cb601f83614b6f565b91506143d682615759565b602082019050919050565b60006143ee601183614b80565b91506143f982615782565b601182019050919050565b6000614411602f83614b6f565b915061441c826157ab565b604082019050919050565b6000614434602683614b6f565b915061443f826157fa565b604082019050919050565b61445381614d14565b82525050565b61446281614d14565b82525050565b61447181614d2e565b82525050565b60006144838285613f25565b915061448f8284613ef4565b91508190509392505050565b60006144a68261439b565b91506144b28285613ef4565b91506144bd826143e1565b91506144c98284613ef4565b91508190509392505050565b60006020820190506144ea6000830184613de8565b92915050565b60006080820190506145056000830187613de8565b6145126020830186613de8565b61451f6040830185614459565b81810360608301526145318184613e73565b905095945050505050565b60006080820190506145516000830187613de8565b61455e6020830186613eac565b81810360408301526145708185613df7565b905061457f6060830184613e55565b95945050505050565b600060808201905061459d6000830187613de8565b6145aa6020830186614468565b81810360408301526145bc8185613df7565b90506145cb6060830184613e55565b95945050505050565b60006020820190506145e96000830184613e55565b92915050565b60006020820190506146046000830184613e64565b92915050565b600060208201905081810360008301526146248184613ebb565b905092915050565b6000602082019050818103600083015261464581613fa4565b9050919050565b6000602082019050818103600083015261466581613fc7565b9050919050565b6000602082019050818103600083015261468581613fea565b9050919050565b600060208201905081810360008301526146a58161400d565b9050919050565b600060208201905081810360008301526146c581614030565b9050919050565b600060208201905081810360008301526146e581614053565b9050919050565b6000602082019050818103600083015261470581614076565b9050919050565b6000602082019050818103600083015261472581614099565b9050919050565b60006020820190508181036000830152614745816140bc565b9050919050565b60006020820190508181036000830152614765816140df565b9050919050565b6000602082019050818103600083015261478581614102565b9050919050565b600060208201905081810360008301526147a581614125565b9050919050565b600060208201905081810360008301526147c581614148565b9050919050565b600060208201905081810360008301526147e58161416b565b9050919050565b600060208201905081810360008301526148058161418e565b9050919050565b60006020820190508181036000830152614825816141b1565b9050919050565b60006020820190508181036000830152614845816141d4565b9050919050565b60006020820190508181036000830152614865816141f7565b9050919050565b600060208201905081810360008301526148858161421a565b9050919050565b600060208201905081810360008301526148a58161423d565b9050919050565b600060208201905081810360008301526148c581614260565b9050919050565b600060208201905081810360008301526148e581614283565b9050919050565b60006020820190508181036000830152614905816142a6565b9050919050565b60006020820190508181036000830152614925816142c9565b9050919050565b60006020820190508181036000830152614945816142ec565b9050919050565b600060208201905081810360008301526149658161430f565b9050919050565b6000602082019050818103600083015261498581614332565b9050919050565b600060208201905081810360008301526149a581614355565b9050919050565b600060208201905081810360008301526149c581614378565b9050919050565b600060208201905081810360008301526149e5816143be565b9050919050565b60006020820190508181036000830152614a0581614404565b9050919050565b60006020820190508181036000830152614a2581614427565b9050919050565b6000602082019050614a416000830184614459565b92915050565b6000614a51614a62565b9050614a5d8282614df2565b919050565b6000604051905090565b600067ffffffffffffffff821115614a8757614a86614f86565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614ab357614ab2614f86565b5b614abc82614fce565b9050602081019050919050565b600067ffffffffffffffff821115614ae457614ae3614f86565b5b614aed82614fce565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614b9682614d14565b9150614ba183614d14565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614bd657614bd5614eca565b5b828201905092915050565b6000614bec82614d14565b9150614bf783614d14565b925082614c0757614c06614ef9565b5b828204905092915050565b6000614c1d82614d14565b9150614c2883614d14565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614c6157614c60614eca565b5b828202905092915050565b6000614c7782614d14565b9150614c8283614d14565b925082821015614c9557614c94614eca565b5b828203905092915050565b6000614cab82614cf4565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b6000614d4d82614d2e565b9050919050565b82818337600083830152505050565b60005b83811015614d81578082015181840152602081019050614d66565b83811115614d90576000848401525b50505050565b6000614da182614d14565b91506000821415614db557614db4614eca565b5b600182039050919050565b60006002820490506001821680614dd857607f821691505b60208210811415614dec57614deb614f28565b5b50919050565b614dfb82614fce565b810181811067ffffffffffffffff82111715614e1a57614e19614f86565b5b80604052505050565b6000614e2e82614d14565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e6157614e60614eca565b5b600182019050919050565b6000614e7782614d1e565b915063ffffffff821415614e8e57614e8d614eca565b5b600182019050919050565b6000614ea482614d14565b9150614eaf83614d14565b925082614ebf57614ebe614ef9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f50726573616c65206173206265656e20636c6f73656400000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b7f596f75206469646e277420776f6e20616e792067697665617761790000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f50726963652063616e27742065786365656420302e3120455448000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f43686f6c726f6e6520617320616c7265616479206265656e206d696e74656400600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f596f7520616c726561647920636c61696d20616c6c20796f757220676976617760008201527f6179732c207761697420666f7220746865206e657874206f6e65000000000000602082015250565b7f507265616c65206d7573742062652061637469766520746f206d696e74204e6660008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f66204e667473000000000000000000000000000000000000000000000000602082015250565b7f596f752063616e2774206d696e74206d6f7265207468616e20323020746f6b6560008201527f6e20696e207468652073616d65207472616e73616374696f6e00000000000000602082015250565b7f596f752063616e2774206d696e74206d6f7265207468616e203120746f6b656e60008201527f2077697468207468652073616d65206163636f756e7400000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f53616c65206d7573742062652061637469766520746f206d696e74204e667400600082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b7f43686f6c726f6e652063616e6e6f74206265206d696e7465642062792074686560008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b61585281614ca0565b811461585d57600080fd5b50565b61586981614cb2565b811461587457600080fd5b50565b61588081614cbe565b811461588b57600080fd5b50565b61589781614cc8565b81146158a257600080fd5b50565b6158ae81614d14565b81146158b957600080fd5b50565b6158c581614d2e565b81146158d057600080fd5b5056fea26469706673582212201b5e3c78f5d65189ec39bc1c02cc8152aeb53029e04ade6498e75242eca2be3664736f6c63430008070033

Deployed Bytecode Sourcemap

267:8872:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1570:305:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2515:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4145:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3668:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8220:126:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7610:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2628:154;;;;;;;;;;;;;:::i;:::-;;3579:321;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5035:339:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2070:121:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5476:807:3;;;:::i;:::-;;2441:145:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3503:103:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4122:89:3;;;;;;;;;;;;;:::i;:::-;;3458:214:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2312:174:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2871:137;;;;;;;;;;;;;:::i;:::-;;5445:185:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7794:89:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6505:837;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7972:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2209:239:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3201:211:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1939:208:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1650:94:14;;;;;;;;;;;;;:::i;:::-;;4910:496:3;;;;;;;;;;;;;:::i;:::-;;999:87:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;987:137:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2684:104:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8955:181:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;374:49:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4438:295:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7442:80:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5701:328:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;569:40:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8550:111;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2859:289:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4325:515:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2820:147:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4804:164:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1899:192:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3959:98:3;;;;;;;;;;;;;:::i;:::-;;1570:305:5;1672:4;1724:25;1709:40;;;:11;:40;;;;:105;;;;1781:33;1766:48;;;:11;:48;;;;1709:105;:158;;;;1831:36;1855:11;1831:23;:36::i;:::-;1709:158;1689:178;;1570:305;;;:::o;2515:100::-;2569:13;2602:5;2595:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2515:100;:::o;4145:221::-;4221:7;4249:16;4257:7;4249;:16::i;:::-;4241:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4334:15;:24;4350:7;4334:24;;;;;;;;;;;;;;;;;;;;;4327:31;;4145:221;;;:::o;3668:411::-;3749:13;3765:23;3780:7;3765:14;:23::i;:::-;3749:39;;3813:5;3807:11;;:2;:11;;;;3799:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3907:5;3891:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3916:37;3933:5;3940:12;:10;:12::i;:::-;3916:16;:37::i;:::-;3891:62;3869:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;4050:21;4059:2;4063:7;4050:8;:21::i;:::-;3738:341;3668:411;;:::o;8220:126:3:-;8285:4;8308:30;415:15;8333:4;8308:7;:30::i;:::-;8301:37;;8220:126;;;:::o;7610:89::-;7654:7;7681:10;:8;:10::i;:::-;7674:17;;7610:89;:::o;2628:154::-;1230:12:14;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2683:14:3::1;2700:13;:11;:13::i;:::-;2683:30;;2724:29;2734:7;:5;:7::i;:::-;2743:9;2724;:29::i;:::-;2773:1;2764:5;;:10;;;;;;;:::i;:::-;;;;;;;;2672:110;2628:154::o:0;3579:321::-;1230:12:14;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3670:8:3::1;3666:227;3688:7;:14;3684:1;:18;;;3666:227;;;3727:39;512:15;3755:7;3763:1;3755:10;;;;;;;;;;:::i;:::-;;;;;;;;3727:7;:39::i;:::-;3723:121;;3786:41;512:15;3816:7;3824:1;3816:10;;;;;;;;;;:::i;:::-;;;;;;;;3786:9;:41::i;:::-;3723:121;3858:9;:21;3868:7;3876:1;3868:10;;;;;;;;;;:::i;:::-;;;;;;;;3858:21;;;;;;;;;;;;;;;;:23;;;;;;;;;:::i;:::-;;;;;;3704:3;;;;;:::i;:::-;;;;3666:227;;;;3579:321:::0;:::o;5035:339:5:-;5230:41;5249:12;:10;:12::i;:::-;5263:7;5230:18;:41::i;:::-;5222:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5338:28;5348:4;5354:2;5358:7;5338:9;:28::i;:::-;5035:339;;;:::o;2070:121:0:-;2136:7;2162:6;:12;2169:4;2162:12;;;;;;;;;;;:22;;;2155:29;;2070:121;;;:::o;5476:807:3:-;415:15;852:30:0;863:4;869:12;:10;:12::i;:::-;852:10;:30::i;:::-;5563:15:3::1;;;;;;;;;;;5555:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;5636:12;;;;;;;;;;;5635:13;5627:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;5718:32;5731:18;;5718:8;;:12;;:32;;;;:::i;:::-;5694:20;5712:1;5694:13;:11;:13::i;:::-;:17;;:20;;;;:::i;:::-;:56;;5686:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;5826:9;5814:8;;:21;;5806:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;5914:1;5890:8;:20;5899:10;5890:20;;;;;;;;;;;;;;;;:25;5882:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;5987:23;6027:1;6013:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5987:42;;6042:14;6059:13;:11;:13::i;:::-;6042:30;;6083:32;6093:10;6105:9;6083;:32::i;:::-;6138:9;6126:6;6133:1;6126:9;;;;;;;;:::i;:::-;;;;;;;:21;;;::::0;::::1;6167:1;6158:5;;:10;;;;;;;:::i;:::-;;;;;;;;6204:5;;6181:8;:20;6190:10;6181:20;;;;;;;;;;;;;;;:28;;;;6235:40;6246:10;6258:1;6261:6;6269:5;6235:40;;;;;;;;;:::i;:::-;;;;;;;;5544:739;;5476:807:::0;:::o;2441:145:0:-;2524:18;2537:4;2524:12;:18::i;:::-;852:30;863:4;869:12;:10;:12::i;:::-;852:10;:30::i;:::-;2554:25:::1;2565:4;2571:7;2554:10;:25::i;:::-;2441:145:::0;;;:::o;3503:103:5:-;1230:12:14;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3588:10:5::1;3578:7;:20;;;;;;;;;;;;:::i;:::-;;3503:103:::0;:::o;4122:89:3:-;1230:12:14;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4191:12:3::1;;;;;;;;;;;4190:13;4175:12;;:28;;;;;;;;;;;;;;;;;;4122:89::o:0;3458:214:0:-;3564:12;:10;:12::i;:::-;3553:23;;:7;:23;;;3545:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;3639:26;3651:4;3657:7;3639:11;:26::i;:::-;3458:214;;:::o;2312:174:3:-;1230:12:14;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2414:17:3::1;2393:18;:38;;;;2461:17;2453:5;:25;;;;:::i;:::-;2442:8;:36;;;;2312:174:::0;:::o;2871:137::-;1230:12:14;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2919:12:3::1;2934:21;2919:36;;2974:7;:5;:7::i;:::-;2966:25;;:34;2992:7;2966:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;2908:100;2871:137::o:0;5445:185:5:-;5583:39;5600:4;5606:2;5610:7;5583:39;;;;;;;;;;;;:16;:39::i;:::-;5445:185;;;:::o;7794:89:3:-;7839:4;7863:12;;;;;;;;;;;7856:19;;7794:89;:::o;6505:837::-;6596:12;;;;;;;;;;;6588:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;6699:32;6712:18;;6699:8;;:12;;:32;;;;:::i;:::-;6663;6681:13;6663:32;;:13;:11;:13::i;:::-;:17;;:32;;;;:::i;:::-;:68;;6655:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;6826:9;6795:27;6808:13;6795:27;;:8;;:12;;:27;;;;:::i;:::-;:40;;6787:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;607:2;6890:13;:31;;;;6882:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;6996:23;7036:13;7022:28;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6996:54;;7067:8;7063:206;7085:13;7081:17;;:1;:17;;;7063:206;;;7119:14;7136:13;:11;:13::i;:::-;7119:30;;7164:32;7174:10;7186:9;7164;:32::i;:::-;7223:9;7211:6;7218:1;7211:9;;;;;;;;;;:::i;:::-;;;;;;;:21;;;;;7256:1;7247:5;;:10;;;;;;;:::i;:::-;;;;;;;;7104:165;7100:3;;;;;:::i;:::-;;;;7063:206;;;;7286:48;7297:10;7309:9;7320:6;7328:5;7286:48;;;;;;;;;:::i;:::-;;;;;;;;6577:765;6505:837;;:::o;7972:95::-;8020:4;8044:15;;;;;;;;;;;8037:22;;7972:95;:::o;2209:239:5:-;2281:7;2301:13;2317:7;:16;2325:7;2317:16;;;;;;;;;;;;;;;;;;;;;2301:32;;2369:1;2352:19;;:5;:19;;;;2344:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2435:5;2428:12;;;2209:239;;;:::o;3201:211:3:-;1230:12:14;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3298:8:3::1;3294:111;3316:9;:16;3312:1;:20;;;3294:111;;;3353:40;415:15;3380:9;3390:1;3380:12;;;;;;;;;;:::i;:::-;;;;;;;;3353:9;:40::i;:::-;3334:3;;;;;:::i;:::-;;;;3294:111;;;;3201:211:::0;:::o;1939:208:5:-;2011:7;2056:1;2039:19;;:5;:19;;;;2031:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2123:9;:16;2133:5;2123:16;;;;;;;;;;;;;;;;2116:23;;1939:208;;;:::o;1650:94:14:-;1230:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1715:21:::1;1733:1;1715:9;:21::i;:::-;1650:94::o:0;4910:496:3:-;512:15;852:30:0;863:4;869:12;:10;:12::i;:::-;852:10;:30::i;:::-;4992:39:3::1;512:15;5020:10;4992:7;:39::i;:::-;4984:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;5106:1;5082:9;:21;5092:10;5082:21;;;;;;;;;;;;;;;;:25;5074:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;5187:8;5183:178;5205:9;:21;5215:10;5205:21;;;;;;;;;;;;;;;;5201:1;:25;;;5183:178;;;5247:14;5264:13;:11;:13::i;:::-;5247:30;;5292:32;5302:10;5314:9;5292;:32::i;:::-;5348:1;5339:5;;:10;;;;;;;:::i;:::-;;;;;;;;5232:129;5228:3;;;;;:::i;:::-;;;;5183:178;;;;5397:1;5373:9;:21;5383:10;5373:21;;;;;;;;;;;;;;;:25;;;;4910:496:::0;:::o;999:87:14:-;1045:7;1072:6;;;;;;;;;;;1065:13;;999:87;:::o;987:137:0:-;1065:4;1088:6;:12;1095:4;1088:12;;;;;;;;;;;:20;;:29;1109:7;1088:29;;;;;;;;;;;;;;;;;;;;;;;;;1081:36;;987:137;;;;:::o;2684:104:5:-;2740:13;2773:7;2766:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2684:104;:::o;8955:181:3:-;1230:12:14;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9051:16:3::1;9039:8;:28;;9031:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;9120:8;9109;:19;;;;8955:181:::0;:::o;374:49:0:-;419:4;374:49;;;:::o;4438:295:5:-;4553:12;:10;:12::i;:::-;4541:24;;:8;:24;;;;4533:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4653:8;4608:18;:32;4627:12;:10;:12::i;:::-;4608:32;;;;;;;;;;;;;;;:42;4641:8;4608:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;4706:8;4677:48;;4692:12;:10;:12::i;:::-;4677:48;;;4716:8;4677:48;;;;;;:::i;:::-;;;;;;;;4438:295;;:::o;7442:80:3:-;7482:7;7509:5;;7502:12;;7442:80;:::o;5701:328:5:-;5876:41;5895:12;:10;:12::i;:::-;5909:7;5876:18;:41::i;:::-;5868:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5982:39;5996:4;6002:2;6006:7;6015:5;5982:13;:39::i;:::-;5701:328;;;;:::o;569:40:3:-;607:2;569:40;:::o;8550:111::-;8607:7;8633:8;:20;8642:10;8633:20;;;;;;;;;;;;;;;;8626:27;;8550:111;:::o;2859:289:5:-;2932:13;2966:16;2974:7;2966;:16::i;:::-;2958:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;3078:1;3060:7;3054:21;;;;;:::i;:::-;;;:25;:86;;;;;;;;;;;;;;;;;3106:7;3115:18;:7;:16;:18::i;:::-;3089:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3054:86;3047:93;;2859:289;;;:::o;4325:515:3:-;1230:12:14;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4421:18:3::1;;4399:19;;:40;4391:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;4504:7;:5;:7::i;:::-;4494:17;;:6;:17;;;;4486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4565:193;4589:6;4611:136;4642:90;4687:26;4711:1;4687:19;;:23;;:26;;;;:::i;:::-;4642:18;;:22;;:90;;;;:::i;:::-;4611:8;;:12;;:136;;;;:::i;:::-;4565:9;:193::i;:::-;4769:19;;:21;;;;;;;;;:::i;:::-;;;;;;4806:26;4825:6;4806:26;;;;;;:::i;:::-;;;;;;;;4325:515:::0;:::o;2820:147:0:-;2904:18;2917:4;2904:12;:18::i;:::-;852:30;863:4;869:12;:10;:12::i;:::-;852:10;:30::i;:::-;2934:26:::1;2946:4;2952:7;2934:11;:26::i;:::-;2820:147:::0;;;:::o;4804:164:5:-;4901:4;4925:18;:25;4944:5;4925:25;;;;;;;;;;;;;;;:35;4951:8;4925:35;;;;;;;;;;;;;;;;;;;;;;;;;4918:42;;4804:164;;;;:::o;1899:192:14:-;1230:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2008:1:::1;1988:22;;:8;:22;;;;1980:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2064:19;2074:8;2064:9;:19::i;:::-;1899:192:::0;:::o;3959:98:3:-;1230:12:14;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4034:15:3::1;;;;;;;;;;;4033:16;4015:15;;:34;;;;;;;;;;;;;;;;;;3959:98::o:0;787:157:4:-;872:4;911:25;896:40;;;:11;:40;;;;889:47;;787:157;;;:::o;7539:127:5:-;7604:4;7656:1;7628:30;;:7;:16;7636:7;7628:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7621:37;;7539:127;;;:::o;602:98:2:-;655:7;682:10;675:17;;602:98;:::o;11521:174:5:-;11623:2;11596:15;:24;11612:7;11596:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11679:7;11675:2;11641:46;;11650:23;11665:7;11650:14;:23::i;:::-;11641:46;;;;;;;;;;;;11521:174;;:::o;8523:110::-;8599:26;8609:2;8613:7;8599:26;;;;;;;;;;;;:9;:26::i;:::-;8523:110;;:::o;7833:348::-;7926:4;7951:16;7959:7;7951;:16::i;:::-;7943:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;8027:13;8043:23;8058:7;8043:14;:23::i;:::-;8027:39;;8096:5;8085:16;;:7;:16;;;:51;;;;8129:7;8105:31;;:20;8117:7;8105:11;:20::i;:::-;:31;;;8085:51;:87;;;;8140:32;8157:5;8164:7;8140:16;:32::i;:::-;8085:87;8077:96;;;7833:348;;;;:::o;10825:578::-;10984:4;10957:31;;:23;10972:7;10957:14;:23::i;:::-;:31;;;10949:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;11067:1;11053:16;;:2;:16;;;;11045:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;11123:39;11144:4;11150:2;11154:7;11123:20;:39::i;:::-;11227:29;11244:1;11248:7;11227:8;:29::i;:::-;11288:1;11269:9;:15;11279:4;11269:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;11317:1;11300:9;:13;11310:2;11300:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;11348:2;11329:7;:16;11337:7;11329:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;11387:7;11383:2;11368:27;;11377:4;11368:27;;;;;;;;;;;;10825:578;;;:::o;1405:484:0:-;1485:22;1493:4;1499:7;1485;:22::i;:::-;1480:403;;1668:41;1696:7;1668:41;;1706:2;1668:19;:41::i;:::-;1780:38;1808:4;1800:13;;1815:2;1780:19;:38::i;:::-;1575:265;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1523:349;;;;;;;;;;;:::i;:::-;;;;;;;;1480:403;1405:484;;:::o;2770:179:15:-;2828:7;2848:9;2864:1;2860;:5;;;;:::i;:::-;2848:17;;2889:1;2884;:6;;2876:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;2940:1;2933:8;;;2770:179;;;;:::o;4725:224:0:-;4799:22;4807:4;4813:7;4799;:22::i;:::-;4794:149;;4869:4;4837:6;:12;4844:4;4837:12;;;;;;;;;;;:20;;:29;4858:7;4837:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;4919:12;:10;:12::i;:::-;4892:40;;4910:7;4892:40;;4904:4;4892:40;;;;;;;;;;4794:149;4725:224;;:::o;4955:225::-;5029:22;5037:4;5043:7;5029;:22::i;:::-;5025:149;;;5099:5;5067:6;:12;5074:4;5067:12;;;;;;;;;;;:20;;:29;5088:7;5067:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;5150:12;:10;:12::i;:::-;5123:40;;5141:7;5123:40;;5135:4;5123:40;;;;;;;;;;5025:149;4955:225;;:::o;3649:220:15:-;3707:7;3736:1;3731;:6;3727:20;;;3746:1;3739:8;;;;3727:20;3758:9;3774:1;3770;:5;;;;:::i;:::-;3758:17;;3803:1;3798;3794;:5;;;;:::i;:::-;:10;3786:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;3860:1;3853:8;;;3649:220;;;;;:::o;2099:173:14:-;2155:16;2174:6;;;;;;;;;;;2155:25;;2200:8;2191:6;;:17;;;;;;;;;;;;;;;;;;2255:8;2224:40;;2245:8;2224:40;;;;;;;;;;;;2144:128;2099:173;:::o;6911:315:5:-;7068:28;7078:4;7084:2;7088:7;7068:9;:28::i;:::-;7115:48;7138:4;7144:2;7148:7;7157:5;7115:22;:48::i;:::-;7107:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6911:315;;;;:::o;288:723:16:-;344:13;574:1;565:5;:10;561:53;;;592:10;;;;;;;;;;;;;;;;;;;;;561:53;624:12;639:5;624:20;;655:14;680:78;695:1;687:4;:9;680:78;;713:8;;;;;:::i;:::-;;;;744:2;736:10;;;;;:::i;:::-;;;680:78;;;768:19;800:6;790:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;768:39;;818:154;834:1;825:5;:10;818:154;;862:1;852:11;;;;;:::i;:::-;;;929:2;921:5;:10;;;;:::i;:::-;908:2;:24;;;;:::i;:::-;895:39;;878:6;885;878:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;958:2;949:11;;;;;:::i;:::-;;;818:154;;;996:6;982:21;;;;;288:723;;;;:::o;8860:321:5:-;8990:18;8996:2;9000:7;8990:5;:18::i;:::-;9041:54;9072:1;9076:2;9080:7;9089:5;9041:22;:54::i;:::-;9019:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;8860:321;;;:::o;13631:126::-;;;;:::o;1589:451:16:-;1664:13;1690:19;1735:1;1726:6;1722:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1712:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1690:47;;1748:15;:6;1755:1;1748:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;1774;:6;1781:1;1774:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;1805:9;1830:1;1821:6;1817:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1805:26;;1800:135;1837:1;1833;:5;1800:135;;;1872:12;1893:3;1885:5;:11;1872:25;;;;;;;:::i;:::-;;;;;1860:6;1867:1;1860:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;1922:1;1912:11;;;;;1840:3;;;;:::i;:::-;;;1800:135;;;;1962:1;1953:5;:10;1945:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;2025:6;2011:21;;;1589:451;;;;:::o;12260:799:5:-;12415:4;12436:15;:2;:13;;;:15::i;:::-;12432:620;;;12488:2;12472:36;;;12509:12;:10;:12::i;:::-;12523:4;12529:7;12538:5;12472:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12468:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12731:1;12714:6;:13;:18;12710:272;;;12757:60;;;;;;;;;;:::i;:::-;;;;;;;;12710:272;12932:6;12926:13;12917:6;12913:2;12909:15;12902:38;12468:529;12605:41;;;12595:51;;;:6;:51;;;;12588:58;;;;;12432:620;13036:4;13029:11;;12260:799;;;;;;;:::o;9517:382::-;9611:1;9597:16;;:2;:16;;;;9589:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9670:16;9678:7;9670;:16::i;:::-;9669:17;9661:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9732:45;9761:1;9765:2;9769:7;9732:20;:45::i;:::-;9807:1;9790:9;:13;9800:2;9790:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9838:2;9819:7;:16;9827:7;9819:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9883:7;9879:2;9858:33;;9875:1;9858:33;;;;;;;;;;;;9517:382;;:::o;747:422:1:-;807:4;1015:12;1126:7;1114:20;1106:28;;1160:1;1153:4;:8;1146:15;;;747:422;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:17:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:122;;1876:79;;:::i;:::-;1835:122;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;1748:370;;;;:::o;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2124:133;;;;:::o;2263:139::-;2309:5;2347:6;2334:20;2325:29;;2363:33;2390:5;2363:33;:::i;:::-;2263:139;;;;:::o;2408:137::-;2453:5;2491:6;2478:20;2469:29;;2507:32;2533:5;2507:32;:::i;:::-;2408:137;;;;:::o;2551:141::-;2607:5;2638:6;2632:13;2623:22;;2654:32;2680:5;2654:32;:::i;:::-;2551:141;;;;:::o;2711:338::-;2766:5;2815:3;2808:4;2800:6;2796:17;2792:27;2782:122;;2823:79;;:::i;:::-;2782:122;2940:6;2927:20;2965:78;3039:3;3031:6;3024:4;3016:6;3012:17;2965:78;:::i;:::-;2956:87;;2772:277;2711:338;;;;:::o;3069:340::-;3125:5;3174:3;3167:4;3159:6;3155:17;3151:27;3141:122;;3182:79;;:::i;:::-;3141:122;3299:6;3286:20;3324:79;3399:3;3391:6;3384:4;3376:6;3372:17;3324:79;:::i;:::-;3315:88;;3131:278;3069:340;;;;:::o;3415:139::-;3461:5;3499:6;3486:20;3477:29;;3515:33;3542:5;3515:33;:::i;:::-;3415:139;;;;:::o;3560:137::-;3605:5;3643:6;3630:20;3621:29;;3659:32;3685:5;3659:32;:::i;:::-;3560:137;;;;:::o;3703:329::-;3762:6;3811:2;3799:9;3790:7;3786:23;3782:32;3779:119;;;3817:79;;:::i;:::-;3779:119;3937:1;3962:53;4007:7;3998:6;3987:9;3983:22;3962:53;:::i;:::-;3952:63;;3908:117;3703:329;;;;:::o;4038:474::-;4106:6;4114;4163:2;4151:9;4142:7;4138:23;4134:32;4131:119;;;4169:79;;:::i;:::-;4131:119;4289:1;4314:53;4359:7;4350:6;4339:9;4335:22;4314:53;:::i;:::-;4304:63;;4260:117;4416:2;4442:53;4487:7;4478:6;4467:9;4463:22;4442:53;:::i;:::-;4432:63;;4387:118;4038:474;;;;;:::o;4518:619::-;4595:6;4603;4611;4660:2;4648:9;4639:7;4635:23;4631:32;4628:119;;;4666:79;;:::i;:::-;4628:119;4786:1;4811:53;4856:7;4847:6;4836:9;4832:22;4811:53;:::i;:::-;4801:63;;4757:117;4913:2;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4884:118;5041:2;5067:53;5112:7;5103:6;5092:9;5088:22;5067:53;:::i;:::-;5057:63;;5012:118;4518:619;;;;;:::o;5143:943::-;5238:6;5246;5254;5262;5311:3;5299:9;5290:7;5286:23;5282:33;5279:120;;;5318:79;;:::i;:::-;5279:120;5438:1;5463:53;5508:7;5499:6;5488:9;5484:22;5463:53;:::i;:::-;5453:63;;5409:117;5565:2;5591:53;5636:7;5627:6;5616:9;5612:22;5591:53;:::i;:::-;5581:63;;5536:118;5693:2;5719:53;5764:7;5755:6;5744:9;5740:22;5719:53;:::i;:::-;5709:63;;5664:118;5849:2;5838:9;5834:18;5821:32;5880:18;5872:6;5869:30;5866:117;;;5902:79;;:::i;:::-;5866:117;6007:62;6061:7;6052:6;6041:9;6037:22;6007:62;:::i;:::-;5997:72;;5792:287;5143:943;;;;;;;:::o;6092:468::-;6157:6;6165;6214:2;6202:9;6193:7;6189:23;6185:32;6182:119;;;6220:79;;:::i;:::-;6182:119;6340:1;6365:53;6410:7;6401:6;6390:9;6386:22;6365:53;:::i;:::-;6355:63;;6311:117;6467:2;6493:50;6535:7;6526:6;6515:9;6511:22;6493:50;:::i;:::-;6483:60;;6438:115;6092:468;;;;;:::o;6566:474::-;6634:6;6642;6691:2;6679:9;6670:7;6666:23;6662:32;6659:119;;;6697:79;;:::i;:::-;6659:119;6817:1;6842:53;6887:7;6878:6;6867:9;6863:22;6842:53;:::i;:::-;6832:63;;6788:117;6944:2;6970:53;7015:7;7006:6;6995:9;6991:22;6970:53;:::i;:::-;6960:63;;6915:118;6566:474;;;;;:::o;7046:539::-;7130:6;7179:2;7167:9;7158:7;7154:23;7150:32;7147:119;;;7185:79;;:::i;:::-;7147:119;7333:1;7322:9;7318:17;7305:31;7363:18;7355:6;7352:30;7349:117;;;7385:79;;:::i;:::-;7349:117;7490:78;7560:7;7551:6;7540:9;7536:22;7490:78;:::i;:::-;7480:88;;7276:302;7046:539;;;;:::o;7591:329::-;7650:6;7699:2;7687:9;7678:7;7674:23;7670:32;7667:119;;;7705:79;;:::i;:::-;7667:119;7825:1;7850:53;7895:7;7886:6;7875:9;7871:22;7850:53;:::i;:::-;7840:63;;7796:117;7591:329;;;;:::o;7926:474::-;7994:6;8002;8051:2;8039:9;8030:7;8026:23;8022:32;8019:119;;;8057:79;;:::i;:::-;8019:119;8177:1;8202:53;8247:7;8238:6;8227:9;8223:22;8202:53;:::i;:::-;8192:63;;8148:117;8304:2;8330:53;8375:7;8366:6;8355:9;8351:22;8330:53;:::i;:::-;8320:63;;8275:118;7926:474;;;;;:::o;8406:327::-;8464:6;8513:2;8501:9;8492:7;8488:23;8484:32;8481:119;;;8519:79;;:::i;:::-;8481:119;8639:1;8664:52;8708:7;8699:6;8688:9;8684:22;8664:52;:::i;:::-;8654:62;;8610:116;8406:327;;;;:::o;8739:349::-;8808:6;8857:2;8845:9;8836:7;8832:23;8828:32;8825:119;;;8863:79;;:::i;:::-;8825:119;8983:1;9008:63;9063:7;9054:6;9043:9;9039:22;9008:63;:::i;:::-;8998:73;;8954:127;8739:349;;;;:::o;9094:509::-;9163:6;9212:2;9200:9;9191:7;9187:23;9183:32;9180:119;;;9218:79;;:::i;:::-;9180:119;9366:1;9355:9;9351:17;9338:31;9396:18;9388:6;9385:30;9382:117;;;9418:79;;:::i;:::-;9382:117;9523:63;9578:7;9569:6;9558:9;9554:22;9523:63;:::i;:::-;9513:73;;9309:287;9094:509;;;;:::o;9609:329::-;9668:6;9717:2;9705:9;9696:7;9692:23;9688:32;9685:119;;;9723:79;;:::i;:::-;9685:119;9843:1;9868:53;9913:7;9904:6;9893:9;9889:22;9868:53;:::i;:::-;9858:63;;9814:117;9609:329;;;;:::o;9944:470::-;10010:6;10018;10067:2;10055:9;10046:7;10042:23;10038:32;10035:119;;;10073:79;;:::i;:::-;10035:119;10193:1;10218:52;10262:7;10253:6;10242:9;10238:22;10218:52;:::i;:::-;10208:62;;10164:116;10319:2;10345:52;10389:7;10380:6;10369:9;10365:22;10345:52;:::i;:::-;10335:62;;10290:117;9944:470;;;;;:::o;10420:179::-;10489:10;10510:46;10552:3;10544:6;10510:46;:::i;:::-;10588:4;10583:3;10579:14;10565:28;;10420:179;;;;:::o;10605:118::-;10692:24;10710:5;10692:24;:::i;:::-;10687:3;10680:37;10605:118;;:::o;10759:732::-;10878:3;10907:54;10955:5;10907:54;:::i;:::-;10977:86;11056:6;11051:3;10977:86;:::i;:::-;10970:93;;11087:56;11137:5;11087:56;:::i;:::-;11166:7;11197:1;11182:284;11207:6;11204:1;11201:13;11182:284;;;11283:6;11277:13;11310:63;11369:3;11354:13;11310:63;:::i;:::-;11303:70;;11396:60;11449:6;11396:60;:::i;:::-;11386:70;;11242:224;11229:1;11226;11222:9;11217:14;;11182:284;;;11186:14;11482:3;11475:10;;10883:608;;;10759:732;;;;:::o;11497:109::-;11578:21;11593:5;11578:21;:::i;:::-;11573:3;11566:34;11497:109;;:::o;11612:118::-;11699:24;11717:5;11699:24;:::i;:::-;11694:3;11687:37;11612:118;;:::o;11736:360::-;11822:3;11850:38;11882:5;11850:38;:::i;:::-;11904:70;11967:6;11962:3;11904:70;:::i;:::-;11897:77;;11983:52;12028:6;12023:3;12016:4;12009:5;12005:16;11983:52;:::i;:::-;12060:29;12082:6;12060:29;:::i;:::-;12055:3;12051:39;12044:46;;11826:270;11736:360;;;;:::o;12102:145::-;12196:44;12234:5;12196:44;:::i;:::-;12191:3;12184:57;12102:145;;:::o;12253:364::-;12341:3;12369:39;12402:5;12369:39;:::i;:::-;12424:71;12488:6;12483:3;12424:71;:::i;:::-;12417:78;;12504:52;12549:6;12544:3;12537:4;12530:5;12526:16;12504:52;:::i;:::-;12581:29;12603:6;12581:29;:::i;:::-;12576:3;12572:39;12565:46;;12345:272;12253:364;;;;:::o;12623:377::-;12729:3;12757:39;12790:5;12757:39;:::i;:::-;12812:89;12894:6;12889:3;12812:89;:::i;:::-;12805:96;;12910:52;12955:6;12950:3;12943:4;12936:5;12932:16;12910:52;:::i;:::-;12987:6;12982:3;12978:16;12971:23;;12733:267;12623:377;;;;:::o;13030:845::-;13133:3;13170:5;13164:12;13199:36;13225:9;13199:36;:::i;:::-;13251:89;13333:6;13328:3;13251:89;:::i;:::-;13244:96;;13371:1;13360:9;13356:17;13387:1;13382:137;;;;13533:1;13528:341;;;;13349:520;;13382:137;13466:4;13462:9;13451;13447:25;13442:3;13435:38;13502:6;13497:3;13493:16;13486:23;;13382:137;;13528:341;13595:38;13627:5;13595:38;:::i;:::-;13655:1;13669:154;13683:6;13680:1;13677:13;13669:154;;;13757:7;13751:14;13747:1;13742:3;13738:11;13731:35;13807:1;13798:7;13794:15;13783:26;;13705:4;13702:1;13698:12;13693:17;;13669:154;;;13852:6;13847:3;13843:16;13836:23;;13535:334;;13349:520;;13137:738;;13030:845;;;;:::o;13881:366::-;14023:3;14044:67;14108:2;14103:3;14044:67;:::i;:::-;14037:74;;14120:93;14209:3;14120:93;:::i;:::-;14238:2;14233:3;14229:12;14222:19;;13881:366;;;:::o;14253:::-;14395:3;14416:67;14480:2;14475:3;14416:67;:::i;:::-;14409:74;;14492:93;14581:3;14492:93;:::i;:::-;14610:2;14605:3;14601:12;14594:19;;14253:366;;;:::o;14625:::-;14767:3;14788:67;14852:2;14847:3;14788:67;:::i;:::-;14781:74;;14864:93;14953:3;14864:93;:::i;:::-;14982:2;14977:3;14973:12;14966:19;;14625:366;;;:::o;14997:::-;15139:3;15160:67;15224:2;15219:3;15160:67;:::i;:::-;15153:74;;15236:93;15325:3;15236:93;:::i;:::-;15354:2;15349:3;15345:12;15338:19;;14997:366;;;:::o;15369:::-;15511:3;15532:67;15596:2;15591:3;15532:67;:::i;:::-;15525:74;;15608:93;15697:3;15608:93;:::i;:::-;15726:2;15721:3;15717:12;15710:19;;15369:366;;;:::o;15741:::-;15883:3;15904:67;15968:2;15963:3;15904:67;:::i;:::-;15897:74;;15980:93;16069:3;15980:93;:::i;:::-;16098:2;16093:3;16089:12;16082:19;;15741:366;;;:::o;16113:::-;16255:3;16276:67;16340:2;16335:3;16276:67;:::i;:::-;16269:74;;16352:93;16441:3;16352:93;:::i;:::-;16470:2;16465:3;16461:12;16454:19;;16113:366;;;:::o;16485:::-;16627:3;16648:67;16712:2;16707:3;16648:67;:::i;:::-;16641:74;;16724:93;16813:3;16724:93;:::i;:::-;16842:2;16837:3;16833:12;16826:19;;16485:366;;;:::o;16857:::-;16999:3;17020:67;17084:2;17079:3;17020:67;:::i;:::-;17013:74;;17096:93;17185:3;17096:93;:::i;:::-;17214:2;17209:3;17205:12;17198:19;;16857:366;;;:::o;17229:::-;17371:3;17392:67;17456:2;17451:3;17392:67;:::i;:::-;17385:74;;17468:93;17557:3;17468:93;:::i;:::-;17586:2;17581:3;17577:12;17570:19;;17229:366;;;:::o;17601:::-;17743:3;17764:67;17828:2;17823:3;17764:67;:::i;:::-;17757:74;;17840:93;17929:3;17840:93;:::i;:::-;17958:2;17953:3;17949:12;17942:19;;17601:366;;;:::o;17973:::-;18115:3;18136:67;18200:2;18195:3;18136:67;:::i;:::-;18129:74;;18212:93;18301:3;18212:93;:::i;:::-;18330:2;18325:3;18321:12;18314:19;;17973:366;;;:::o;18345:::-;18487:3;18508:67;18572:2;18567:3;18508:67;:::i;:::-;18501:74;;18584:93;18673:3;18584:93;:::i;:::-;18702:2;18697:3;18693:12;18686:19;;18345:366;;;:::o;18717:::-;18859:3;18880:67;18944:2;18939:3;18880:67;:::i;:::-;18873:74;;18956:93;19045:3;18956:93;:::i;:::-;19074:2;19069:3;19065:12;19058:19;;18717:366;;;:::o;19089:::-;19231:3;19252:67;19316:2;19311:3;19252:67;:::i;:::-;19245:74;;19328:93;19417:3;19328:93;:::i;:::-;19446:2;19441:3;19437:12;19430:19;;19089:366;;;:::o;19461:::-;19603:3;19624:67;19688:2;19683:3;19624:67;:::i;:::-;19617:74;;19700:93;19789:3;19700:93;:::i;:::-;19818:2;19813:3;19809:12;19802:19;;19461:366;;;:::o;19833:::-;19975:3;19996:67;20060:2;20055:3;19996:67;:::i;:::-;19989:74;;20072:93;20161:3;20072:93;:::i;:::-;20190:2;20185:3;20181:12;20174:19;;19833:366;;;:::o;20205:::-;20347:3;20368:67;20432:2;20427:3;20368:67;:::i;:::-;20361:74;;20444:93;20533:3;20444:93;:::i;:::-;20562:2;20557:3;20553:12;20546:19;;20205:366;;;:::o;20577:::-;20719:3;20740:67;20804:2;20799:3;20740:67;:::i;:::-;20733:74;;20816:93;20905:3;20816:93;:::i;:::-;20934:2;20929:3;20925:12;20918:19;;20577:366;;;:::o;20949:::-;21091:3;21112:67;21176:2;21171:3;21112:67;:::i;:::-;21105:74;;21188:93;21277:3;21188:93;:::i;:::-;21306:2;21301:3;21297:12;21290:19;;20949:366;;;:::o;21321:::-;21463:3;21484:67;21548:2;21543:3;21484:67;:::i;:::-;21477:74;;21560:93;21649:3;21560:93;:::i;:::-;21678:2;21673:3;21669:12;21662:19;;21321:366;;;:::o;21693:::-;21835:3;21856:67;21920:2;21915:3;21856:67;:::i;:::-;21849:74;;21932:93;22021:3;21932:93;:::i;:::-;22050:2;22045:3;22041:12;22034:19;;21693:366;;;:::o;22065:::-;22207:3;22228:67;22292:2;22287:3;22228:67;:::i;:::-;22221:74;;22304:93;22393:3;22304:93;:::i;:::-;22422:2;22417:3;22413:12;22406:19;;22065:366;;;:::o;22437:::-;22579:3;22600:67;22664:2;22659:3;22600:67;:::i;:::-;22593:74;;22676:93;22765:3;22676:93;:::i;:::-;22794:2;22789:3;22785:12;22778:19;;22437:366;;;:::o;22809:::-;22951:3;22972:67;23036:2;23031:3;22972:67;:::i;:::-;22965:74;;23048:93;23137:3;23048:93;:::i;:::-;23166:2;23161:3;23157:12;23150:19;;22809:366;;;:::o;23181:::-;23323:3;23344:67;23408:2;23403:3;23344:67;:::i;:::-;23337:74;;23420:93;23509:3;23420:93;:::i;:::-;23538:2;23533:3;23529:12;23522:19;;23181:366;;;:::o;23553:::-;23695:3;23716:67;23780:2;23775:3;23716:67;:::i;:::-;23709:74;;23792:93;23881:3;23792:93;:::i;:::-;23910:2;23905:3;23901:12;23894:19;;23553:366;;;:::o;23925:::-;24067:3;24088:67;24152:2;24147:3;24088:67;:::i;:::-;24081:74;;24164:93;24253:3;24164:93;:::i;:::-;24282:2;24277:3;24273:12;24266:19;;23925:366;;;:::o;24297:::-;24439:3;24460:67;24524:2;24519:3;24460:67;:::i;:::-;24453:74;;24536:93;24625:3;24536:93;:::i;:::-;24654:2;24649:3;24645:12;24638:19;;24297:366;;;:::o;24669:402::-;24829:3;24850:85;24932:2;24927:3;24850:85;:::i;:::-;24843:92;;24944:93;25033:3;24944:93;:::i;:::-;25062:2;25057:3;25053:12;25046:19;;24669:402;;;:::o;25077:366::-;25219:3;25240:67;25304:2;25299:3;25240:67;:::i;:::-;25233:74;;25316:93;25405:3;25316:93;:::i;:::-;25434:2;25429:3;25425:12;25418:19;;25077:366;;;:::o;25449:402::-;25609:3;25630:85;25712:2;25707:3;25630:85;:::i;:::-;25623:92;;25724:93;25813:3;25724:93;:::i;:::-;25842:2;25837:3;25833:12;25826:19;;25449:402;;;:::o;25857:366::-;25999:3;26020:67;26084:2;26079:3;26020:67;:::i;:::-;26013:74;;26096:93;26185:3;26096:93;:::i;:::-;26214:2;26209:3;26205:12;26198:19;;25857:366;;;:::o;26229:::-;26371:3;26392:67;26456:2;26451:3;26392:67;:::i;:::-;26385:74;;26468:93;26557:3;26468:93;:::i;:::-;26586:2;26581:3;26577:12;26570:19;;26229:366;;;:::o;26601:108::-;26678:24;26696:5;26678:24;:::i;:::-;26673:3;26666:37;26601:108;;:::o;26715:118::-;26802:24;26820:5;26802:24;:::i;:::-;26797:3;26790:37;26715:118;;:::o;26839:115::-;26924:23;26941:5;26924:23;:::i;:::-;26919:3;26912:36;26839:115;;:::o;26960:429::-;27137:3;27159:92;27247:3;27238:6;27159:92;:::i;:::-;27152:99;;27268:95;27359:3;27350:6;27268:95;:::i;:::-;27261:102;;27380:3;27373:10;;26960:429;;;;;:::o;27395:967::-;27777:3;27799:148;27943:3;27799:148;:::i;:::-;27792:155;;27964:95;28055:3;28046:6;27964:95;:::i;:::-;27957:102;;28076:148;28220:3;28076:148;:::i;:::-;28069:155;;28241:95;28332:3;28323:6;28241:95;:::i;:::-;28234:102;;28353:3;28346:10;;27395:967;;;;;:::o;28368:222::-;28461:4;28499:2;28488:9;28484:18;28476:26;;28512:71;28580:1;28569:9;28565:17;28556:6;28512:71;:::i;:::-;28368:222;;;;:::o;28596:640::-;28791:4;28829:3;28818:9;28814:19;28806:27;;28843:71;28911:1;28900:9;28896:17;28887:6;28843:71;:::i;:::-;28924:72;28992:2;28981:9;28977:18;28968:6;28924:72;:::i;:::-;29006;29074:2;29063:9;29059:18;29050:6;29006:72;:::i;:::-;29125:9;29119:4;29115:20;29110:2;29099:9;29095:18;29088:48;29153:76;29224:4;29215:6;29153:76;:::i;:::-;29145:84;;28596:640;;;;;;;:::o;29242:706::-;29470:4;29508:3;29497:9;29493:19;29485:27;;29522:71;29590:1;29579:9;29575:17;29566:6;29522:71;:::i;:::-;29603:79;29678:2;29667:9;29663:18;29654:6;29603:79;:::i;:::-;29729:9;29723:4;29719:20;29714:2;29703:9;29699:18;29692:48;29757:108;29860:4;29851:6;29757:108;:::i;:::-;29749:116;;29875:66;29937:2;29926:9;29922:18;29913:6;29875:66;:::i;:::-;29242:706;;;;;;;:::o;29954:688::-;30173:4;30211:3;30200:9;30196:19;30188:27;;30225:71;30293:1;30282:9;30278:17;30269:6;30225:71;:::i;:::-;30306:70;30372:2;30361:9;30357:18;30348:6;30306:70;:::i;:::-;30423:9;30417:4;30413:20;30408:2;30397:9;30393:18;30386:48;30451:108;30554:4;30545:6;30451:108;:::i;:::-;30443:116;;30569:66;30631:2;30620:9;30616:18;30607:6;30569:66;:::i;:::-;29954:688;;;;;;;:::o;30648:210::-;30735:4;30773:2;30762:9;30758:18;30750:26;;30786:65;30848:1;30837:9;30833:17;30824:6;30786:65;:::i;:::-;30648:210;;;;:::o;30864:222::-;30957:4;30995:2;30984:9;30980:18;30972:26;;31008:71;31076:1;31065:9;31061:17;31052:6;31008:71;:::i;:::-;30864:222;;;;:::o;31092:313::-;31205:4;31243:2;31232:9;31228:18;31220:26;;31292:9;31286:4;31282:20;31278:1;31267:9;31263:17;31256:47;31320:78;31393:4;31384:6;31320:78;:::i;:::-;31312:86;;31092:313;;;;:::o;31411:419::-;31577:4;31615:2;31604:9;31600:18;31592:26;;31664:9;31658:4;31654:20;31650:1;31639:9;31635:17;31628:47;31692:131;31818:4;31692:131;:::i;:::-;31684:139;;31411:419;;;:::o;31836:::-;32002:4;32040:2;32029:9;32025:18;32017:26;;32089:9;32083:4;32079:20;32075:1;32064:9;32060:17;32053:47;32117:131;32243:4;32117:131;:::i;:::-;32109:139;;31836:419;;;:::o;32261:::-;32427:4;32465:2;32454:9;32450:18;32442:26;;32514:9;32508:4;32504:20;32500:1;32489:9;32485:17;32478:47;32542:131;32668:4;32542:131;:::i;:::-;32534:139;;32261:419;;;:::o;32686:::-;32852:4;32890:2;32879:9;32875:18;32867:26;;32939:9;32933:4;32929:20;32925:1;32914:9;32910:17;32903:47;32967:131;33093:4;32967:131;:::i;:::-;32959:139;;32686:419;;;:::o;33111:::-;33277:4;33315:2;33304:9;33300:18;33292:26;;33364:9;33358:4;33354:20;33350:1;33339:9;33335:17;33328:47;33392:131;33518:4;33392:131;:::i;:::-;33384:139;;33111:419;;;:::o;33536:::-;33702:4;33740:2;33729:9;33725:18;33717:26;;33789:9;33783:4;33779:20;33775:1;33764:9;33760:17;33753:47;33817:131;33943:4;33817:131;:::i;:::-;33809:139;;33536:419;;;:::o;33961:::-;34127:4;34165:2;34154:9;34150:18;34142:26;;34214:9;34208:4;34204:20;34200:1;34189:9;34185:17;34178:47;34242:131;34368:4;34242:131;:::i;:::-;34234:139;;33961:419;;;:::o;34386:::-;34552:4;34590:2;34579:9;34575:18;34567:26;;34639:9;34633:4;34629:20;34625:1;34614:9;34610:17;34603:47;34667:131;34793:4;34667:131;:::i;:::-;34659:139;;34386:419;;;:::o;34811:::-;34977:4;35015:2;35004:9;35000:18;34992:26;;35064:9;35058:4;35054:20;35050:1;35039:9;35035:17;35028:47;35092:131;35218:4;35092:131;:::i;:::-;35084:139;;34811:419;;;:::o;35236:::-;35402:4;35440:2;35429:9;35425:18;35417:26;;35489:9;35483:4;35479:20;35475:1;35464:9;35460:17;35453:47;35517:131;35643:4;35517:131;:::i;:::-;35509:139;;35236:419;;;:::o;35661:::-;35827:4;35865:2;35854:9;35850:18;35842:26;;35914:9;35908:4;35904:20;35900:1;35889:9;35885:17;35878:47;35942:131;36068:4;35942:131;:::i;:::-;35934:139;;35661:419;;;:::o;36086:::-;36252:4;36290:2;36279:9;36275:18;36267:26;;36339:9;36333:4;36329:20;36325:1;36314:9;36310:17;36303:47;36367:131;36493:4;36367:131;:::i;:::-;36359:139;;36086:419;;;:::o;36511:::-;36677:4;36715:2;36704:9;36700:18;36692:26;;36764:9;36758:4;36754:20;36750:1;36739:9;36735:17;36728:47;36792:131;36918:4;36792:131;:::i;:::-;36784:139;;36511:419;;;:::o;36936:::-;37102:4;37140:2;37129:9;37125:18;37117:26;;37189:9;37183:4;37179:20;37175:1;37164:9;37160:17;37153:47;37217:131;37343:4;37217:131;:::i;:::-;37209:139;;36936:419;;;:::o;37361:::-;37527:4;37565:2;37554:9;37550:18;37542:26;;37614:9;37608:4;37604:20;37600:1;37589:9;37585:17;37578:47;37642:131;37768:4;37642:131;:::i;:::-;37634:139;;37361:419;;;:::o;37786:::-;37952:4;37990:2;37979:9;37975:18;37967:26;;38039:9;38033:4;38029:20;38025:1;38014:9;38010:17;38003:47;38067:131;38193:4;38067:131;:::i;:::-;38059:139;;37786:419;;;:::o;38211:::-;38377:4;38415:2;38404:9;38400:18;38392:26;;38464:9;38458:4;38454:20;38450:1;38439:9;38435:17;38428:47;38492:131;38618:4;38492:131;:::i;:::-;38484:139;;38211:419;;;:::o;38636:::-;38802:4;38840:2;38829:9;38825:18;38817:26;;38889:9;38883:4;38879:20;38875:1;38864:9;38860:17;38853:47;38917:131;39043:4;38917:131;:::i;:::-;38909:139;;38636:419;;;:::o;39061:::-;39227:4;39265:2;39254:9;39250:18;39242:26;;39314:9;39308:4;39304:20;39300:1;39289:9;39285:17;39278:47;39342:131;39468:4;39342:131;:::i;:::-;39334:139;;39061:419;;;:::o;39486:::-;39652:4;39690:2;39679:9;39675:18;39667:26;;39739:9;39733:4;39729:20;39725:1;39714:9;39710:17;39703:47;39767:131;39893:4;39767:131;:::i;:::-;39759:139;;39486:419;;;:::o;39911:::-;40077:4;40115:2;40104:9;40100:18;40092:26;;40164:9;40158:4;40154:20;40150:1;40139:9;40135:17;40128:47;40192:131;40318:4;40192:131;:::i;:::-;40184:139;;39911:419;;;:::o;40336:::-;40502:4;40540:2;40529:9;40525:18;40517:26;;40589:9;40583:4;40579:20;40575:1;40564:9;40560:17;40553:47;40617:131;40743:4;40617:131;:::i;:::-;40609:139;;40336:419;;;:::o;40761:::-;40927:4;40965:2;40954:9;40950:18;40942:26;;41014:9;41008:4;41004:20;41000:1;40989:9;40985:17;40978:47;41042:131;41168:4;41042:131;:::i;:::-;41034:139;;40761:419;;;:::o;41186:::-;41352:4;41390:2;41379:9;41375:18;41367:26;;41439:9;41433:4;41429:20;41425:1;41414:9;41410:17;41403:47;41467:131;41593:4;41467:131;:::i;:::-;41459:139;;41186:419;;;:::o;41611:::-;41777:4;41815:2;41804:9;41800:18;41792:26;;41864:9;41858:4;41854:20;41850:1;41839:9;41835:17;41828:47;41892:131;42018:4;41892:131;:::i;:::-;41884:139;;41611:419;;;:::o;42036:::-;42202:4;42240:2;42229:9;42225:18;42217:26;;42289:9;42283:4;42279:20;42275:1;42264:9;42260:17;42253:47;42317:131;42443:4;42317:131;:::i;:::-;42309:139;;42036:419;;;:::o;42461:::-;42627:4;42665:2;42654:9;42650:18;42642:26;;42714:9;42708:4;42704:20;42700:1;42689:9;42685:17;42678:47;42742:131;42868:4;42742:131;:::i;:::-;42734:139;;42461:419;;;:::o;42886:::-;43052:4;43090:2;43079:9;43075:18;43067:26;;43139:9;43133:4;43129:20;43125:1;43114:9;43110:17;43103:47;43167:131;43293:4;43167:131;:::i;:::-;43159:139;;42886:419;;;:::o;43311:::-;43477:4;43515:2;43504:9;43500:18;43492:26;;43564:9;43558:4;43554:20;43550:1;43539:9;43535:17;43528:47;43592:131;43718:4;43592:131;:::i;:::-;43584:139;;43311:419;;;:::o;43736:::-;43902:4;43940:2;43929:9;43925:18;43917:26;;43989:9;43983:4;43979:20;43975:1;43964:9;43960:17;43953:47;44017:131;44143:4;44017:131;:::i;:::-;44009:139;;43736:419;;;:::o;44161:::-;44327:4;44365:2;44354:9;44350:18;44342:26;;44414:9;44408:4;44404:20;44400:1;44389:9;44385:17;44378:47;44442:131;44568:4;44442:131;:::i;:::-;44434:139;;44161:419;;;:::o;44586:::-;44752:4;44790:2;44779:9;44775:18;44767:26;;44839:9;44833:4;44829:20;44825:1;44814:9;44810:17;44803:47;44867:131;44993:4;44867:131;:::i;:::-;44859:139;;44586:419;;;:::o;45011:222::-;45104:4;45142:2;45131:9;45127:18;45119:26;;45155:71;45223:1;45212:9;45208:17;45199:6;45155:71;:::i;:::-;45011:222;;;;:::o;45239:129::-;45273:6;45300:20;;:::i;:::-;45290:30;;45329:33;45357:4;45349:6;45329:33;:::i;:::-;45239:129;;;:::o;45374:75::-;45407:6;45440:2;45434:9;45424:19;;45374:75;:::o;45455:311::-;45532:4;45622:18;45614:6;45611:30;45608:56;;;45644:18;;:::i;:::-;45608:56;45694:4;45686:6;45682:17;45674:25;;45754:4;45748;45744:15;45736:23;;45455:311;;;:::o;45772:307::-;45833:4;45923:18;45915:6;45912:30;45909:56;;;45945:18;;:::i;:::-;45909:56;45983:29;46005:6;45983:29;:::i;:::-;45975:37;;46067:4;46061;46057:15;46049:23;;45772:307;;;:::o;46085:308::-;46147:4;46237:18;46229:6;46226:30;46223:56;;;46259:18;;:::i;:::-;46223:56;46297:29;46319:6;46297:29;:::i;:::-;46289:37;;46381:4;46375;46371:15;46363:23;;46085:308;;;:::o;46399:132::-;46466:4;46489:3;46481:11;;46519:4;46514:3;46510:14;46502:22;;46399:132;;;:::o;46537:141::-;46586:4;46609:3;46601:11;;46632:3;46629:1;46622:14;46666:4;46663:1;46653:18;46645:26;;46537:141;;;:::o;46684:114::-;46751:6;46785:5;46779:12;46769:22;;46684:114;;;:::o;46804:98::-;46855:6;46889:5;46883:12;46873:22;;46804:98;;;:::o;46908:99::-;46960:6;46994:5;46988:12;46978:22;;46908:99;;;:::o;47013:113::-;47083:4;47115;47110:3;47106:14;47098:22;;47013:113;;;:::o;47132:184::-;47231:11;47265:6;47260:3;47253:19;47305:4;47300:3;47296:14;47281:29;;47132:184;;;;:::o;47322:168::-;47405:11;47439:6;47434:3;47427:19;47479:4;47474:3;47470:14;47455:29;;47322:168;;;;:::o;47496:169::-;47580:11;47614:6;47609:3;47602:19;47654:4;47649:3;47645:14;47630:29;;47496:169;;;;:::o;47671:148::-;47773:11;47810:3;47795:18;;47671:148;;;;:::o;47825:305::-;47865:3;47884:20;47902:1;47884:20;:::i;:::-;47879:25;;47918:20;47936:1;47918:20;:::i;:::-;47913:25;;48072:1;48004:66;48000:74;47997:1;47994:81;47991:107;;;48078:18;;:::i;:::-;47991:107;48122:1;48119;48115:9;48108:16;;47825:305;;;;:::o;48136:185::-;48176:1;48193:20;48211:1;48193:20;:::i;:::-;48188:25;;48227:20;48245:1;48227:20;:::i;:::-;48222:25;;48266:1;48256:35;;48271:18;;:::i;:::-;48256:35;48313:1;48310;48306:9;48301:14;;48136:185;;;;:::o;48327:348::-;48367:7;48390:20;48408:1;48390:20;:::i;:::-;48385:25;;48424:20;48442:1;48424:20;:::i;:::-;48419:25;;48612:1;48544:66;48540:74;48537:1;48534:81;48529:1;48522:9;48515:17;48511:105;48508:131;;;48619:18;;:::i;:::-;48508:131;48667:1;48664;48660:9;48649:20;;48327:348;;;;:::o;48681:191::-;48721:4;48741:20;48759:1;48741:20;:::i;:::-;48736:25;;48775:20;48793:1;48775:20;:::i;:::-;48770:25;;48814:1;48811;48808:8;48805:34;;;48819:18;;:::i;:::-;48805:34;48864:1;48861;48857:9;48849:17;;48681:191;;;;:::o;48878:96::-;48915:7;48944:24;48962:5;48944:24;:::i;:::-;48933:35;;48878:96;;;:::o;48980:90::-;49014:7;49057:5;49050:13;49043:21;49032:32;;48980:90;;;:::o;49076:77::-;49113:7;49142:5;49131:16;;49076:77;;;:::o;49159:149::-;49195:7;49235:66;49228:5;49224:78;49213:89;;49159:149;;;:::o;49314:126::-;49351:7;49391:42;49384:5;49380:54;49369:65;;49314:126;;;:::o;49446:77::-;49483:7;49512:5;49501:16;;49446:77;;;:::o;49529:93::-;49565:7;49605:10;49598:5;49594:22;49583:33;;49529:93;;;:::o;49628:101::-;49664:7;49704:18;49697:5;49693:30;49682:41;;49628:101;;;:::o;49735:119::-;49792:9;49825:23;49842:5;49825:23;:::i;:::-;49812:36;;49735:119;;;:::o;49860:154::-;49944:6;49939:3;49934;49921:30;50006:1;49997:6;49992:3;49988:16;49981:27;49860:154;;;:::o;50020:307::-;50088:1;50098:113;50112:6;50109:1;50106:13;50098:113;;;50197:1;50192:3;50188:11;50182:18;50178:1;50173:3;50169:11;50162:39;50134:2;50131:1;50127:10;50122:15;;50098:113;;;50229:6;50226:1;50223:13;50220:101;;;50309:1;50300:6;50295:3;50291:16;50284:27;50220:101;50069:258;50020:307;;;:::o;50333:171::-;50372:3;50395:24;50413:5;50395:24;:::i;:::-;50386:33;;50441:4;50434:5;50431:15;50428:41;;;50449:18;;:::i;:::-;50428:41;50496:1;50489:5;50485:13;50478:20;;50333:171;;;:::o;50510:320::-;50554:6;50591:1;50585:4;50581:12;50571:22;;50638:1;50632:4;50628:12;50659:18;50649:81;;50715:4;50707:6;50703:17;50693:27;;50649:81;50777:2;50769:6;50766:14;50746:18;50743:38;50740:84;;;50796:18;;:::i;:::-;50740:84;50561:269;50510:320;;;:::o;50836:281::-;50919:27;50941:4;50919:27;:::i;:::-;50911:6;50907:40;51049:6;51037:10;51034:22;51013:18;51001:10;50998:34;50995:62;50992:88;;;51060:18;;:::i;:::-;50992:88;51100:10;51096:2;51089:22;50879:238;50836:281;;:::o;51123:233::-;51162:3;51185:24;51203:5;51185:24;:::i;:::-;51176:33;;51231:66;51224:5;51221:77;51218:103;;;51301:18;;:::i;:::-;51218:103;51348:1;51341:5;51337:13;51330:20;;51123:233;;;:::o;51362:175::-;51400:3;51423:23;51440:5;51423:23;:::i;:::-;51414:32;;51468:10;51461:5;51458:21;51455:47;;;51482:18;;:::i;:::-;51455:47;51529:1;51522:5;51518:13;51511:20;;51362:175;;;:::o;51543:176::-;51575:1;51592:20;51610:1;51592:20;:::i;:::-;51587:25;;51626:20;51644:1;51626:20;:::i;:::-;51621:25;;51665:1;51655:35;;51670:18;;:::i;:::-;51655:35;51711:1;51708;51704:9;51699:14;;51543:176;;;;:::o;51725:180::-;51773:77;51770:1;51763:88;51870:4;51867:1;51860:15;51894:4;51891:1;51884:15;51911:180;51959:77;51956:1;51949:88;52056:4;52053:1;52046:15;52080:4;52077:1;52070:15;52097:180;52145:77;52142:1;52135:88;52242:4;52239:1;52232:15;52266:4;52263:1;52256:15;52283:180;52331:77;52328:1;52321:88;52428:4;52425:1;52418:15;52452:4;52449:1;52442:15;52469:180;52517:77;52514:1;52507:88;52614:4;52611:1;52604:15;52638:4;52635:1;52628:15;52655:117;52764:1;52761;52754:12;52778:117;52887:1;52884;52877:12;52901:117;53010:1;53007;53000:12;53024:117;53133:1;53130;53123:12;53147:117;53256:1;53253;53246:12;53270:102;53311:6;53362:2;53358:7;53353:2;53346:5;53342:14;53338:28;53328:38;;53270:102;;;:::o;53378:182::-;53518:34;53514:1;53506:6;53502:14;53495:58;53378:182;:::o;53566:172::-;53706:24;53702:1;53694:6;53690:14;53683:48;53566:172;:::o;53744:237::-;53884:34;53880:1;53872:6;53868:14;53861:58;53953:20;53948:2;53940:6;53936:15;53929:45;53744:237;:::o;53987:225::-;54127:34;54123:1;54115:6;54111:14;54104:58;54196:8;54191:2;54183:6;54179:15;54172:33;53987:225;:::o;54218:178::-;54358:30;54354:1;54346:6;54342:14;54335:54;54218:178;:::o;54402:177::-;54542:29;54538:1;54530:6;54526:14;54519:53;54402:177;:::o;54585:::-;54725:29;54721:1;54713:6;54709:14;54702:53;54585:177;:::o;54768:223::-;54908:34;54904:1;54896:6;54892:14;54885:58;54977:6;54972:2;54964:6;54960:15;54953:31;54768:223;:::o;54997:175::-;55137:27;55133:1;55125:6;55121:14;55114:51;54997:175;:::o;55178:181::-;55318:33;55314:1;55306:6;55302:14;55295:57;55178:181;:::o;55365:231::-;55505:34;55501:1;55493:6;55489:14;55482:58;55574:14;55569:2;55561:6;55557:15;55550:39;55365:231;:::o;55602:176::-;55742:28;55738:1;55730:6;55726:14;55719:52;55602:176;:::o;55784:243::-;55924:34;55920:1;55912:6;55908:14;55901:58;55993:26;55988:2;55980:6;55976:15;55969:51;55784:243;:::o;56033:229::-;56173:34;56169:1;56161:6;56157:14;56150:58;56242:12;56237:2;56229:6;56225:15;56218:37;56033:229;:::o;56268:228::-;56408:34;56404:1;56396:6;56392:14;56385:58;56477:11;56472:2;56464:6;56460:15;56453:36;56268:228;:::o;56502:181::-;56642:33;56638:1;56630:6;56626:14;56619:57;56502:181;:::o;56689:182::-;56829:34;56825:1;56817:6;56813:14;56806:58;56689:182;:::o;56877:245::-;57017:34;57013:1;57005:6;57001:14;56994:58;57086:28;57081:2;57073:6;57069:15;57062:53;56877:245;:::o;57128:220::-;57268:34;57264:1;57256:6;57252:14;57245:58;57337:3;57332:2;57324:6;57320:15;57313:28;57128:220;:::o;57354:::-;57494:34;57490:1;57482:6;57478:14;57471:58;57563:3;57558:2;57550:6;57546:15;57539:28;57354:220;:::o;57580:231::-;57720:34;57716:1;57708:6;57704:14;57697:58;57789:14;57784:2;57776:6;57772:15;57765:39;57580:231;:::o;57817:182::-;57957:34;57953:1;57945:6;57941:14;57934:58;57817:182;:::o;58005:228::-;58145:34;58141:1;58133:6;58129:14;58122:58;58214:11;58209:2;58201:6;58197:15;58190:36;58005:228;:::o;58239:234::-;58379:34;58375:1;58367:6;58363:14;58356:58;58448:17;58443:2;58435:6;58431:15;58424:42;58239:234;:::o;58479:220::-;58619:34;58615:1;58607:6;58603:14;58596:58;58688:3;58683:2;58675:6;58671:15;58664:28;58479:220;:::o;58705:236::-;58845:34;58841:1;58833:6;58829:14;58822:58;58914:19;58909:2;58901:6;58897:15;58890:44;58705:236;:::o;58947:227::-;59087:34;59083:1;59075:6;59071:14;59064:58;59156:10;59151:2;59143:6;59139:15;59132:35;58947:227;:::o;59180:244::-;59320:34;59316:1;59308:6;59304:14;59297:58;59389:27;59384:2;59376:6;59372:15;59365:52;59180:244;:::o;59430:241::-;59570:34;59566:1;59558:6;59554:14;59547:58;59639:24;59634:2;59626:6;59622:15;59615:49;59430:241;:::o;59677:173::-;59817:25;59813:1;59805:6;59801:14;59794:49;59677:173;:::o;59856:181::-;59996:33;59992:1;59984:6;59980:14;59973:57;59856:181;:::o;60043:167::-;60183:19;60179:1;60171:6;60167:14;60160:43;60043:167;:::o;60216:234::-;60356:34;60352:1;60344:6;60340:14;60333:58;60425:17;60420:2;60412:6;60408:15;60401:42;60216:234;:::o;60456:225::-;60596:34;60592:1;60584:6;60580:14;60573:58;60665:8;60660:2;60652:6;60648:15;60641:33;60456:225;:::o;60687:122::-;60760:24;60778:5;60760:24;:::i;:::-;60753:5;60750:35;60740:63;;60799:1;60796;60789:12;60740:63;60687:122;:::o;60815:116::-;60885:21;60900:5;60885:21;:::i;:::-;60878:5;60875:32;60865:60;;60921:1;60918;60911:12;60865:60;60815:116;:::o;60937:122::-;61010:24;61028:5;61010:24;:::i;:::-;61003:5;61000:35;60990:63;;61049:1;61046;61039:12;60990:63;60937:122;:::o;61065:120::-;61137:23;61154:5;61137:23;:::i;:::-;61130:5;61127:34;61117:62;;61175:1;61172;61165:12;61117:62;61065:120;:::o;61191:122::-;61264:24;61282:5;61264:24;:::i;:::-;61257:5;61254:35;61244:63;;61303:1;61300;61293:12;61244:63;61191:122;:::o;61319:120::-;61391:23;61408:5;61391:23;:::i;:::-;61384:5;61381:34;61371:62;;61429:1;61426;61419:12;61371:62;61319:120;:::o

Swarm Source

ipfs://1b5e3c78f5d65189ec39bc1c02cc8152aeb53029e04ade6498e75242eca2be36
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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