ETH Price: $3,710.22 (+3.23%)

Token

ERC-20: Free (FREE)
 

Overview

Max Total Supply

5,111 FREE

Holders

2,789

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 FREE
0xdced06f9a4f474f4314a779313b619fd11ee82ed
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:
Free

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 2 of 2: FreeBase.sol
// SPDX-License-Identifier: CC0


/*
 /$$$$$$$$ /$$$$$$$  /$$$$$$$$ /$$$$$$$$
| $$_____/| $$__  $$| $$_____/| $$_____/
| $$      | $$  \ $$| $$      | $$
| $$$$$   | $$$$$$$/| $$$$$   | $$$$$
| $$__/   | $$__  $$| $$__/   | $$__/
| $$      | $$  \ $$| $$      | $$
| $$      | $$  | $$| $$$$$$$$| $$$$$$$$
|__/      |__/  |__/|________/|________/



 /$$
| $$
| $$$$$$$  /$$   /$$
| $$__  $$| $$  | $$
| $$  \ $$| $$  | $$
| $$  | $$| $$  | $$
| $$$$$$$/|  $$$$$$$
|_______/  \____  $$
           /$$  | $$
          |  $$$$$$/
           \______/
  /$$$$$$  /$$$$$$$$ /$$$$$$$$ /$$    /$$ /$$$$$$ /$$$$$$$$ /$$$$$$$
 /$$__  $$|__  $$__/| $$_____/| $$   | $$|_  $$_/| $$_____/| $$__  $$
| $$  \__/   | $$   | $$      | $$   | $$  | $$  | $$      | $$  \ $$
|  $$$$$$    | $$   | $$$$$   |  $$ / $$/  | $$  | $$$$$   | $$$$$$$/
 \____  $$   | $$   | $$__/    \  $$ $$/   | $$  | $$__/   | $$____/
 /$$  \ $$   | $$   | $$        \  $$$/    | $$  | $$      | $$
|  $$$$$$/   | $$   | $$$$$$$$   \  $/    /$$$$$$| $$$$$$$$| $$
 \______/    |__/   |________/    \_/    |______/|________/|__/


CC0 2021
*/


import "./Dependencies.sol";


pragma solidity ^0.8.11;


contract Free is ERC721, Ownable {
  using Strings for uint256;
  uint256 private _tokenIdCounter;
  uint256 private _collectionIdCounter;

  string constant public license = 'CC0';

  struct Metadata {
    uint256 collectionId;
    string namePrefix;
    string externalUrl;
    string imgUrl;
    string imgExtension;
    string description;
  }

  mapping(uint256 => Metadata) public collectionIdToMetadata;
  mapping(uint256 => uint256) public tokenIdToCollectionId;
  mapping(uint256 => uint256) public tokenIdToCollectionCount;
  mapping(uint256 => address) public collectionIdToMinter;
  mapping(uint256 => uint256) public collectionSupply;
  mapping(uint256 => string) public tokenIdToAttributes;
  mapping(address => bool) attributeUpdateAllowList;


  event ProjectEvent(address indexed poster, string indexed eventType, string content);
  event TokenEvent(address indexed poster, uint256 indexed tokenId, string indexed eventType, string content);

  constructor() ERC721('Free', 'FREE') {
    _tokenIdCounter = 0;
    _collectionIdCounter = 0;
  }

  function totalSupply() public view virtual returns (uint256) {
    return _tokenIdCounter;
  }

  function createCollection(
    address minter,
    string calldata _namePrefix,
    string calldata _externalUrl,
    string calldata _imgUrl,
    string calldata _imgExtension,
    string calldata _description
  ) public onlyOwner {
    collectionIdToMinter[_collectionIdCounter] = minter;
    attributeUpdateAllowList[minter] = true;

    Metadata storage metadata = collectionIdToMetadata[_collectionIdCounter];
    metadata.namePrefix = _namePrefix;
    metadata.externalUrl = _externalUrl;
    metadata.imgUrl = _imgUrl;
    metadata.imgExtension = _imgExtension;
    metadata.description = _description;

    _collectionIdCounter++;
  }

  function mint(uint256 collectionId, address to) public {
    require(collectionIdToMinter[collectionId] == _msgSender(), 'Caller is not the minting address');
    require(collectionId < _collectionIdCounter, 'Collection ID does not exist');

    _mint(to, _tokenIdCounter);
    tokenIdToCollectionId[_tokenIdCounter] = collectionId;

    tokenIdToCollectionCount[_tokenIdCounter] = collectionSupply[collectionId];
    collectionSupply[collectionId]++;
    _tokenIdCounter++;
  }

  function appendAttributeToToken(uint256 tokenId, string calldata attrKey, string calldata attrValue) public {
    require(attributeUpdateAllowList[msg.sender], "Sender not on attribute update allow list.");

    string memory existingAttrs = tokenIdToAttributes[tokenId];

    tokenIdToAttributes[tokenId] = string(abi.encodePacked(
      existingAttrs, ',{"trait_type":"', attrKey,'","value":', attrValue,'}'
    ));
  }


  function setMintingAddress(uint256 collectionId, address minter) public onlyOwner {
    require(collectionId < _collectionIdCounter, 'Collection ID does not exist');

    address existingMinter = collectionIdToMinter[collectionId];
    attributeUpdateAllowList[existingMinter] = false;
    attributeUpdateAllowList[minter] = true;
    collectionIdToMinter[collectionId] = minter;
  }


  function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
    require(_exists(tokenId), 'ERC721Metadata: URI query for nonexistent token');

    Metadata memory metadata = collectionIdToMetadata[tokenIdToCollectionId[tokenId]];
    string memory tokenIdString = tokenId.toString();
    string memory collectionIdString = tokenIdToCollectionId[tokenId].toString();
    string memory collectionCountString = tokenIdToCollectionCount[tokenId].toString();
    string memory tokenAttributes = tokenIdToAttributes[tokenId];

    string memory json = Base64.encode(
      bytes(
        string(
          abi.encodePacked(
            '{"name": "', metadata.namePrefix, collectionCountString,
            '", "description": "', metadata.description,
            '", "license": "', license,
            '", "image": "', metadata.imgUrl, metadata.imgExtension,
            '", "external_url": "', metadata.externalUrl, '?collectionId=', collectionIdString, '&tokenId=', tokenIdString,
            '", "attributes": [{"trait_type":"Collection", "value":"', collectionIdString,'"}', tokenAttributes, ']}'
          )
        )
      )
    );
    return string(abi.encodePacked('data:application/json;base64,', json));

  }


  function updateMetadataParams(
    uint256 collectionId,
    string calldata _namePrefix,
    string calldata _externalUrl,
    string calldata _imgUrl,
    string calldata _imgExtension,
    string calldata _description
  ) public onlyOwner {
    Metadata storage metadata = collectionIdToMetadata[collectionId];

    metadata.namePrefix = _namePrefix;
    metadata.externalUrl = _externalUrl;
    metadata.imgUrl = _imgUrl;
    metadata.imgExtension = _imgExtension;
    metadata.description = _description;
  }

  function emitProjectEvent(string calldata _eventType, string calldata _content) public onlyOwner {
    emit ProjectEvent(_msgSender(), _eventType, _content);
  }

  function emitTokenEvent(uint256 tokenId, string calldata _eventType, string calldata _content) public {
    require(
      owner() == _msgSender() || ERC721.ownerOf(tokenId) == _msgSender(),
      'Only project or token owner can emit token event'
    );
    emit TokenEvent(_msgSender(), tokenId, _eventType, _content);
  }
}

File 1 of 2: Dependencies.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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



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

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

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

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

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

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

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

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

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

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

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

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



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


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

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



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

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

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


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




/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((len + 2) / 3);

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

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



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




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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        // _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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







Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"poster","type":"address"},{"indexed":true,"internalType":"string","name":"eventType","type":"string"},{"indexed":false,"internalType":"string","name":"content","type":"string"}],"name":"ProjectEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"poster","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"string","name":"eventType","type":"string"},{"indexed":false,"internalType":"string","name":"content","type":"string"}],"name":"TokenEvent","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"attrKey","type":"string"},{"internalType":"string","name":"attrValue","type":"string"}],"name":"appendAttributeToToken","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"collectionIdToMetadata","outputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"},{"internalType":"string","name":"namePrefix","type":"string"},{"internalType":"string","name":"externalUrl","type":"string"},{"internalType":"string","name":"imgUrl","type":"string"},{"internalType":"string","name":"imgExtension","type":"string"},{"internalType":"string","name":"description","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"collectionIdToMinter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"collectionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"},{"internalType":"string","name":"_namePrefix","type":"string"},{"internalType":"string","name":"_externalUrl","type":"string"},{"internalType":"string","name":"_imgUrl","type":"string"},{"internalType":"string","name":"_imgExtension","type":"string"},{"internalType":"string","name":"_description","type":"string"}],"name":"createCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_eventType","type":"string"},{"internalType":"string","name":"_content","type":"string"}],"name":"emitProjectEvent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_eventType","type":"string"},{"internalType":"string","name":"_content","type":"string"}],"name":"emitTokenEvent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"license","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"},{"internalType":"address","name":"minter","type":"address"}],"name":"setMintingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdToAttributes","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdToCollectionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdToCollectionId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"},{"internalType":"string","name":"_namePrefix","type":"string"},{"internalType":"string","name":"_externalUrl","type":"string"},{"internalType":"string","name":"_imgUrl","type":"string"},{"internalType":"string","name":"_imgExtension","type":"string"},{"internalType":"string","name":"_description","type":"string"}],"name":"updateMetadataParams","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280600481526020017f46726565000000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4652454500000000000000000000000000000000000000000000000000000000815250816000908051906020019062000096929190620001b6565b508060019080519060200190620000af929190620001b6565b505050620000d2620000c6620000e860201b60201c565b620000f060201b60201c565b60006007819055506000600881905550620002cb565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001c49062000295565b90600052602060002090601f016020900481019282620001e8576000855562000234565b82601f106200020357805160ff191683800117855562000234565b8280016001018555821562000234579182015b828111156200023357825182559160200191906001019062000216565b5b50905062000243919062000247565b5090565b5b808211156200026257600081600090555060010162000248565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002ae57607f821691505b60208210811415620002c557620002c462000266565b5b50919050565b61500e80620002db6000396000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c806370a082311161010f578063b88d4fde116100a2578063dc4f2bbc11610071578063dc4f2bbc1461058a578063e985e9c5146105ba578063f2fde38b146105ea578063f51c8ce514610606576101e5565b8063b88d4fde14610506578063c3ac399e14610522578063c87b56dd1461053e578063d4434ab01461056e576101e5565b80638da5cb5b116100de5780638da5cb5b1461049257806394bf804d146104b057806395d89b41146104cc578063a22cb465146104ea576101e5565b806370a082311461040c578063715018a61461043c57806375c10ffa1461044657806380abf7c414610476576101e5565b80631febbd4b1161018757806342842e0e1161015657806342842e0e1461038657806352a6c8c9146103a25780636352211e146103be5780636b87d24c146103ee576101e5565b80631febbd4b1461030257806323b872dd146103325780632c4d6f7e1461034e5780633a5c35dc1461036a576101e5565b8063095ea7b3116101c3578063095ea7b3146102685780631177f3791461028457806318160ddd146102b45780631ae21c74146102d2576101e5565b806301ffc9a7146101ea57806306fdde031461021a578063081812fc14610238575b600080fd5b61020460048036038101906101ff9190613103565b61063b565b604051610211919061314b565b60405180910390f35b61022261071d565b60405161022f91906131ff565b60405180910390f35b610252600480360381019061024d9190613257565b6107af565b60405161025f91906132c5565b60405180910390f35b610282600480360381019061027d919061330c565b610834565b005b61029e60048036038101906102999190613257565b61094c565b6040516102ab91906131ff565b60405180910390f35b6102bc6109ec565b6040516102c9919061335b565b60405180910390f35b6102ec60048036038101906102e79190613257565b6109f6565b6040516102f9919061335b565b60405180910390f35b61031c60048036038101906103179190613257565b610a0e565b60405161032991906132c5565b60405180910390f35b61034c60048036038101906103479190613376565b610a41565b005b610368600480360381019061036391906133c9565b610aa1565b005b610384600480360381019061037f919061346e565b610ca0565b005b6103a0600480360381019061039b9190613376565b610da5565b005b6103bc60048036038101906103b7919061359f565b610dc5565b005b6103d860048036038101906103d39190613257565b610efd565b6040516103e591906132c5565b60405180910390f35b6103f6610faf565b60405161040391906131ff565b60405180910390f35b61042660048036038101906104219190613634565b610fe8565b604051610433919061335b565b60405180910390f35b6104446110a0565b005b610460600480360381019061045b9190613257565b611128565b60405161046d919061335b565b60405180910390f35b610490600480360381019061048b9190613661565b611140565b005b61049a61130b565b6040516104a791906132c5565b60405180910390f35b6104ca60048036038101906104c591906133c9565b611335565b005b6104d46114b9565b6040516104e191906131ff565b60405180910390f35b61050460048036038101906104ff91906137be565b61154b565b005b610520600480360381019061051b919061392e565b6116cc565b005b61053c6004803603810190610537919061359f565b61172e565b005b61055860048036038101906105539190613257565b6118b1565b60405161056591906131ff565b60405180910390f35b610588600480360381019061058391906139b1565b611db7565b005b6105a4600480360381019061059f9190613257565b611ea8565b6040516105b1919061335b565b60405180910390f35b6105d460048036038101906105cf9190613a32565b611ec0565b6040516105e1919061314b565b60405180910390f35b61060460048036038101906105ff9190613634565b611f54565b005b610620600480360381019061061b9190613257565b61204c565b60405161063296959493929190613a72565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061070657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610716575061071582612330565b5b9050919050565b60606000805461072c90613b25565b80601f016020809104026020016040519081016040528092919081815260200182805461075890613b25565b80156107a55780601f1061077a576101008083540402835291602001916107a5565b820191906000526020600020905b81548152906001019060200180831161078857829003601f168201915b5050505050905090565b60006107ba8261239a565b6107f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f090613bc9565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061083f82610efd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a790613c5b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108cf612406565b73ffffffffffffffffffffffffffffffffffffffff1614806108fe57506108fd816108f8612406565b611ec0565b5b61093d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093490613ced565b60405180910390fd5b610947838361240e565b505050565b600e602052806000526040600020600091509050805461096b90613b25565b80601f016020809104026020016040519081016040528092919081815260200182805461099790613b25565b80156109e45780601f106109b9576101008083540402835291602001916109e4565b820191906000526020600020905b8154815290600101906020018083116109c757829003601f168201915b505050505081565b6000600754905090565b600d6020528060005260406000206000915090505481565b600c6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610a52610a4c612406565b826124c7565b610a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8890613d7f565b60405180910390fd5b610a9c8383836125a5565b505050565b610aa9612406565b73ffffffffffffffffffffffffffffffffffffffff16610ac761130b565b73ffffffffffffffffffffffffffffffffffffffff1614610b1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1490613deb565b60405180910390fd5b6008548210610b61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5890613e57565b60405180910390fd5b6000600c600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555081600c600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b610ca8612406565b73ffffffffffffffffffffffffffffffffffffffff16610cc661130b565b73ffffffffffffffffffffffffffffffffffffffff1614610d1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1390613deb565b60405180910390fd5b6000600960008d815260200190815260200160002090508a8a826001019190610d46929190612f6e565b508888826002019190610d5a929190612f6e565b508686826003019190610d6e929190612f6e565b508484826004019190610d82929190612f6e565b508282826005019190610d96929190612f6e565b50505050505050505050505050565b610dc0838383604051806020016040528060008152506116cc565b505050565b610dcd612406565b73ffffffffffffffffffffffffffffffffffffffff16610deb61130b565b73ffffffffffffffffffffffffffffffffffffffff161480610e475750610e10612406565b73ffffffffffffffffffffffffffffffffffffffff16610e2f86610efd565b73ffffffffffffffffffffffffffffffffffffffff16145b610e86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7d90613ee9565b60405180910390fd5b8383604051610e96929190613f39565b604051809103902085610ea7612406565b73ffffffffffffffffffffffffffffffffffffffff167fad000c5a693465b4555f1044ddd1221ef0bfc49e5621ceb705b952ff97e2caac8585604051610eee929190613f7f565b60405180910390a45050505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9d90614015565b60405180910390fd5b80915050919050565b6040518060400160405280600381526020017f434330000000000000000000000000000000000000000000000000000000000081525081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611059576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611050906140a7565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110a8612406565b73ffffffffffffffffffffffffffffffffffffffff166110c661130b565b73ffffffffffffffffffffffffffffffffffffffff161461111c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111390613deb565b60405180910390fd5b61112660006127f6565b565b600a6020528060005260406000206000915090505481565b611148612406565b73ffffffffffffffffffffffffffffffffffffffff1661116661130b565b73ffffffffffffffffffffffffffffffffffffffff16146111bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b390613deb565b60405180910390fd5b8a600c6000600854815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600f60008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600060096000600854815260200190815260200160002090508a8a826001019190611294929190612f6e565b5088888260020191906112a8929190612f6e565b5086868260030191906112bc929190612f6e565b5084848260040191906112d0929190612f6e565b5082828260050191906112e4929190612f6e565b50600860008154809291906112f8906140f6565b9190505550505050505050505050505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61133d612406565b73ffffffffffffffffffffffffffffffffffffffff16600c600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146113dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d4906141b1565b60405180910390fd5b6008548210611421576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141890613e57565b60405180910390fd5b61142d816007546128bc565b81600a6000600754815260200190815260200160002081905550600d600083815260200190815260200160002054600b6000600754815260200190815260200160002081905550600d60008381526020019081526020016000206000815480929190611498906140f6565b9190505550600760008154809291906114b0906140f6565b91905055505050565b6060600180546114c890613b25565b80601f01602080910402602001604051908101604052809291908181526020018280546114f490613b25565b80156115415780601f1061151657610100808354040283529160200191611541565b820191906000526020600020905b81548152906001019060200180831161152457829003601f168201915b5050505050905090565b611553612406565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b89061421d565b60405180910390fd5b80600560006115ce612406565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661167b612406565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116c0919061314b565b60405180910390a35050565b6116dd6116d7612406565b836124c7565b61171c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171390613d7f565b60405180910390fd5b61172884848484612a7e565b50505050565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166117ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b1906142af565b60405180910390fd5b6000600e600087815260200190815260200160002080546117da90613b25565b80601f016020809104026020016040519081016040528092919081815260200182805461180690613b25565b80156118535780601f1061182857610100808354040283529160200191611853565b820191906000526020600020905b81548152906001019060200180831161183657829003601f168201915b5050505050905080858585856040516020016118739594939291906143e4565b604051602081830303815290604052600e600088815260200190815260200160002090805190602001906118a8929190612ff4565b50505050505050565b60606118bc8261239a565b6118fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f2906144ac565b60405180910390fd5b600060096000600a60008681526020019081526020016000205481526020019081526020016000206040518060c00160405290816000820154815260200160018201805461194890613b25565b80601f016020809104026020016040519081016040528092919081815260200182805461197490613b25565b80156119c15780601f10611996576101008083540402835291602001916119c1565b820191906000526020600020905b8154815290600101906020018083116119a457829003601f168201915b505050505081526020016002820180546119da90613b25565b80601f0160208091040260200160405190810160405280929190818152602001828054611a0690613b25565b8015611a535780601f10611a2857610100808354040283529160200191611a53565b820191906000526020600020905b815481529060010190602001808311611a3657829003601f168201915b50505050508152602001600382018054611a6c90613b25565b80601f0160208091040260200160405190810160405280929190818152602001828054611a9890613b25565b8015611ae55780601f10611aba57610100808354040283529160200191611ae5565b820191906000526020600020905b815481529060010190602001808311611ac857829003601f168201915b50505050508152602001600482018054611afe90613b25565b80601f0160208091040260200160405190810160405280929190818152602001828054611b2a90613b25565b8015611b775780601f10611b4c57610100808354040283529160200191611b77565b820191906000526020600020905b815481529060010190602001808311611b5a57829003601f168201915b50505050508152602001600582018054611b9090613b25565b80601f0160208091040260200160405190810160405280929190818152602001828054611bbc90613b25565b8015611c095780601f10611bde57610100808354040283529160200191611c09565b820191906000526020600020905b815481529060010190602001808311611bec57829003601f168201915b50505050508152505090506000611c1f84612ada565b90506000611c3f600a600087815260200190815260200160002054612ada565b90506000611c5f600b600088815260200190815260200160002054612ada565b90506000600e60008881526020019081526020016000208054611c8190613b25565b80601f0160208091040260200160405190810160405280929190818152602001828054611cad90613b25565b8015611cfa5780601f10611ccf57610100808354040283529160200191611cfa565b820191906000526020600020905b815481529060010190602001808311611cdd57829003601f168201915b505050505090506000611d888660200151848860a001516040518060400160405280600381526020017f43433000000000000000000000000000000000000000000000000000000000008152508a606001518b608001518c604001518b8d8d8c604051602001611d749b9a999897969594939291906147ea565b604051602081830303815290604052612c3b565b905080604051602001611d9b919061493d565b6040516020818303038152906040529650505050505050919050565b611dbf612406565b73ffffffffffffffffffffffffffffffffffffffff16611ddd61130b565b73ffffffffffffffffffffffffffffffffffffffff1614611e33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2a90613deb565b60405180910390fd5b8383604051611e43929190613f39565b6040518091039020611e53612406565b73ffffffffffffffffffffffffffffffffffffffff167f3d366eac52dec4372766dc4b15bba20b935b45d33171465a598eedabb5a5dff88484604051611e9a929190613f7f565b60405180910390a350505050565b600b6020528060005260406000206000915090505481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f5c612406565b73ffffffffffffffffffffffffffffffffffffffff16611f7a61130b565b73ffffffffffffffffffffffffffffffffffffffff1614611fd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc790613deb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612040576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612037906149d1565b60405180910390fd5b612049816127f6565b50565b600960205280600052604060002060009150905080600001549080600101805461207590613b25565b80601f01602080910402602001604051908101604052809291908181526020018280546120a190613b25565b80156120ee5780601f106120c3576101008083540402835291602001916120ee565b820191906000526020600020905b8154815290600101906020018083116120d157829003601f168201915b50505050509080600201805461210390613b25565b80601f016020809104026020016040519081016040528092919081815260200182805461212f90613b25565b801561217c5780601f106121515761010080835404028352916020019161217c565b820191906000526020600020905b81548152906001019060200180831161215f57829003601f168201915b50505050509080600301805461219190613b25565b80601f01602080910402602001604051908101604052809291908181526020018280546121bd90613b25565b801561220a5780601f106121df5761010080835404028352916020019161220a565b820191906000526020600020905b8154815290600101906020018083116121ed57829003601f168201915b50505050509080600401805461221f90613b25565b80601f016020809104026020016040519081016040528092919081815260200182805461224b90613b25565b80156122985780601f1061226d57610100808354040283529160200191612298565b820191906000526020600020905b81548152906001019060200180831161227b57829003601f168201915b5050505050908060050180546122ad90613b25565b80601f01602080910402602001604051908101604052809291908181526020018280546122d990613b25565b80156123265780601f106122fb57610100808354040283529160200191612326565b820191906000526020600020905b81548152906001019060200180831161230957829003601f168201915b5050505050905086565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661248183610efd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006124d28261239a565b612511576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250890614a63565b60405180910390fd5b600061251c83610efd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061258b57508373ffffffffffffffffffffffffffffffffffffffff16612573846107af565b73ffffffffffffffffffffffffffffffffffffffff16145b8061259c575061259b8185611ec0565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166125c582610efd565b73ffffffffffffffffffffffffffffffffffffffff161461261b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261290614af5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561268b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268290614b87565b60405180910390fd5b61269660008261240e565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126e69190614ba7565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461273d9190614bdb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561292c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292390614c7d565b60405180910390fd5b6129358161239a565b15612975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296c90614ce9565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129c59190614bdb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612a898484846125a5565b612a9584848484612dd3565b612ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612acb90614d7b565b60405180910390fd5b50505050565b60606000821415612b22576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c36565b600082905060005b60008214612b54578080612b3d906140f6565b915050600a82612b4d9190614dca565b9150612b2a565b60008167ffffffffffffffff811115612b7057612b6f613803565b5b6040519080825280601f01601f191660200182016040528015612ba25781602001600182028036833780820191505090505b5090505b60008514612c2f57600182612bbb9190614ba7565b9150600a85612bca9190614dfb565b6030612bd69190614bdb565b60f81b818381518110612bec57612beb614e2c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c289190614dca565b9450612ba6565b8093505050505b919050565b60606000825190506000811415612c645760405180602001604052806000815250915050612dce565b60006003600283612c759190614bdb565b612c7f9190614dca565b6004612c8b9190614e5b565b90506000602082612c9c9190614bdb565b67ffffffffffffffff811115612cb557612cb4613803565b5b6040519080825280601f01601f191660200182016040528015612ce75781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001614f99604091399050600181016020830160005b86811015612d8b5760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050612d12565b506003860660018114612da55760028114612db557612dc0565b613d3d60f01b6002830352612dc0565b603d60f81b60018303525b508484525050819450505050505b919050565b6000612df48473ffffffffffffffffffffffffffffffffffffffff16612f5b565b15612f4e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e1d612406565b8786866040518563ffffffff1660e01b8152600401612e3f9493929190614f0a565b6020604051808303816000875af1925050508015612e7b57506040513d601f19601f82011682018060405250810190612e789190614f6b565b60015b612efe573d8060008114612eab576040519150601f19603f3d011682016040523d82523d6000602084013e612eb0565b606091505b50600081511415612ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eed90614d7b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f53565b600190505b949350505050565b600080823b905060008111915050919050565b828054612f7a90613b25565b90600052602060002090601f016020900481019282612f9c5760008555612fe3565b82601f10612fb557803560ff1916838001178555612fe3565b82800160010185558215612fe3579182015b82811115612fe2578235825591602001919060010190612fc7565b5b509050612ff0919061307a565b5090565b82805461300090613b25565b90600052602060002090601f0160209004810192826130225760008555613069565b82601f1061303b57805160ff1916838001178555613069565b82800160010185558215613069579182015b8281111561306857825182559160200191906001019061304d565b5b509050613076919061307a565b5090565b5b8082111561309357600081600090555060010161307b565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6130e0816130ab565b81146130eb57600080fd5b50565b6000813590506130fd816130d7565b92915050565b600060208284031215613119576131186130a1565b5b6000613127848285016130ee565b91505092915050565b60008115159050919050565b61314581613130565b82525050565b6000602082019050613160600083018461313c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156131a0578082015181840152602081019050613185565b838111156131af576000848401525b50505050565b6000601f19601f8301169050919050565b60006131d182613166565b6131db8185613171565b93506131eb818560208601613182565b6131f4816131b5565b840191505092915050565b6000602082019050818103600083015261321981846131c6565b905092915050565b6000819050919050565b61323481613221565b811461323f57600080fd5b50565b6000813590506132518161322b565b92915050565b60006020828403121561326d5761326c6130a1565b5b600061327b84828501613242565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006132af82613284565b9050919050565b6132bf816132a4565b82525050565b60006020820190506132da60008301846132b6565b92915050565b6132e9816132a4565b81146132f457600080fd5b50565b600081359050613306816132e0565b92915050565b60008060408385031215613323576133226130a1565b5b6000613331858286016132f7565b925050602061334285828601613242565b9150509250929050565b61335581613221565b82525050565b6000602082019050613370600083018461334c565b92915050565b60008060006060848603121561338f5761338e6130a1565b5b600061339d868287016132f7565b93505060206133ae868287016132f7565b92505060406133bf86828701613242565b9150509250925092565b600080604083850312156133e0576133df6130a1565b5b60006133ee85828601613242565b92505060206133ff858286016132f7565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f84011261342e5761342d613409565b5b8235905067ffffffffffffffff81111561344b5761344a61340e565b5b60208301915083600182028301111561346757613466613413565b5b9250929050565b600080600080600080600080600080600060c08c8e031215613493576134926130a1565b5b60006134a18e828f01613242565b9b505060208c013567ffffffffffffffff8111156134c2576134c16130a6565b5b6134ce8e828f01613418565b9a509a505060408c013567ffffffffffffffff8111156134f1576134f06130a6565b5b6134fd8e828f01613418565b985098505060608c013567ffffffffffffffff8111156135205761351f6130a6565b5b61352c8e828f01613418565b965096505060808c013567ffffffffffffffff81111561354f5761354e6130a6565b5b61355b8e828f01613418565b945094505060a08c013567ffffffffffffffff81111561357e5761357d6130a6565b5b61358a8e828f01613418565b92509250509295989b509295989b9093969950565b6000806000806000606086880312156135bb576135ba6130a1565b5b60006135c988828901613242565b955050602086013567ffffffffffffffff8111156135ea576135e96130a6565b5b6135f688828901613418565b9450945050604086013567ffffffffffffffff811115613619576136186130a6565b5b61362588828901613418565b92509250509295509295909350565b60006020828403121561364a576136496130a1565b5b6000613658848285016132f7565b91505092915050565b600080600080600080600080600080600060c08c8e031215613686576136856130a1565b5b60006136948e828f016132f7565b9b505060208c013567ffffffffffffffff8111156136b5576136b46130a6565b5b6136c18e828f01613418565b9a509a505060408c013567ffffffffffffffff8111156136e4576136e36130a6565b5b6136f08e828f01613418565b985098505060608c013567ffffffffffffffff811115613713576137126130a6565b5b61371f8e828f01613418565b965096505060808c013567ffffffffffffffff811115613742576137416130a6565b5b61374e8e828f01613418565b945094505060a08c013567ffffffffffffffff811115613771576137706130a6565b5b61377d8e828f01613418565b92509250509295989b509295989b9093969950565b61379b81613130565b81146137a657600080fd5b50565b6000813590506137b881613792565b92915050565b600080604083850312156137d5576137d46130a1565b5b60006137e3858286016132f7565b92505060206137f4858286016137a9565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61383b826131b5565b810181811067ffffffffffffffff8211171561385a57613859613803565b5b80604052505050565b600061386d613097565b90506138798282613832565b919050565b600067ffffffffffffffff82111561389957613898613803565b5b6138a2826131b5565b9050602081019050919050565b82818337600083830152505050565b60006138d16138cc8461387e565b613863565b9050828152602081018484840111156138ed576138ec6137fe565b5b6138f88482856138af565b509392505050565b600082601f83011261391557613914613409565b5b81356139258482602086016138be565b91505092915050565b60008060008060808587031215613948576139476130a1565b5b6000613956878288016132f7565b9450506020613967878288016132f7565b935050604061397887828801613242565b925050606085013567ffffffffffffffff811115613999576139986130a6565b5b6139a587828801613900565b91505092959194509250565b600080600080604085870312156139cb576139ca6130a1565b5b600085013567ffffffffffffffff8111156139e9576139e86130a6565b5b6139f587828801613418565b9450945050602085013567ffffffffffffffff811115613a1857613a176130a6565b5b613a2487828801613418565b925092505092959194509250565b60008060408385031215613a4957613a486130a1565b5b6000613a57858286016132f7565b9250506020613a68858286016132f7565b9150509250929050565b600060c082019050613a87600083018961334c565b8181036020830152613a9981886131c6565b90508181036040830152613aad81876131c6565b90508181036060830152613ac181866131c6565b90508181036080830152613ad581856131c6565b905081810360a0830152613ae981846131c6565b9050979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613b3d57607f821691505b60208210811415613b5157613b50613af6565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613bb3602c83613171565b9150613bbe82613b57565b604082019050919050565b60006020820190508181036000830152613be281613ba6565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613c45602183613171565b9150613c5082613be9565b604082019050919050565b60006020820190508181036000830152613c7481613c38565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613cd7603883613171565b9150613ce282613c7b565b604082019050919050565b60006020820190508181036000830152613d0681613cca565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613d69603183613171565b9150613d7482613d0d565b604082019050919050565b60006020820190508181036000830152613d9881613d5c565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613dd5602083613171565b9150613de082613d9f565b602082019050919050565b60006020820190508181036000830152613e0481613dc8565b9050919050565b7f436f6c6c656374696f6e20494420646f6573206e6f7420657869737400000000600082015250565b6000613e41601c83613171565b9150613e4c82613e0b565b602082019050919050565b60006020820190508181036000830152613e7081613e34565b9050919050565b7f4f6e6c792070726f6a656374206f7220746f6b656e206f776e65722063616e2060008201527f656d697420746f6b656e206576656e7400000000000000000000000000000000602082015250565b6000613ed3603083613171565b9150613ede82613e77565b604082019050919050565b60006020820190508181036000830152613f0281613ec6565b9050919050565b600081905092915050565b6000613f208385613f09565b9350613f2d8385846138af565b82840190509392505050565b6000613f46828486613f14565b91508190509392505050565b6000613f5e8385613171565b9350613f6b8385846138af565b613f74836131b5565b840190509392505050565b60006020820190508181036000830152613f9a818486613f52565b90509392505050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613fff602983613171565b915061400a82613fa3565b604082019050919050565b6000602082019050818103600083015261402e81613ff2565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614091602a83613171565b915061409c82614035565b604082019050919050565b600060208201905081810360008301526140c081614084565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061410182613221565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614134576141336140c7565b5b600182019050919050565b7f43616c6c6572206973206e6f7420746865206d696e74696e672061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061419b602183613171565b91506141a68261413f565b604082019050919050565b600060208201905081810360008301526141ca8161418e565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614207601983613171565b9150614212826141d1565b602082019050919050565b60006020820190508181036000830152614236816141fa565b9050919050565b7f53656e646572206e6f74206f6e2061747472696275746520757064617465206160008201527f6c6c6f77206c6973742e00000000000000000000000000000000000000000000602082015250565b6000614299602a83613171565b91506142a48261423d565b604082019050919050565b600060208201905081810360008301526142c88161428c565b9050919050565b60006142da82613166565b6142e48185613f09565b93506142f4818560208601613182565b80840191505092915050565b7f2c7b2274726169745f74797065223a2200000000000000000000000000000000600082015250565b6000614336601083613f09565b915061434182614300565b601082019050919050565b7f222c2276616c7565223a00000000000000000000000000000000000000000000600082015250565b6000614382600a83613f09565b915061438d8261434c565b600a82019050919050565b7f7d00000000000000000000000000000000000000000000000000000000000000600082015250565b60006143ce600183613f09565b91506143d982614398565b600182019050919050565b60006143f082886142cf565b91506143fb82614329565b9150614408828688613f14565b915061441382614375565b9150614420828486613f14565b915061442b826143c1565b91508190509695505050505050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614496602f83613171565b91506144a18261443a565b604082019050919050565b600060208201905081810360008301526144c581614489565b9050919050565b7f7b226e616d65223a202200000000000000000000000000000000000000000000600082015250565b6000614502600a83613f09565b915061450d826144cc565b600a82019050919050565b7f222c20226465736372697074696f6e223a202200000000000000000000000000600082015250565b600061454e601383613f09565b915061455982614518565b601382019050919050565b7f222c20226c6963656e7365223a20220000000000000000000000000000000000600082015250565b600061459a600f83613f09565b91506145a582614564565b600f82019050919050565b7f222c2022696d616765223a202200000000000000000000000000000000000000600082015250565b60006145e6600d83613f09565b91506145f1826145b0565b600d82019050919050565b7f222c202265787465726e616c5f75726c223a2022000000000000000000000000600082015250565b6000614632601483613f09565b915061463d826145fc565b601482019050919050565b7f3f636f6c6c656374696f6e49643d000000000000000000000000000000000000600082015250565b600061467e600e83613f09565b915061468982614648565b600e82019050919050565b7f26746f6b656e49643d0000000000000000000000000000000000000000000000600082015250565b60006146ca600983613f09565b91506146d582614694565b600982019050919050565b7f222c202261747472696275746573223a205b7b2274726169745f74797065223a60008201527f22436f6c6c656374696f6e222c202276616c7565223a22000000000000000000602082015250565b600061473c603783613f09565b9150614747826146e0565b603782019050919050565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b6000614788600283613f09565b915061479382614752565b600282019050919050565b7f5d7d000000000000000000000000000000000000000000000000000000000000600082015250565b60006147d4600283613f09565b91506147df8261479e565b600282019050919050565b60006147f5826144f5565b9150614801828e6142cf565b915061480d828d6142cf565b915061481882614541565b9150614824828c6142cf565b915061482f8261458d565b915061483b828b6142cf565b9150614846826145d9565b9150614852828a6142cf565b915061485e82896142cf565b915061486982614625565b915061487582886142cf565b915061488082614671565b915061488c82876142cf565b9150614897826146bd565b91506148a382866142cf565b91506148ae8261472f565b91506148ba82856142cf565b91506148c58261477b565b91506148d182846142cf565b91506148dc826147c7565b91508190509c9b505050505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b6000614927601d83613f09565b9150614932826148f1565b601d82019050919050565b60006149488261491a565b915061495482846142cf565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006149bb602683613171565b91506149c68261495f565b604082019050919050565b600060208201905081810360008301526149ea816149ae565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614a4d602c83613171565b9150614a58826149f1565b604082019050919050565b60006020820190508181036000830152614a7c81614a40565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000614adf602983613171565b9150614aea82614a83565b604082019050919050565b60006020820190508181036000830152614b0e81614ad2565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614b71602483613171565b9150614b7c82614b15565b604082019050919050565b60006020820190508181036000830152614ba081614b64565b9050919050565b6000614bb282613221565b9150614bbd83613221565b925082821015614bd057614bcf6140c7565b5b828203905092915050565b6000614be682613221565b9150614bf183613221565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c2657614c256140c7565b5b828201905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614c67602083613171565b9150614c7282614c31565b602082019050919050565b60006020820190508181036000830152614c9681614c5a565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614cd3601c83613171565b9150614cde82614c9d565b602082019050919050565b60006020820190508181036000830152614d0281614cc6565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614d65603283613171565b9150614d7082614d09565b604082019050919050565b60006020820190508181036000830152614d9481614d58565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614dd582613221565b9150614de083613221565b925082614df057614def614d9b565b5b828204905092915050565b6000614e0682613221565b9150614e1183613221565b925082614e2157614e20614d9b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614e6682613221565b9150614e7183613221565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614eaa57614ea96140c7565b5b828202905092915050565b600081519050919050565b600082825260208201905092915050565b6000614edc82614eb5565b614ee68185614ec0565b9350614ef6818560208601613182565b614eff816131b5565b840191505092915050565b6000608082019050614f1f60008301876132b6565b614f2c60208301866132b6565b614f39604083018561334c565b8181036060830152614f4b8184614ed1565b905095945050505050565b600081519050614f65816130d7565b92915050565b600060208284031215614f8157614f806130a1565b5b6000614f8f84828501614f56565b9150509291505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220a05c578a57d84aa7951c422f2919aff4b91ba9be0dbf2c845dafbe60825d34e564736f6c634300080b0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101e55760003560e01c806370a082311161010f578063b88d4fde116100a2578063dc4f2bbc11610071578063dc4f2bbc1461058a578063e985e9c5146105ba578063f2fde38b146105ea578063f51c8ce514610606576101e5565b8063b88d4fde14610506578063c3ac399e14610522578063c87b56dd1461053e578063d4434ab01461056e576101e5565b80638da5cb5b116100de5780638da5cb5b1461049257806394bf804d146104b057806395d89b41146104cc578063a22cb465146104ea576101e5565b806370a082311461040c578063715018a61461043c57806375c10ffa1461044657806380abf7c414610476576101e5565b80631febbd4b1161018757806342842e0e1161015657806342842e0e1461038657806352a6c8c9146103a25780636352211e146103be5780636b87d24c146103ee576101e5565b80631febbd4b1461030257806323b872dd146103325780632c4d6f7e1461034e5780633a5c35dc1461036a576101e5565b8063095ea7b3116101c3578063095ea7b3146102685780631177f3791461028457806318160ddd146102b45780631ae21c74146102d2576101e5565b806301ffc9a7146101ea57806306fdde031461021a578063081812fc14610238575b600080fd5b61020460048036038101906101ff9190613103565b61063b565b604051610211919061314b565b60405180910390f35b61022261071d565b60405161022f91906131ff565b60405180910390f35b610252600480360381019061024d9190613257565b6107af565b60405161025f91906132c5565b60405180910390f35b610282600480360381019061027d919061330c565b610834565b005b61029e60048036038101906102999190613257565b61094c565b6040516102ab91906131ff565b60405180910390f35b6102bc6109ec565b6040516102c9919061335b565b60405180910390f35b6102ec60048036038101906102e79190613257565b6109f6565b6040516102f9919061335b565b60405180910390f35b61031c60048036038101906103179190613257565b610a0e565b60405161032991906132c5565b60405180910390f35b61034c60048036038101906103479190613376565b610a41565b005b610368600480360381019061036391906133c9565b610aa1565b005b610384600480360381019061037f919061346e565b610ca0565b005b6103a0600480360381019061039b9190613376565b610da5565b005b6103bc60048036038101906103b7919061359f565b610dc5565b005b6103d860048036038101906103d39190613257565b610efd565b6040516103e591906132c5565b60405180910390f35b6103f6610faf565b60405161040391906131ff565b60405180910390f35b61042660048036038101906104219190613634565b610fe8565b604051610433919061335b565b60405180910390f35b6104446110a0565b005b610460600480360381019061045b9190613257565b611128565b60405161046d919061335b565b60405180910390f35b610490600480360381019061048b9190613661565b611140565b005b61049a61130b565b6040516104a791906132c5565b60405180910390f35b6104ca60048036038101906104c591906133c9565b611335565b005b6104d46114b9565b6040516104e191906131ff565b60405180910390f35b61050460048036038101906104ff91906137be565b61154b565b005b610520600480360381019061051b919061392e565b6116cc565b005b61053c6004803603810190610537919061359f565b61172e565b005b61055860048036038101906105539190613257565b6118b1565b60405161056591906131ff565b60405180910390f35b610588600480360381019061058391906139b1565b611db7565b005b6105a4600480360381019061059f9190613257565b611ea8565b6040516105b1919061335b565b60405180910390f35b6105d460048036038101906105cf9190613a32565b611ec0565b6040516105e1919061314b565b60405180910390f35b61060460048036038101906105ff9190613634565b611f54565b005b610620600480360381019061061b9190613257565b61204c565b60405161063296959493929190613a72565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061070657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610716575061071582612330565b5b9050919050565b60606000805461072c90613b25565b80601f016020809104026020016040519081016040528092919081815260200182805461075890613b25565b80156107a55780601f1061077a576101008083540402835291602001916107a5565b820191906000526020600020905b81548152906001019060200180831161078857829003601f168201915b5050505050905090565b60006107ba8261239a565b6107f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f090613bc9565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061083f82610efd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a790613c5b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108cf612406565b73ffffffffffffffffffffffffffffffffffffffff1614806108fe57506108fd816108f8612406565b611ec0565b5b61093d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093490613ced565b60405180910390fd5b610947838361240e565b505050565b600e602052806000526040600020600091509050805461096b90613b25565b80601f016020809104026020016040519081016040528092919081815260200182805461099790613b25565b80156109e45780601f106109b9576101008083540402835291602001916109e4565b820191906000526020600020905b8154815290600101906020018083116109c757829003601f168201915b505050505081565b6000600754905090565b600d6020528060005260406000206000915090505481565b600c6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610a52610a4c612406565b826124c7565b610a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8890613d7f565b60405180910390fd5b610a9c8383836125a5565b505050565b610aa9612406565b73ffffffffffffffffffffffffffffffffffffffff16610ac761130b565b73ffffffffffffffffffffffffffffffffffffffff1614610b1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1490613deb565b60405180910390fd5b6008548210610b61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5890613e57565b60405180910390fd5b6000600c600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555081600c600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b610ca8612406565b73ffffffffffffffffffffffffffffffffffffffff16610cc661130b565b73ffffffffffffffffffffffffffffffffffffffff1614610d1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1390613deb565b60405180910390fd5b6000600960008d815260200190815260200160002090508a8a826001019190610d46929190612f6e565b508888826002019190610d5a929190612f6e565b508686826003019190610d6e929190612f6e565b508484826004019190610d82929190612f6e565b508282826005019190610d96929190612f6e565b50505050505050505050505050565b610dc0838383604051806020016040528060008152506116cc565b505050565b610dcd612406565b73ffffffffffffffffffffffffffffffffffffffff16610deb61130b565b73ffffffffffffffffffffffffffffffffffffffff161480610e475750610e10612406565b73ffffffffffffffffffffffffffffffffffffffff16610e2f86610efd565b73ffffffffffffffffffffffffffffffffffffffff16145b610e86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7d90613ee9565b60405180910390fd5b8383604051610e96929190613f39565b604051809103902085610ea7612406565b73ffffffffffffffffffffffffffffffffffffffff167fad000c5a693465b4555f1044ddd1221ef0bfc49e5621ceb705b952ff97e2caac8585604051610eee929190613f7f565b60405180910390a45050505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9d90614015565b60405180910390fd5b80915050919050565b6040518060400160405280600381526020017f434330000000000000000000000000000000000000000000000000000000000081525081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611059576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611050906140a7565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110a8612406565b73ffffffffffffffffffffffffffffffffffffffff166110c661130b565b73ffffffffffffffffffffffffffffffffffffffff161461111c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111390613deb565b60405180910390fd5b61112660006127f6565b565b600a6020528060005260406000206000915090505481565b611148612406565b73ffffffffffffffffffffffffffffffffffffffff1661116661130b565b73ffffffffffffffffffffffffffffffffffffffff16146111bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b390613deb565b60405180910390fd5b8a600c6000600854815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600f60008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600060096000600854815260200190815260200160002090508a8a826001019190611294929190612f6e565b5088888260020191906112a8929190612f6e565b5086868260030191906112bc929190612f6e565b5084848260040191906112d0929190612f6e565b5082828260050191906112e4929190612f6e565b50600860008154809291906112f8906140f6565b9190505550505050505050505050505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61133d612406565b73ffffffffffffffffffffffffffffffffffffffff16600c600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146113dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d4906141b1565b60405180910390fd5b6008548210611421576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141890613e57565b60405180910390fd5b61142d816007546128bc565b81600a6000600754815260200190815260200160002081905550600d600083815260200190815260200160002054600b6000600754815260200190815260200160002081905550600d60008381526020019081526020016000206000815480929190611498906140f6565b9190505550600760008154809291906114b0906140f6565b91905055505050565b6060600180546114c890613b25565b80601f01602080910402602001604051908101604052809291908181526020018280546114f490613b25565b80156115415780601f1061151657610100808354040283529160200191611541565b820191906000526020600020905b81548152906001019060200180831161152457829003601f168201915b5050505050905090565b611553612406565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b89061421d565b60405180910390fd5b80600560006115ce612406565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661167b612406565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116c0919061314b565b60405180910390a35050565b6116dd6116d7612406565b836124c7565b61171c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171390613d7f565b60405180910390fd5b61172884848484612a7e565b50505050565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166117ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b1906142af565b60405180910390fd5b6000600e600087815260200190815260200160002080546117da90613b25565b80601f016020809104026020016040519081016040528092919081815260200182805461180690613b25565b80156118535780601f1061182857610100808354040283529160200191611853565b820191906000526020600020905b81548152906001019060200180831161183657829003601f168201915b5050505050905080858585856040516020016118739594939291906143e4565b604051602081830303815290604052600e600088815260200190815260200160002090805190602001906118a8929190612ff4565b50505050505050565b60606118bc8261239a565b6118fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f2906144ac565b60405180910390fd5b600060096000600a60008681526020019081526020016000205481526020019081526020016000206040518060c00160405290816000820154815260200160018201805461194890613b25565b80601f016020809104026020016040519081016040528092919081815260200182805461197490613b25565b80156119c15780601f10611996576101008083540402835291602001916119c1565b820191906000526020600020905b8154815290600101906020018083116119a457829003601f168201915b505050505081526020016002820180546119da90613b25565b80601f0160208091040260200160405190810160405280929190818152602001828054611a0690613b25565b8015611a535780601f10611a2857610100808354040283529160200191611a53565b820191906000526020600020905b815481529060010190602001808311611a3657829003601f168201915b50505050508152602001600382018054611a6c90613b25565b80601f0160208091040260200160405190810160405280929190818152602001828054611a9890613b25565b8015611ae55780601f10611aba57610100808354040283529160200191611ae5565b820191906000526020600020905b815481529060010190602001808311611ac857829003601f168201915b50505050508152602001600482018054611afe90613b25565b80601f0160208091040260200160405190810160405280929190818152602001828054611b2a90613b25565b8015611b775780601f10611b4c57610100808354040283529160200191611b77565b820191906000526020600020905b815481529060010190602001808311611b5a57829003601f168201915b50505050508152602001600582018054611b9090613b25565b80601f0160208091040260200160405190810160405280929190818152602001828054611bbc90613b25565b8015611c095780601f10611bde57610100808354040283529160200191611c09565b820191906000526020600020905b815481529060010190602001808311611bec57829003601f168201915b50505050508152505090506000611c1f84612ada565b90506000611c3f600a600087815260200190815260200160002054612ada565b90506000611c5f600b600088815260200190815260200160002054612ada565b90506000600e60008881526020019081526020016000208054611c8190613b25565b80601f0160208091040260200160405190810160405280929190818152602001828054611cad90613b25565b8015611cfa5780601f10611ccf57610100808354040283529160200191611cfa565b820191906000526020600020905b815481529060010190602001808311611cdd57829003601f168201915b505050505090506000611d888660200151848860a001516040518060400160405280600381526020017f43433000000000000000000000000000000000000000000000000000000000008152508a606001518b608001518c604001518b8d8d8c604051602001611d749b9a999897969594939291906147ea565b604051602081830303815290604052612c3b565b905080604051602001611d9b919061493d565b6040516020818303038152906040529650505050505050919050565b611dbf612406565b73ffffffffffffffffffffffffffffffffffffffff16611ddd61130b565b73ffffffffffffffffffffffffffffffffffffffff1614611e33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2a90613deb565b60405180910390fd5b8383604051611e43929190613f39565b6040518091039020611e53612406565b73ffffffffffffffffffffffffffffffffffffffff167f3d366eac52dec4372766dc4b15bba20b935b45d33171465a598eedabb5a5dff88484604051611e9a929190613f7f565b60405180910390a350505050565b600b6020528060005260406000206000915090505481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f5c612406565b73ffffffffffffffffffffffffffffffffffffffff16611f7a61130b565b73ffffffffffffffffffffffffffffffffffffffff1614611fd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc790613deb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612040576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612037906149d1565b60405180910390fd5b612049816127f6565b50565b600960205280600052604060002060009150905080600001549080600101805461207590613b25565b80601f01602080910402602001604051908101604052809291908181526020018280546120a190613b25565b80156120ee5780601f106120c3576101008083540402835291602001916120ee565b820191906000526020600020905b8154815290600101906020018083116120d157829003601f168201915b50505050509080600201805461210390613b25565b80601f016020809104026020016040519081016040528092919081815260200182805461212f90613b25565b801561217c5780601f106121515761010080835404028352916020019161217c565b820191906000526020600020905b81548152906001019060200180831161215f57829003601f168201915b50505050509080600301805461219190613b25565b80601f01602080910402602001604051908101604052809291908181526020018280546121bd90613b25565b801561220a5780601f106121df5761010080835404028352916020019161220a565b820191906000526020600020905b8154815290600101906020018083116121ed57829003601f168201915b50505050509080600401805461221f90613b25565b80601f016020809104026020016040519081016040528092919081815260200182805461224b90613b25565b80156122985780601f1061226d57610100808354040283529160200191612298565b820191906000526020600020905b81548152906001019060200180831161227b57829003601f168201915b5050505050908060050180546122ad90613b25565b80601f01602080910402602001604051908101604052809291908181526020018280546122d990613b25565b80156123265780601f106122fb57610100808354040283529160200191612326565b820191906000526020600020905b81548152906001019060200180831161230957829003601f168201915b5050505050905086565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661248183610efd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006124d28261239a565b612511576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250890614a63565b60405180910390fd5b600061251c83610efd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061258b57508373ffffffffffffffffffffffffffffffffffffffff16612573846107af565b73ffffffffffffffffffffffffffffffffffffffff16145b8061259c575061259b8185611ec0565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166125c582610efd565b73ffffffffffffffffffffffffffffffffffffffff161461261b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261290614af5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561268b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268290614b87565b60405180910390fd5b61269660008261240e565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126e69190614ba7565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461273d9190614bdb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561292c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292390614c7d565b60405180910390fd5b6129358161239a565b15612975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296c90614ce9565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129c59190614bdb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612a898484846125a5565b612a9584848484612dd3565b612ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612acb90614d7b565b60405180910390fd5b50505050565b60606000821415612b22576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c36565b600082905060005b60008214612b54578080612b3d906140f6565b915050600a82612b4d9190614dca565b9150612b2a565b60008167ffffffffffffffff811115612b7057612b6f613803565b5b6040519080825280601f01601f191660200182016040528015612ba25781602001600182028036833780820191505090505b5090505b60008514612c2f57600182612bbb9190614ba7565b9150600a85612bca9190614dfb565b6030612bd69190614bdb565b60f81b818381518110612bec57612beb614e2c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c289190614dca565b9450612ba6565b8093505050505b919050565b60606000825190506000811415612c645760405180602001604052806000815250915050612dce565b60006003600283612c759190614bdb565b612c7f9190614dca565b6004612c8b9190614e5b565b90506000602082612c9c9190614bdb565b67ffffffffffffffff811115612cb557612cb4613803565b5b6040519080825280601f01601f191660200182016040528015612ce75781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001614f99604091399050600181016020830160005b86811015612d8b5760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050612d12565b506003860660018114612da55760028114612db557612dc0565b613d3d60f01b6002830352612dc0565b603d60f81b60018303525b508484525050819450505050505b919050565b6000612df48473ffffffffffffffffffffffffffffffffffffffff16612f5b565b15612f4e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e1d612406565b8786866040518563ffffffff1660e01b8152600401612e3f9493929190614f0a565b6020604051808303816000875af1925050508015612e7b57506040513d601f19601f82011682018060405250810190612e789190614f6b565b60015b612efe573d8060008114612eab576040519150601f19603f3d011682016040523d82523d6000602084013e612eb0565b606091505b50600081511415612ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eed90614d7b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f53565b600190505b949350505050565b600080823b905060008111915050919050565b828054612f7a90613b25565b90600052602060002090601f016020900481019282612f9c5760008555612fe3565b82601f10612fb557803560ff1916838001178555612fe3565b82800160010185558215612fe3579182015b82811115612fe2578235825591602001919060010190612fc7565b5b509050612ff0919061307a565b5090565b82805461300090613b25565b90600052602060002090601f0160209004810192826130225760008555613069565b82601f1061303b57805160ff1916838001178555613069565b82800160010185558215613069579182015b8281111561306857825182559160200191906001019061304d565b5b509050613076919061307a565b5090565b5b8082111561309357600081600090555060010161307b565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6130e0816130ab565b81146130eb57600080fd5b50565b6000813590506130fd816130d7565b92915050565b600060208284031215613119576131186130a1565b5b6000613127848285016130ee565b91505092915050565b60008115159050919050565b61314581613130565b82525050565b6000602082019050613160600083018461313c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156131a0578082015181840152602081019050613185565b838111156131af576000848401525b50505050565b6000601f19601f8301169050919050565b60006131d182613166565b6131db8185613171565b93506131eb818560208601613182565b6131f4816131b5565b840191505092915050565b6000602082019050818103600083015261321981846131c6565b905092915050565b6000819050919050565b61323481613221565b811461323f57600080fd5b50565b6000813590506132518161322b565b92915050565b60006020828403121561326d5761326c6130a1565b5b600061327b84828501613242565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006132af82613284565b9050919050565b6132bf816132a4565b82525050565b60006020820190506132da60008301846132b6565b92915050565b6132e9816132a4565b81146132f457600080fd5b50565b600081359050613306816132e0565b92915050565b60008060408385031215613323576133226130a1565b5b6000613331858286016132f7565b925050602061334285828601613242565b9150509250929050565b61335581613221565b82525050565b6000602082019050613370600083018461334c565b92915050565b60008060006060848603121561338f5761338e6130a1565b5b600061339d868287016132f7565b93505060206133ae868287016132f7565b92505060406133bf86828701613242565b9150509250925092565b600080604083850312156133e0576133df6130a1565b5b60006133ee85828601613242565b92505060206133ff858286016132f7565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f84011261342e5761342d613409565b5b8235905067ffffffffffffffff81111561344b5761344a61340e565b5b60208301915083600182028301111561346757613466613413565b5b9250929050565b600080600080600080600080600080600060c08c8e031215613493576134926130a1565b5b60006134a18e828f01613242565b9b505060208c013567ffffffffffffffff8111156134c2576134c16130a6565b5b6134ce8e828f01613418565b9a509a505060408c013567ffffffffffffffff8111156134f1576134f06130a6565b5b6134fd8e828f01613418565b985098505060608c013567ffffffffffffffff8111156135205761351f6130a6565b5b61352c8e828f01613418565b965096505060808c013567ffffffffffffffff81111561354f5761354e6130a6565b5b61355b8e828f01613418565b945094505060a08c013567ffffffffffffffff81111561357e5761357d6130a6565b5b61358a8e828f01613418565b92509250509295989b509295989b9093969950565b6000806000806000606086880312156135bb576135ba6130a1565b5b60006135c988828901613242565b955050602086013567ffffffffffffffff8111156135ea576135e96130a6565b5b6135f688828901613418565b9450945050604086013567ffffffffffffffff811115613619576136186130a6565b5b61362588828901613418565b92509250509295509295909350565b60006020828403121561364a576136496130a1565b5b6000613658848285016132f7565b91505092915050565b600080600080600080600080600080600060c08c8e031215613686576136856130a1565b5b60006136948e828f016132f7565b9b505060208c013567ffffffffffffffff8111156136b5576136b46130a6565b5b6136c18e828f01613418565b9a509a505060408c013567ffffffffffffffff8111156136e4576136e36130a6565b5b6136f08e828f01613418565b985098505060608c013567ffffffffffffffff811115613713576137126130a6565b5b61371f8e828f01613418565b965096505060808c013567ffffffffffffffff811115613742576137416130a6565b5b61374e8e828f01613418565b945094505060a08c013567ffffffffffffffff811115613771576137706130a6565b5b61377d8e828f01613418565b92509250509295989b509295989b9093969950565b61379b81613130565b81146137a657600080fd5b50565b6000813590506137b881613792565b92915050565b600080604083850312156137d5576137d46130a1565b5b60006137e3858286016132f7565b92505060206137f4858286016137a9565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61383b826131b5565b810181811067ffffffffffffffff8211171561385a57613859613803565b5b80604052505050565b600061386d613097565b90506138798282613832565b919050565b600067ffffffffffffffff82111561389957613898613803565b5b6138a2826131b5565b9050602081019050919050565b82818337600083830152505050565b60006138d16138cc8461387e565b613863565b9050828152602081018484840111156138ed576138ec6137fe565b5b6138f88482856138af565b509392505050565b600082601f83011261391557613914613409565b5b81356139258482602086016138be565b91505092915050565b60008060008060808587031215613948576139476130a1565b5b6000613956878288016132f7565b9450506020613967878288016132f7565b935050604061397887828801613242565b925050606085013567ffffffffffffffff811115613999576139986130a6565b5b6139a587828801613900565b91505092959194509250565b600080600080604085870312156139cb576139ca6130a1565b5b600085013567ffffffffffffffff8111156139e9576139e86130a6565b5b6139f587828801613418565b9450945050602085013567ffffffffffffffff811115613a1857613a176130a6565b5b613a2487828801613418565b925092505092959194509250565b60008060408385031215613a4957613a486130a1565b5b6000613a57858286016132f7565b9250506020613a68858286016132f7565b9150509250929050565b600060c082019050613a87600083018961334c565b8181036020830152613a9981886131c6565b90508181036040830152613aad81876131c6565b90508181036060830152613ac181866131c6565b90508181036080830152613ad581856131c6565b905081810360a0830152613ae981846131c6565b9050979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613b3d57607f821691505b60208210811415613b5157613b50613af6565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613bb3602c83613171565b9150613bbe82613b57565b604082019050919050565b60006020820190508181036000830152613be281613ba6565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613c45602183613171565b9150613c5082613be9565b604082019050919050565b60006020820190508181036000830152613c7481613c38565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613cd7603883613171565b9150613ce282613c7b565b604082019050919050565b60006020820190508181036000830152613d0681613cca565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613d69603183613171565b9150613d7482613d0d565b604082019050919050565b60006020820190508181036000830152613d9881613d5c565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613dd5602083613171565b9150613de082613d9f565b602082019050919050565b60006020820190508181036000830152613e0481613dc8565b9050919050565b7f436f6c6c656374696f6e20494420646f6573206e6f7420657869737400000000600082015250565b6000613e41601c83613171565b9150613e4c82613e0b565b602082019050919050565b60006020820190508181036000830152613e7081613e34565b9050919050565b7f4f6e6c792070726f6a656374206f7220746f6b656e206f776e65722063616e2060008201527f656d697420746f6b656e206576656e7400000000000000000000000000000000602082015250565b6000613ed3603083613171565b9150613ede82613e77565b604082019050919050565b60006020820190508181036000830152613f0281613ec6565b9050919050565b600081905092915050565b6000613f208385613f09565b9350613f2d8385846138af565b82840190509392505050565b6000613f46828486613f14565b91508190509392505050565b6000613f5e8385613171565b9350613f6b8385846138af565b613f74836131b5565b840190509392505050565b60006020820190508181036000830152613f9a818486613f52565b90509392505050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613fff602983613171565b915061400a82613fa3565b604082019050919050565b6000602082019050818103600083015261402e81613ff2565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614091602a83613171565b915061409c82614035565b604082019050919050565b600060208201905081810360008301526140c081614084565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061410182613221565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614134576141336140c7565b5b600182019050919050565b7f43616c6c6572206973206e6f7420746865206d696e74696e672061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061419b602183613171565b91506141a68261413f565b604082019050919050565b600060208201905081810360008301526141ca8161418e565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614207601983613171565b9150614212826141d1565b602082019050919050565b60006020820190508181036000830152614236816141fa565b9050919050565b7f53656e646572206e6f74206f6e2061747472696275746520757064617465206160008201527f6c6c6f77206c6973742e00000000000000000000000000000000000000000000602082015250565b6000614299602a83613171565b91506142a48261423d565b604082019050919050565b600060208201905081810360008301526142c88161428c565b9050919050565b60006142da82613166565b6142e48185613f09565b93506142f4818560208601613182565b80840191505092915050565b7f2c7b2274726169745f74797065223a2200000000000000000000000000000000600082015250565b6000614336601083613f09565b915061434182614300565b601082019050919050565b7f222c2276616c7565223a00000000000000000000000000000000000000000000600082015250565b6000614382600a83613f09565b915061438d8261434c565b600a82019050919050565b7f7d00000000000000000000000000000000000000000000000000000000000000600082015250565b60006143ce600183613f09565b91506143d982614398565b600182019050919050565b60006143f082886142cf565b91506143fb82614329565b9150614408828688613f14565b915061441382614375565b9150614420828486613f14565b915061442b826143c1565b91508190509695505050505050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614496602f83613171565b91506144a18261443a565b604082019050919050565b600060208201905081810360008301526144c581614489565b9050919050565b7f7b226e616d65223a202200000000000000000000000000000000000000000000600082015250565b6000614502600a83613f09565b915061450d826144cc565b600a82019050919050565b7f222c20226465736372697074696f6e223a202200000000000000000000000000600082015250565b600061454e601383613f09565b915061455982614518565b601382019050919050565b7f222c20226c6963656e7365223a20220000000000000000000000000000000000600082015250565b600061459a600f83613f09565b91506145a582614564565b600f82019050919050565b7f222c2022696d616765223a202200000000000000000000000000000000000000600082015250565b60006145e6600d83613f09565b91506145f1826145b0565b600d82019050919050565b7f222c202265787465726e616c5f75726c223a2022000000000000000000000000600082015250565b6000614632601483613f09565b915061463d826145fc565b601482019050919050565b7f3f636f6c6c656374696f6e49643d000000000000000000000000000000000000600082015250565b600061467e600e83613f09565b915061468982614648565b600e82019050919050565b7f26746f6b656e49643d0000000000000000000000000000000000000000000000600082015250565b60006146ca600983613f09565b91506146d582614694565b600982019050919050565b7f222c202261747472696275746573223a205b7b2274726169745f74797065223a60008201527f22436f6c6c656374696f6e222c202276616c7565223a22000000000000000000602082015250565b600061473c603783613f09565b9150614747826146e0565b603782019050919050565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b6000614788600283613f09565b915061479382614752565b600282019050919050565b7f5d7d000000000000000000000000000000000000000000000000000000000000600082015250565b60006147d4600283613f09565b91506147df8261479e565b600282019050919050565b60006147f5826144f5565b9150614801828e6142cf565b915061480d828d6142cf565b915061481882614541565b9150614824828c6142cf565b915061482f8261458d565b915061483b828b6142cf565b9150614846826145d9565b9150614852828a6142cf565b915061485e82896142cf565b915061486982614625565b915061487582886142cf565b915061488082614671565b915061488c82876142cf565b9150614897826146bd565b91506148a382866142cf565b91506148ae8261472f565b91506148ba82856142cf565b91506148c58261477b565b91506148d182846142cf565b91506148dc826147c7565b91508190509c9b505050505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b6000614927601d83613f09565b9150614932826148f1565b601d82019050919050565b60006149488261491a565b915061495482846142cf565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006149bb602683613171565b91506149c68261495f565b604082019050919050565b600060208201905081810360008301526149ea816149ae565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614a4d602c83613171565b9150614a58826149f1565b604082019050919050565b60006020820190508181036000830152614a7c81614a40565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000614adf602983613171565b9150614aea82614a83565b604082019050919050565b60006020820190508181036000830152614b0e81614ad2565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614b71602483613171565b9150614b7c82614b15565b604082019050919050565b60006020820190508181036000830152614ba081614b64565b9050919050565b6000614bb282613221565b9150614bbd83613221565b925082821015614bd057614bcf6140c7565b5b828203905092915050565b6000614be682613221565b9150614bf183613221565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c2657614c256140c7565b5b828201905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614c67602083613171565b9150614c7282614c31565b602082019050919050565b60006020820190508181036000830152614c9681614c5a565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614cd3601c83613171565b9150614cde82614c9d565b602082019050919050565b60006020820190508181036000830152614d0281614cc6565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614d65603283613171565b9150614d7082614d09565b604082019050919050565b60006020820190508181036000830152614d9481614d58565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614dd582613221565b9150614de083613221565b925082614df057614def614d9b565b5b828204905092915050565b6000614e0682613221565b9150614e1183613221565b925082614e2157614e20614d9b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614e6682613221565b9150614e7183613221565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614eaa57614ea96140c7565b5b828202905092915050565b600081519050919050565b600082825260208201905092915050565b6000614edc82614eb5565b614ee68185614ec0565b9350614ef6818560208601613182565b614eff816131b5565b840191505092915050565b6000608082019050614f1f60008301876132b6565b614f2c60208301866132b6565b614f39604083018561334c565b8181036060830152614f4b8184614ed1565b905095945050505050565b600081519050614f65816130d7565b92915050565b600060208284031215614f8157614f806130a1565b5b6000614f8f84828501614f56565b9150509291505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220a05c578a57d84aa7951c422f2919aff4b91ba9be0dbf2c845dafbe60825d34e564736f6c634300080b0033

Deployed Bytecode Sourcemap

1162:5359:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23387:300:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24305:98;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25816:217;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25354:401;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1812:53:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2225:94;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1757:51;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1698:55;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26680:330:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3877:383:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5513:513;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27076:179:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6195:324:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24008:235:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1304:38:1;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23746:205:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21586:92;;;:::i;:::-;;1575:56:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2323:642;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20954:85:0;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2969:478:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24467:102:0;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26100:290;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27321:320;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3451:421:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4265:1243;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6030:161;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1635:59;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26456:162:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21827:189;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1513:58:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;23387:300:0;23489:4;23539:25;23524:40;;;:11;:40;;;;:104;;;;23595:33;23580:48;;;:11;:48;;;;23524:104;:156;;;;23644:36;23668:11;23644:23;:36::i;:::-;23524:156;23505:175;;23387:300;;;:::o;24305:98::-;24359:13;24391:5;24384:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24305:98;:::o;25816:217::-;25892:7;25919:16;25927:7;25919;:16::i;:::-;25911:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26002:15;:24;26018:7;26002:24;;;;;;;;;;;;;;;;;;;;;25995:31;;25816:217;;;:::o;25354:401::-;25434:13;25450:23;25465:7;25450:14;:23::i;:::-;25434:39;;25497:5;25491:11;;:2;:11;;;;25483:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;25588:5;25572:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;25597:37;25614:5;25621:12;:10;:12::i;:::-;25597:16;:37::i;:::-;25572:62;25551:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;25727:21;25736:2;25740:7;25727:8;:21::i;:::-;25424:331;25354:401;;:::o;1812:53:1:-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2225:94::-;2277:7;2299:15;;2292:22;;2225:94;:::o;1757:51::-;;;;;;;;;;;;;;;;;:::o;1698:55::-;;;;;;;;;;;;;;;;;;;;;;:::o;26680:330:0:-;26869:41;26888:12;:10;:12::i;:::-;26902:7;26869:18;:41::i;:::-;26861:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26975:28;26985:4;26991:2;26995:7;26975:9;:28::i;:::-;26680:330;;;:::o;3877:383:1:-;21177:12:0;:10;:12::i;:::-;21166:23;;:7;:5;:7::i;:::-;:23;;;21158:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3988:20:1::1;;3973:12;:35;3965:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;4048:22;4073:20;:34;4094:12;4073:34;;;;;;;;;;;;;;;;;;;;;4048:59;;4156:5;4113:24;:40;4138:14;4113:40;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;4202:4;4167:24;:32;4192:6;4167:32;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;4249:6;4212:20;:34;4233:12;4212:34;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;3959:301;3877:383:::0;;:::o;5513:513::-;21177:12:0;:10;:12::i;:::-;21166:23;;:7;:5;:7::i;:::-;:23;;;21158:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5761:25:1::1;5789:22;:36;5812:12;5789:36;;;;;;;;;;;5761:64;;5854:11;;5832:8;:19;;:33;;;;;;;:::i;:::-;;5894:12;;5871:8;:20;;:35;;;;;;;:::i;:::-;;5930:7;;5912:8;:15;;:25;;;;;;;:::i;:::-;;5967:13;;5943:8;:21;;:37;;;;;;;:::i;:::-;;6009:12;;5986:8;:20;;:35;;;;;;;:::i;:::-;;5755:271;5513:513:::0;;;;;;;;;;;:::o;27076:179:0:-;27209:39;27226:4;27232:2;27236:7;27209:39;;;;;;;;;;;;:16;:39::i;:::-;27076:179;;;:::o;6195:324:1:-;6329:12;:10;:12::i;:::-;6318:23;;:7;:5;:7::i;:::-;:23;;;:66;;;;6372:12;:10;:12::i;:::-;6345:39;;:23;6360:7;6345:14;:23::i;:::-;:39;;;6318:66;6303:145;;;;;;;;;;;;:::i;:::-;;;;;;;;;6493:10;;6459:55;;;;;;;:::i;:::-;;;;;;;;6484:7;6470:12;:10;:12::i;:::-;6459:55;;;6505:8;;6459:55;;;;;;;:::i;:::-;;;;;;;;6195:324;;;;;:::o;24008:235:0:-;24080:7;24099:13;24115:7;:16;24123:7;24115:16;;;;;;;;;;;;;;;;;;;;;24099:32;;24166:1;24149:19;;:5;:19;;;;24141:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24231:5;24224:12;;;24008:235;;;:::o;1304:38:1:-;;;;;;;;;;;;;;;;;;;:::o;23746:205:0:-;23818:7;23862:1;23845:19;;:5;:19;;;;23837:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;23928:9;:16;23938:5;23928:16;;;;;;;;;;;;;;;;23921:23;;23746:205;;;:::o;21586:92::-;21177:12;:10;:12::i;:::-;21166:23;;:7;:5;:7::i;:::-;:23;;;21158:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21650:21:::1;21668:1;21650:9;:21::i;:::-;21586:92::o:0;1575:56:1:-;;;;;;;;;;;;;;;;;:::o;2323:642::-;21177:12:0;:10;:12::i;:::-;21166:23;;:7;:5;:7::i;:::-;:23;;;21158:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2606:6:1::1;2561:20;:42;2582:20;;2561:42;;;;;;;;;;;;:51;;;;;;;;;;;;;;;;;;2653:4;2618:24;:32;2643:6;2618:32;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;2664:25;2692:22;:44;2715:20;;2692:44;;;;;;;;;;;2664:72;;2764:11;;2742:8;:19;;:33;;;;;;;:::i;:::-;;2804:12;;2781:8;:20;;:35;;;;;;;:::i;:::-;;2840:7;;2822:8;:15;;:25;;;;;;;:::i;:::-;;2877:13;;2853:8;:21;;:37;;;;;;;:::i;:::-;;2919:12;;2896:8;:20;;:35;;;;;;;:::i;:::-;;2938:20;;:22;;;;;;;;;:::i;:::-;;;;;;2555:410;2323:642:::0;;;;;;;;;;;:::o;20954:85:0:-;21000:7;21026:6;;;;;;;;;;;21019:13;;20954:85;:::o;2969:478:1:-;3076:12;:10;:12::i;:::-;3038:50;;:20;:34;3059:12;3038:34;;;;;;;;;;;;;;;;;;;;;:50;;;3030:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;3155:20;;3140:12;:35;3132:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;3215:26;3221:2;3225:15;;3215:5;:26::i;:::-;3288:12;3247:21;:38;3269:15;;3247:38;;;;;;;;;;;:53;;;;3351:16;:30;3368:12;3351:30;;;;;;;;;;;;3307:24;:41;3332:15;;3307:41;;;;;;;;;;;:74;;;;3387:16;:30;3404:12;3387:30;;;;;;;;;;;;:32;;;;;;;;;:::i;:::-;;;;;;3425:15;;:17;;;;;;;;;:::i;:::-;;;;;;2969:478;;:::o;24467:102:0:-;24523:13;24555:7;24548:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24467:102;:::o;26100:290::-;26214:12;:10;:12::i;:::-;26202:24;;:8;:24;;;;26194:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;26312:8;26267:18;:32;26286:12;:10;:12::i;:::-;26267:32;;;;;;;;;;;;;;;:42;26300:8;26267:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;26364:8;26335:48;;26350:12;:10;:12::i;:::-;26335:48;;;26374:8;26335:48;;;;;;:::i;:::-;;;;;;;;26100:290;;:::o;27321:320::-;27490:41;27509:12;:10;:12::i;:::-;27523:7;27490:18;:41::i;:::-;27482:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27595:39;27609:4;27615:2;27619:7;27628:5;27595:13;:39::i;:::-;27321:320;;;;:::o;3451:421:1:-;3573:24;:36;3598:10;3573:36;;;;;;;;;;;;;;;;;;;;;;;;;3565:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;3663:27;3693:19;:28;3713:7;3693:28;;;;;;;;;;;3663:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3790:13;3825:7;;3847:9;;3766:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3728:19;:28;3748:7;3728:28;;;;;;;;;;;:139;;;;;;;;;;;;:::i;:::-;;3559:313;3451:421;;;;;:::o;4265:1243::-;4338:13;4367:16;4375:7;4367;:16::i;:::-;4359:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;4442:24;4469:22;:54;4492:21;:30;4514:7;4492:30;;;;;;;;;;;;4469:54;;;;;;;;;;;4442:81;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4529:27;4559:18;:7;:16;:18::i;:::-;4529:48;;4583:32;4618:41;:21;:30;4640:7;4618:30;;;;;;;;;;;;:39;:41::i;:::-;4583:76;;4665:35;4703:44;:24;:33;4728:7;4703:33;;;;;;;;;;;;:42;:44::i;:::-;4665:82;;4753:29;4785:19;:28;4805:7;4785:28;;;;;;;;;;;4753:60;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4820:18;4841:585;4939:8;:19;;;4960:21;5018:8;:20;;;5071:7;;;;;;;;;;;;;;;;;5109:8;:15;;;5126:8;:21;;;5185:8;:20;;;5225:18;5258:13;5344:18;5369:15;4895:507;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4841:13;:585::i;:::-;4820:606;;5496:4;5446:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;5432:70;;;;;;;;4265:1243;;;:::o;6030:161::-;21177:12:0;:10;:12::i;:::-;21166:23;;:7;:5;:7::i;:::-;:23;;;21158:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6165:10:1::1;;6138:48;;;;;;;:::i;:::-;;;;;;;;6151:12;:10;:12::i;:::-;6138:48;;;6177:8;;6138:48;;;;;;;:::i;:::-;;;;;;;;6030:161:::0;;;;:::o;1635:59::-;;;;;;;;;;;;;;;;;:::o;26456:162:0:-;26553:4;26576:18;:25;26595:5;26576:25;;;;;;;;;;;;;;;:35;26602:8;26576:35;;;;;;;;;;;;;;;;;;;;;;;;;26569:42;;26456:162;;;;:::o;21827:189::-;21177:12;:10;:12::i;:::-;21166:23;;:7;:5;:7::i;:::-;:23;;;21158:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21935:1:::1;21915:22;;:8;:22;;;;21907:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21990:19;22000:8;21990:9;:19::i;:::-;21827:189:::0;:::o;1513:58:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;19910:155:0:-;19995:4;20033:25;20018:40;;;:11;:40;;;;20011:47;;19910:155;;;:::o;29113:125::-;29178:4;29229:1;29201:30;;:7;:16;29209:7;29201:16;;;;;;;;;;;;;;;;;;;;;:30;;;;29194:37;;29113:125;;;:::o;15130:96::-;15183:7;15209:10;15202:17;;15130:96;:::o;33015:171::-;33116:2;33089:15;:24;33105:7;33089:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;33171:7;33167:2;33133:46;;33142:23;33157:7;33142:14;:23::i;:::-;33133:46;;;;;;;;;;;;33015:171;;:::o;29396:344::-;29489:4;29513:16;29521:7;29513;:16::i;:::-;29505:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29588:13;29604:23;29619:7;29604:14;:23::i;:::-;29588:39;;29656:5;29645:16;;:7;:16;;;:51;;;;29689:7;29665:31;;:20;29677:7;29665:11;:20::i;:::-;:31;;;29645:51;:87;;;;29700:32;29717:5;29724:7;29700:16;:32::i;:::-;29645:87;29637:96;;;29396:344;;;;:::o;32341:563::-;32495:4;32468:31;;:23;32483:7;32468:14;:23::i;:::-;:31;;;32460:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;32577:1;32563:16;;:2;:16;;;;32555:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;32735:29;32752:1;32756:7;32735:8;:29::i;:::-;32794:1;32775:9;:15;32785:4;32775:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32822:1;32805:9;:13;32815:2;32805:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32852:2;32833:7;:16;32841:7;32833:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32889:7;32885:2;32870:27;;32879:4;32870:27;;;;;;;;;;;;32341:563;;;:::o;22022:169::-;22077:16;22096:6;;;;;;;;;;;22077:25;;22121:8;22112:6;;:17;;;;;;;;;;;;;;;;;;22175:8;22144:40;;22165:8;22144:40;;;;;;;;;;;;22067:124;22022:169;:::o;31074:375::-;31167:1;31153:16;;:2;:16;;;;31145:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;31225:16;31233:7;31225;:16::i;:::-;31224:17;31216:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;31361:1;31344:9;:13;31354:2;31344:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31391:2;31372:7;:16;31380:7;31372:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31434:7;31430:2;31409:33;;31426:1;31409:33;;;;;;;;;;;;31074:375;;:::o;28503:307::-;28654:28;28664:4;28670:2;28674:7;28654:9;:28::i;:::-;28700:48;28723:4;28729:2;28733:7;28742:5;28700:22;:48::i;:::-;28692:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;28503:307;;;;:::o;15553:703::-;15609:13;15835:1;15826:5;:10;15822:51;;;15852:10;;;;;;;;;;;;;;;;;;;;;15822:51;15882:12;15897:5;15882:20;;15912:14;15936:75;15951:1;15943:4;:9;15936:75;;15968:8;;;;;:::i;:::-;;;;15998:2;15990:10;;;;;:::i;:::-;;;15936:75;;;16020:19;16052:6;16042:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16020:39;;16069:150;16085:1;16076:5;:10;16069:150;;16112:1;16102:11;;;;;:::i;:::-;;;16178:2;16170:5;:10;;;;:::i;:::-;16157:2;:24;;;;:::i;:::-;16144:39;;16127:6;16134;16127:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;16206:2;16197:11;;;;;:::i;:::-;;;16069:150;;;16242:6;16228:21;;;;;15553:703;;;;:::o;17669:1557::-;17727:13;17752:11;17766:4;:11;17752:25;;17798:1;17791:3;:8;17787:23;;;17801:9;;;;;;;;;;;;;;;;;17787:23;17859:18;17897:1;17892;17886:3;:7;;;;:::i;:::-;17885:13;;;;:::i;:::-;17880:1;:19;;;;:::i;:::-;17859:40;;17954:19;17999:2;17986:10;:15;;;;:::i;:::-;17976:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17954:48;;18013:18;18034:5;;;;;;;;;;;;;;;;;18013:26;;18100:1;18093:5;18089:13;18144:2;18136:6;18132:15;18192:1;18161:757;18214:3;18211:1;18208:10;18161:757;;;18266:1;18263;18259:9;18254:14;;18323:8;18318:1;18312:4;18308:12;18302:19;18298:34;18401:4;18393:5;18389:2;18385:14;18381:25;18371:8;18367:40;18361:47;18439:3;18436:1;18432:11;18425:18;;18529:4;18520;18512:5;18508:2;18504:14;18500:25;18490:8;18486:40;18480:47;18476:58;18471:3;18467:68;18460:75;;18566:3;18563:1;18559:11;18552:18;;18655:4;18646;18638:5;18635:1;18631:13;18627:24;18617:8;18613:39;18607:46;18603:57;18598:3;18594:67;18587:74;;18692:3;18689:1;18685:11;18678:18;;18773:4;18764;18757:5;18753:16;18743:8;18739:31;18733:38;18729:49;18724:3;18720:59;18713:66;;18812:3;18807;18803:13;18796:20;;18852:3;18841:9;18834:22;18902:1;18891:9;18887:17;18874:30;;18236:682;;18161:757;;;18165:42;18948:1;18943:3;18939:11;18968:1;18963:82;;;;19063:1;19058:80;;;;18932:206;;18963:82;19023:6;19018:3;19014:16;19010:1;18999:9;18995:17;18988:43;18963:82;;19058:80;19118:4;19113:3;19109:14;19105:1;19094:9;19090:17;19083:41;18932:206;;19167:10;19159:6;19152:26;18059:1129;;19212:6;19198:21;;;;;;17669:1557;;;;:::o;33739:782::-;33889:4;33909:15;:2;:13;;;:15::i;:::-;33905:610;;;33960:2;33944:36;;;33981:12;:10;:12::i;:::-;33995:4;34001:7;34010:5;33944:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33940:523;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34204:1;34187:6;:13;:18;34183:266;;;34229:60;;;;;;;;;;:::i;:::-;;;;;;;;34183:266;34401:6;34395:13;34386:6;34382:2;34378:15;34371:38;33940:523;34076:45;;;34066:55;;;:6;:55;;;;34059:62;;;;;33905:610;34500:4;34493:11;;33739:782;;;;;;;:::o;7462:377::-;7522:4;7725:12;7790:7;7778:20;7770:28;;7831:1;7824:4;:8;7817:15;;;7462:377;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:2:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:474::-;5983:6;5991;6040:2;6028:9;6019:7;6015:23;6011:32;6008:119;;;6046:79;;:::i;:::-;6008:119;6166:1;6191:53;6236:7;6227:6;6216:9;6212:22;6191:53;:::i;:::-;6181:63;;6137:117;6293:2;6319:53;6364:7;6355:6;6344:9;6340:22;6319:53;:::i;:::-;6309:63;;6264:118;5915:474;;;;;:::o;6395:117::-;6504:1;6501;6494:12;6518:117;6627:1;6624;6617:12;6641:117;6750:1;6747;6740:12;6778:553;6836:8;6846:6;6896:3;6889:4;6881:6;6877:17;6873:27;6863:122;;6904:79;;:::i;:::-;6863:122;7017:6;7004:20;6994:30;;7047:18;7039:6;7036:30;7033:117;;;7069:79;;:::i;:::-;7033:117;7183:4;7175:6;7171:17;7159:29;;7237:3;7229:4;7221:6;7217:17;7207:8;7203:32;7200:41;7197:128;;;7244:79;;:::i;:::-;7197:128;6778:553;;;;;:::o;7337:2059::-;7501:6;7509;7517;7525;7533;7541;7549;7557;7565;7573;7581:7;7631:3;7619:9;7610:7;7606:23;7602:33;7599:120;;;7638:79;;:::i;:::-;7599:120;7758:1;7783:53;7828:7;7819:6;7808:9;7804:22;7783:53;:::i;:::-;7773:63;;7729:117;7913:2;7902:9;7898:18;7885:32;7944:18;7936:6;7933:30;7930:117;;;7966:79;;:::i;:::-;7930:117;8079:65;8136:7;8127:6;8116:9;8112:22;8079:65;:::i;:::-;8061:83;;;;7856:298;8221:2;8210:9;8206:18;8193:32;8252:18;8244:6;8241:30;8238:117;;;8274:79;;:::i;:::-;8238:117;8387:65;8444:7;8435:6;8424:9;8420:22;8387:65;:::i;:::-;8369:83;;;;8164:298;8529:2;8518:9;8514:18;8501:32;8560:18;8552:6;8549:30;8546:117;;;8582:79;;:::i;:::-;8546:117;8695:65;8752:7;8743:6;8732:9;8728:22;8695:65;:::i;:::-;8677:83;;;;8472:298;8837:3;8826:9;8822:19;8809:33;8869:18;8861:6;8858:30;8855:117;;;8891:79;;:::i;:::-;8855:117;9004:65;9061:7;9052:6;9041:9;9037:22;9004:65;:::i;:::-;8986:83;;;;8780:299;9146:3;9135:9;9131:19;9118:33;9178:18;9170:6;9167:30;9164:117;;;9200:79;;:::i;:::-;9164:117;9314:65;9371:7;9362:6;9351:9;9347:22;9314:65;:::i;:::-;9295:84;;;;9089:300;7337:2059;;;;;;;;;;;;;;:::o;9402:1019::-;9503:6;9511;9519;9527;9535;9584:2;9572:9;9563:7;9559:23;9555:32;9552:119;;;9590:79;;:::i;:::-;9552:119;9710:1;9735:53;9780:7;9771:6;9760:9;9756:22;9735:53;:::i;:::-;9725:63;;9681:117;9865:2;9854:9;9850:18;9837:32;9896:18;9888:6;9885:30;9882:117;;;9918:79;;:::i;:::-;9882:117;10031:65;10088:7;10079:6;10068:9;10064:22;10031:65;:::i;:::-;10013:83;;;;9808:298;10173:2;10162:9;10158:18;10145:32;10204:18;10196:6;10193:30;10190:117;;;10226:79;;:::i;:::-;10190:117;10339:65;10396:7;10387:6;10376:9;10372:22;10339:65;:::i;:::-;10321:83;;;;10116:298;9402:1019;;;;;;;;:::o;10427:329::-;10486:6;10535:2;10523:9;10514:7;10510:23;10506:32;10503:119;;;10541:79;;:::i;:::-;10503:119;10661:1;10686:53;10731:7;10722:6;10711:9;10707:22;10686:53;:::i;:::-;10676:63;;10632:117;10427:329;;;;:::o;10762:2059::-;10926:6;10934;10942;10950;10958;10966;10974;10982;10990;10998;11006:7;11056:3;11044:9;11035:7;11031:23;11027:33;11024:120;;;11063:79;;:::i;:::-;11024:120;11183:1;11208:53;11253:7;11244:6;11233:9;11229:22;11208:53;:::i;:::-;11198:63;;11154:117;11338:2;11327:9;11323:18;11310:32;11369:18;11361:6;11358:30;11355:117;;;11391:79;;:::i;:::-;11355:117;11504:65;11561:7;11552:6;11541:9;11537:22;11504:65;:::i;:::-;11486:83;;;;11281:298;11646:2;11635:9;11631:18;11618:32;11677:18;11669:6;11666:30;11663:117;;;11699:79;;:::i;:::-;11663:117;11812:65;11869:7;11860:6;11849:9;11845:22;11812:65;:::i;:::-;11794:83;;;;11589:298;11954:2;11943:9;11939:18;11926:32;11985:18;11977:6;11974:30;11971:117;;;12007:79;;:::i;:::-;11971:117;12120:65;12177:7;12168:6;12157:9;12153:22;12120:65;:::i;:::-;12102:83;;;;11897:298;12262:3;12251:9;12247:19;12234:33;12294:18;12286:6;12283:30;12280:117;;;12316:79;;:::i;:::-;12280:117;12429:65;12486:7;12477:6;12466:9;12462:22;12429:65;:::i;:::-;12411:83;;;;12205:299;12571:3;12560:9;12556:19;12543:33;12603:18;12595:6;12592:30;12589:117;;;12625:79;;:::i;:::-;12589:117;12739:65;12796:7;12787:6;12776:9;12772:22;12739:65;:::i;:::-;12720:84;;;;12514:300;10762:2059;;;;;;;;;;;;;;:::o;12827:116::-;12897:21;12912:5;12897:21;:::i;:::-;12890:5;12887:32;12877:60;;12933:1;12930;12923:12;12877:60;12827:116;:::o;12949:133::-;12992:5;13030:6;13017:20;13008:29;;13046:30;13070:5;13046:30;:::i;:::-;12949:133;;;;:::o;13088:468::-;13153:6;13161;13210:2;13198:9;13189:7;13185:23;13181:32;13178:119;;;13216:79;;:::i;:::-;13178:119;13336:1;13361:53;13406:7;13397:6;13386:9;13382:22;13361:53;:::i;:::-;13351:63;;13307:117;13463:2;13489:50;13531:7;13522:6;13511:9;13507:22;13489:50;:::i;:::-;13479:60;;13434:115;13088:468;;;;;:::o;13562:117::-;13671:1;13668;13661:12;13685:180;13733:77;13730:1;13723:88;13830:4;13827:1;13820:15;13854:4;13851:1;13844:15;13871:281;13954:27;13976:4;13954:27;:::i;:::-;13946:6;13942:40;14084:6;14072:10;14069:22;14048:18;14036:10;14033:34;14030:62;14027:88;;;14095:18;;:::i;:::-;14027:88;14135:10;14131:2;14124:22;13914:238;13871:281;;:::o;14158:129::-;14192:6;14219:20;;:::i;:::-;14209:30;;14248:33;14276:4;14268:6;14248:33;:::i;:::-;14158:129;;;:::o;14293:307::-;14354:4;14444:18;14436:6;14433:30;14430:56;;;14466:18;;:::i;:::-;14430:56;14504:29;14526:6;14504:29;:::i;:::-;14496:37;;14588:4;14582;14578:15;14570:23;;14293:307;;;:::o;14606:154::-;14690:6;14685:3;14680;14667:30;14752:1;14743:6;14738:3;14734:16;14727:27;14606:154;;;:::o;14766:410::-;14843:5;14868:65;14884:48;14925:6;14884:48;:::i;:::-;14868:65;:::i;:::-;14859:74;;14956:6;14949:5;14942:21;14994:4;14987:5;14983:16;15032:3;15023:6;15018:3;15014:16;15011:25;15008:112;;;15039:79;;:::i;:::-;15008:112;15129:41;15163:6;15158:3;15153;15129:41;:::i;:::-;14849:327;14766:410;;;;;:::o;15195:338::-;15250:5;15299:3;15292:4;15284:6;15280:17;15276:27;15266:122;;15307:79;;:::i;:::-;15266:122;15424:6;15411:20;15449:78;15523:3;15515:6;15508:4;15500:6;15496:17;15449:78;:::i;:::-;15440:87;;15256:277;15195:338;;;;:::o;15539:943::-;15634:6;15642;15650;15658;15707:3;15695:9;15686:7;15682:23;15678:33;15675:120;;;15714:79;;:::i;:::-;15675:120;15834:1;15859:53;15904:7;15895:6;15884:9;15880:22;15859:53;:::i;:::-;15849:63;;15805:117;15961:2;15987:53;16032:7;16023:6;16012:9;16008:22;15987:53;:::i;:::-;15977:63;;15932:118;16089:2;16115:53;16160:7;16151:6;16140:9;16136:22;16115:53;:::i;:::-;16105:63;;16060:118;16245:2;16234:9;16230:18;16217:32;16276:18;16268:6;16265:30;16262:117;;;16298:79;;:::i;:::-;16262:117;16403:62;16457:7;16448:6;16437:9;16433:22;16403:62;:::i;:::-;16393:72;;16188:287;15539:943;;;;;;;:::o;16488:874::-;16580:6;16588;16596;16604;16653:2;16641:9;16632:7;16628:23;16624:32;16621:119;;;16659:79;;:::i;:::-;16621:119;16807:1;16796:9;16792:17;16779:31;16837:18;16829:6;16826:30;16823:117;;;16859:79;;:::i;:::-;16823:117;16972:65;17029:7;17020:6;17009:9;17005:22;16972:65;:::i;:::-;16954:83;;;;16750:297;17114:2;17103:9;17099:18;17086:32;17145:18;17137:6;17134:30;17131:117;;;17167:79;;:::i;:::-;17131:117;17280:65;17337:7;17328:6;17317:9;17313:22;17280:65;:::i;:::-;17262:83;;;;17057:298;16488:874;;;;;;;:::o;17368:474::-;17436:6;17444;17493:2;17481:9;17472:7;17468:23;17464:32;17461:119;;;17499:79;;:::i;:::-;17461:119;17619:1;17644:53;17689:7;17680:6;17669:9;17665:22;17644:53;:::i;:::-;17634:63;;17590:117;17746:2;17772:53;17817:7;17808:6;17797:9;17793:22;17772:53;:::i;:::-;17762:63;;17717:118;17368:474;;;;;:::o;17848:1230::-;18181:4;18219:3;18208:9;18204:19;18196:27;;18233:71;18301:1;18290:9;18286:17;18277:6;18233:71;:::i;:::-;18351:9;18345:4;18341:20;18336:2;18325:9;18321:18;18314:48;18379:78;18452:4;18443:6;18379:78;:::i;:::-;18371:86;;18504:9;18498:4;18494:20;18489:2;18478:9;18474:18;18467:48;18532:78;18605:4;18596:6;18532:78;:::i;:::-;18524:86;;18657:9;18651:4;18647:20;18642:2;18631:9;18627:18;18620:48;18685:78;18758:4;18749:6;18685:78;:::i;:::-;18677:86;;18811:9;18805:4;18801:20;18795:3;18784:9;18780:19;18773:49;18839:78;18912:4;18903:6;18839:78;:::i;:::-;18831:86;;18965:9;18959:4;18955:20;18949:3;18938:9;18934:19;18927:49;18993:78;19066:4;19057:6;18993:78;:::i;:::-;18985:86;;17848:1230;;;;;;;;;:::o;19084:180::-;19132:77;19129:1;19122:88;19229:4;19226:1;19219:15;19253:4;19250:1;19243:15;19270:320;19314:6;19351:1;19345:4;19341:12;19331:22;;19398:1;19392:4;19388:12;19419:18;19409:81;;19475:4;19467:6;19463:17;19453:27;;19409:81;19537:2;19529:6;19526:14;19506:18;19503:38;19500:84;;;19556:18;;:::i;:::-;19500:84;19321:269;19270:320;;;:::o;19596:231::-;19736:34;19732:1;19724:6;19720:14;19713:58;19805:14;19800:2;19792:6;19788:15;19781:39;19596:231;:::o;19833:366::-;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:419::-;20371:4;20409:2;20398:9;20394:18;20386:26;;20458:9;20452:4;20448:20;20444:1;20433:9;20429:17;20422:47;20486:131;20612:4;20486:131;:::i;:::-;20478:139;;20205:419;;;:::o;20630:220::-;20770:34;20766:1;20758:6;20754:14;20747:58;20839:3;20834:2;20826:6;20822:15;20815:28;20630:220;:::o;20856:366::-;20998:3;21019:67;21083:2;21078:3;21019:67;:::i;:::-;21012:74;;21095:93;21184:3;21095:93;:::i;:::-;21213:2;21208:3;21204:12;21197:19;;20856:366;;;:::o;21228:419::-;21394:4;21432:2;21421:9;21417:18;21409:26;;21481:9;21475:4;21471:20;21467:1;21456:9;21452:17;21445:47;21509:131;21635:4;21509:131;:::i;:::-;21501:139;;21228:419;;;:::o;21653:243::-;21793:34;21789:1;21781:6;21777:14;21770:58;21862:26;21857:2;21849:6;21845:15;21838:51;21653:243;:::o;21902:366::-;22044:3;22065:67;22129:2;22124:3;22065:67;:::i;:::-;22058:74;;22141:93;22230:3;22141:93;:::i;:::-;22259:2;22254:3;22250:12;22243:19;;21902:366;;;:::o;22274:419::-;22440:4;22478:2;22467:9;22463:18;22455:26;;22527:9;22521:4;22517:20;22513:1;22502:9;22498:17;22491:47;22555:131;22681:4;22555:131;:::i;:::-;22547:139;;22274:419;;;:::o;22699:236::-;22839:34;22835:1;22827:6;22823:14;22816:58;22908:19;22903:2;22895:6;22891:15;22884:44;22699:236;:::o;22941:366::-;23083:3;23104:67;23168:2;23163:3;23104:67;:::i;:::-;23097:74;;23180:93;23269:3;23180:93;:::i;:::-;23298:2;23293:3;23289:12;23282:19;;22941:366;;;:::o;23313:419::-;23479:4;23517:2;23506:9;23502:18;23494:26;;23566:9;23560:4;23556:20;23552:1;23541:9;23537:17;23530:47;23594:131;23720:4;23594:131;:::i;:::-;23586:139;;23313:419;;;:::o;23738:182::-;23878:34;23874:1;23866:6;23862:14;23855:58;23738:182;:::o;23926:366::-;24068:3;24089:67;24153:2;24148:3;24089:67;:::i;:::-;24082:74;;24165:93;24254:3;24165:93;:::i;:::-;24283:2;24278:3;24274:12;24267:19;;23926:366;;;:::o;24298:419::-;24464:4;24502:2;24491:9;24487:18;24479:26;;24551:9;24545:4;24541:20;24537:1;24526:9;24522:17;24515:47;24579:131;24705:4;24579:131;:::i;:::-;24571:139;;24298:419;;;:::o;24723:178::-;24863:30;24859:1;24851:6;24847:14;24840:54;24723:178;:::o;24907:366::-;25049:3;25070:67;25134:2;25129:3;25070:67;:::i;:::-;25063:74;;25146:93;25235:3;25146:93;:::i;:::-;25264:2;25259:3;25255:12;25248:19;;24907:366;;;:::o;25279:419::-;25445:4;25483:2;25472:9;25468:18;25460:26;;25532:9;25526:4;25522:20;25518:1;25507:9;25503:17;25496:47;25560:131;25686:4;25560:131;:::i;:::-;25552:139;;25279:419;;;:::o;25704:235::-;25844:34;25840:1;25832:6;25828:14;25821:58;25913:18;25908:2;25900:6;25896:15;25889:43;25704:235;:::o;25945:366::-;26087:3;26108:67;26172:2;26167:3;26108:67;:::i;:::-;26101:74;;26184:93;26273:3;26184:93;:::i;:::-;26302:2;26297:3;26293:12;26286:19;;25945:366;;;:::o;26317:419::-;26483:4;26521:2;26510:9;26506:18;26498:26;;26570:9;26564:4;26560:20;26556:1;26545:9;26541:17;26534:47;26598:131;26724:4;26598:131;:::i;:::-;26590:139;;26317:419;;;:::o;26742:148::-;26844:11;26881:3;26866:18;;26742:148;;;;:::o;26920:317::-;27036:3;27057:89;27139:6;27134:3;27057:89;:::i;:::-;27050:96;;27156:43;27192:6;27187:3;27180:5;27156:43;:::i;:::-;27224:6;27219:3;27215:16;27208:23;;26920:317;;;;;:::o;27243:295::-;27385:3;27407:105;27508:3;27499:6;27491;27407:105;:::i;:::-;27400:112;;27529:3;27522:10;;27243:295;;;;;:::o;27568:304::-;27666:3;27687:71;27751:6;27746:3;27687:71;:::i;:::-;27680:78;;27768:43;27804:6;27799:3;27792:5;27768:43;:::i;:::-;27836:29;27858:6;27836:29;:::i;:::-;27831:3;27827:39;27820:46;;27568:304;;;;;:::o;27878:333::-;28001:4;28039:2;28028:9;28024:18;28016:26;;28088:9;28082:4;28078:20;28074:1;28063:9;28059:17;28052:47;28116:88;28199:4;28190:6;28182;28116:88;:::i;:::-;28108:96;;27878:333;;;;;:::o;28217:228::-;28357:34;28353:1;28345:6;28341:14;28334:58;28426:11;28421:2;28413:6;28409:15;28402:36;28217:228;:::o;28451:366::-;28593:3;28614:67;28678:2;28673:3;28614:67;:::i;:::-;28607:74;;28690:93;28779:3;28690:93;:::i;:::-;28808:2;28803:3;28799:12;28792:19;;28451:366;;;:::o;28823:419::-;28989:4;29027:2;29016:9;29012:18;29004:26;;29076:9;29070:4;29066:20;29062:1;29051:9;29047:17;29040:47;29104:131;29230:4;29104:131;:::i;:::-;29096:139;;28823:419;;;:::o;29248:229::-;29388:34;29384:1;29376:6;29372:14;29365:58;29457:12;29452:2;29444:6;29440:15;29433:37;29248:229;:::o;29483:366::-;29625:3;29646:67;29710:2;29705:3;29646:67;:::i;:::-;29639:74;;29722:93;29811:3;29722:93;:::i;:::-;29840:2;29835:3;29831:12;29824:19;;29483:366;;;:::o;29855:419::-;30021:4;30059:2;30048:9;30044:18;30036:26;;30108:9;30102:4;30098:20;30094:1;30083:9;30079:17;30072:47;30136:131;30262:4;30136:131;:::i;:::-;30128:139;;29855:419;;;:::o;30280:180::-;30328:77;30325:1;30318:88;30425:4;30422:1;30415:15;30449:4;30446:1;30439:15;30466:233;30505:3;30528:24;30546:5;30528:24;:::i;:::-;30519:33;;30574:66;30567:5;30564:77;30561:103;;;30644:18;;:::i;:::-;30561:103;30691:1;30684:5;30680:13;30673:20;;30466:233;;;:::o;30705:220::-;30845:34;30841:1;30833:6;30829:14;30822:58;30914:3;30909:2;30901:6;30897:15;30890:28;30705:220;:::o;30931:366::-;31073:3;31094:67;31158:2;31153:3;31094:67;:::i;:::-;31087:74;;31170:93;31259:3;31170:93;:::i;:::-;31288:2;31283:3;31279:12;31272:19;;30931:366;;;:::o;31303:419::-;31469:4;31507:2;31496:9;31492:18;31484:26;;31556:9;31550:4;31546:20;31542:1;31531:9;31527:17;31520:47;31584:131;31710:4;31584:131;:::i;:::-;31576:139;;31303:419;;;:::o;31728:175::-;31868:27;31864:1;31856:6;31852:14;31845:51;31728:175;:::o;31909:366::-;32051:3;32072:67;32136:2;32131:3;32072:67;:::i;:::-;32065:74;;32148:93;32237:3;32148:93;:::i;:::-;32266:2;32261:3;32257:12;32250:19;;31909:366;;;:::o;32281:419::-;32447:4;32485:2;32474:9;32470:18;32462:26;;32534:9;32528:4;32524:20;32520:1;32509:9;32505:17;32498:47;32562:131;32688:4;32562:131;:::i;:::-;32554:139;;32281:419;;;:::o;32706:229::-;32846:34;32842:1;32834:6;32830:14;32823:58;32915:12;32910:2;32902:6;32898:15;32891:37;32706:229;:::o;32941:366::-;33083:3;33104:67;33168:2;33163:3;33104:67;:::i;:::-;33097:74;;33180:93;33269:3;33180:93;:::i;:::-;33298:2;33293:3;33289:12;33282:19;;32941:366;;;:::o;33313:419::-;33479:4;33517:2;33506:9;33502:18;33494:26;;33566:9;33560:4;33556:20;33552:1;33541:9;33537:17;33530:47;33594:131;33720:4;33594:131;:::i;:::-;33586:139;;33313:419;;;:::o;33738:377::-;33844:3;33872:39;33905:5;33872:39;:::i;:::-;33927:89;34009:6;34004:3;33927:89;:::i;:::-;33920:96;;34025:52;34070:6;34065:3;34058:4;34051:5;34047:16;34025:52;:::i;:::-;34102:6;34097:3;34093:16;34086:23;;33848:267;33738:377;;;;:::o;34121:214::-;34261:66;34257:1;34249:6;34245:14;34238:90;34121:214;:::o;34341:402::-;34501:3;34522:85;34604:2;34599:3;34522:85;:::i;:::-;34515:92;;34616:93;34705:3;34616:93;:::i;:::-;34734:2;34729:3;34725:12;34718:19;;34341:402;;;:::o;34749:214::-;34889:66;34885:1;34877:6;34873:14;34866:90;34749:214;:::o;34969:402::-;35129:3;35150:85;35232:2;35227:3;35150:85;:::i;:::-;35143:92;;35244:93;35333:3;35244:93;:::i;:::-;35362:2;35357:3;35353:12;35346:19;;34969:402;;;:::o;35377:143::-;35513:3;35509:1;35501:6;35497:14;35490:27;35377:143;:::o;35522:384::-;35682:3;35699:84;35781:1;35776:3;35699:84;:::i;:::-;35692:91;;35788:93;35877:3;35788:93;:::i;:::-;35902:1;35897:3;35893:11;35886:18;;35522:384;;;:::o;35908:1401::-;36459:3;36477:95;36568:3;36559:6;36477:95;:::i;:::-;36470:102;;36585:148;36729:3;36585:148;:::i;:::-;36578:155;;36746:105;36847:3;36838:6;36830;36746:105;:::i;:::-;36739:112;;36864:148;37008:3;36864:148;:::i;:::-;36857:155;;37025:105;37126:3;37117:6;37109;37025:105;:::i;:::-;37018:112;;37143:148;37287:3;37143:148;:::i;:::-;37136:155;;37304:3;37297:10;;35908:1401;;;;;;;;:::o;37311:222::-;37447:34;37443:1;37435:6;37431:14;37424:58;37512:17;37507:2;37499:6;37495:15;37488:42;37311:222;:::o;37535:350::-;37677:3;37694:67;37758:2;37753:3;37694:67;:::i;:::-;37687:74;;37766:93;37855:3;37766:93;:::i;:::-;37880:2;37875:3;37871:12;37864:19;;37535:350;;;:::o;37887:403::-;38053:4;38087:2;38076:9;38072:18;38064:26;;38132:9;38126:4;38122:20;38118:1;38107:9;38103:17;38096:47;38156:131;38282:4;38156:131;:::i;:::-;38148:139;;37887:403;;;:::o;38292:206::-;38428:66;38424:1;38416:6;38412:14;38405:90;38292:206;:::o;38500:386::-;38660:3;38677:85;38759:2;38754:3;38677:85;:::i;:::-;38670:92;;38767:93;38856:3;38767:93;:::i;:::-;38881:2;38876:3;38872:12;38865:19;;38500:386;;;:::o;38888:206::-;39024:66;39020:1;39012:6;39008:14;39001:90;38888:206;:::o;39096:386::-;39256:3;39273:85;39355:2;39350:3;39273:85;:::i;:::-;39266:92;;39363:93;39452:3;39363:93;:::i;:::-;39477:2;39472:3;39468:12;39461:19;;39096:386;;;:::o;39484:206::-;39620:66;39616:1;39608:6;39604:14;39597:90;39484:206;:::o;39692:386::-;39852:3;39869:85;39951:2;39946:3;39869:85;:::i;:::-;39862:92;;39959:93;40048:3;39959:93;:::i;:::-;40073:2;40068:3;40064:12;40057:19;;39692:386;;;:::o;40080:206::-;40216:66;40212:1;40204:6;40200:14;40193:90;40080:206;:::o;40288:386::-;40448:3;40465:85;40547:2;40542:3;40465:85;:::i;:::-;40458:92;;40555:93;40644:3;40555:93;:::i;:::-;40669:2;40664:3;40660:12;40653:19;;40288:386;;;:::o;40676:206::-;40812:66;40808:1;40800:6;40796:14;40789:90;40676:206;:::o;40884:386::-;41044:3;41061:85;41143:2;41138:3;41061:85;:::i;:::-;41054:92;;41151:93;41240:3;41151:93;:::i;:::-;41265:2;41260:3;41256:12;41249:19;;40884:386;;;:::o;41272:156::-;41408:16;41404:1;41396:6;41392:14;41385:40;41272:156;:::o;41430:386::-;41590:3;41607:85;41689:2;41684:3;41607:85;:::i;:::-;41600:92;;41697:93;41786:3;41697:93;:::i;:::-;41811:2;41806:3;41802:12;41795:19;;41430:386;;;:::o;41818:151::-;41954:11;41950:1;41942:6;41938:14;41931:35;41818:151;:::o;41971:384::-;42131:3;42148:84;42230:1;42225:3;42148:84;:::i;:::-;42141:91;;42237:93;42326:3;42237:93;:::i;:::-;42351:1;42346:3;42342:11;42335:18;;41971:384;;;:::o;42357:303::-;42493:66;42489:1;42481:6;42477:14;42470:90;42590:66;42585:2;42577:6;42573:15;42566:91;42357:303;:::o;42662:386::-;42822:3;42839:85;42921:2;42916:3;42839:85;:::i;:::-;42832:92;;42929:93;43018:3;42929:93;:::i;:::-;43043:2;43038:3;43034:12;43027:19;;42662:386;;;:::o;43050:206::-;43186:66;43182:1;43174:6;43170:14;43163:90;43050:206;:::o;43258:384::-;43418:3;43435:84;43517:1;43512:3;43435:84;:::i;:::-;43428:91;;43524:93;43613:3;43524:93;:::i;:::-;43638:1;43633:3;43629:11;43622:18;;43258:384;;;:::o;43644:140::-;43776:4;43772:1;43764:6;43760:14;43753:28;43644:140;:::o;43786:372::-;43946:3;43959:84;44041:1;44036:3;43959:84;:::i;:::-;43952:91;;44044:93;44133:3;44044:93;:::i;:::-;44154:1;44149:3;44145:11;44138:18;;43786:372;;;:::o;44160:4357::-;45783:3;45797:148;45941:3;45797:148;:::i;:::-;45790:155;;45954:95;46045:3;46036:6;45954:95;:::i;:::-;45947:102;;46058:95;46149:3;46140:6;46058:95;:::i;:::-;46051:102;;46162:148;46306:3;46162:148;:::i;:::-;46155:155;;46319:95;46410:3;46401:6;46319:95;:::i;:::-;46312:102;;46423:148;46567:3;46423:148;:::i;:::-;46416:155;;46580:95;46671:3;46662:6;46580:95;:::i;:::-;46573:102;;46684:148;46828:3;46684:148;:::i;:::-;46677:155;;46841:95;46932:3;46923:6;46841:95;:::i;:::-;46834:102;;46945:95;47036:3;47027:6;46945:95;:::i;:::-;46938:102;;47049:148;47193:3;47049:148;:::i;:::-;47042:155;;47206:95;47297:3;47288:6;47206:95;:::i;:::-;47199:102;;47310:148;47454:3;47310:148;:::i;:::-;47303:155;;47467:95;47558:3;47549:6;47467:95;:::i;:::-;47460:102;;47571:148;47715:3;47571:148;:::i;:::-;47564:155;;47728:95;47819:3;47810:6;47728:95;:::i;:::-;47721:102;;47832:148;47976:3;47832:148;:::i;:::-;47825:155;;47989:95;48080:3;48071:6;47989:95;:::i;:::-;47982:102;;48093:148;48237:3;48093:148;:::i;:::-;48086:155;;48250:96;48342:3;48332:7;48250:96;:::i;:::-;48243:103;;48355:148;48499:3;48355:148;:::i;:::-;48348:155;;48512:3;48505:10;;44160:4357;;;;;;;;;;;;;;:::o;48519:167::-;48651:31;48647:1;48639:6;48635:14;48628:55;48519:167;:::o;48688:374::-;48848:3;48861:85;48943:2;48938:3;48861:85;:::i;:::-;48854:92;;48947:93;49036:3;48947:93;:::i;:::-;49057:2;49052:3;49048:12;49041:19;;48688:374;;;:::o;49064:513::-;49297:3;49311:148;49455:3;49311:148;:::i;:::-;49304:155;;49468:95;49559:3;49550:6;49468:95;:::i;:::-;49461:102;;49572:3;49565:10;;49064:513;;;;:::o;49579:205::-;49711:34;49707:1;49699:6;49695:14;49688:58;49772:8;49767:2;49759:6;49755:15;49748:33;49579:205;:::o;49786:338::-;49928:3;49941:67;50005:2;50000:3;49941:67;:::i;:::-;49934:74;;50009:93;50098:3;50009:93;:::i;:::-;50119:2;50114:3;50110:12;50103:19;;49786:338;;;:::o;50126:391::-;50292:4;50322:2;50311:9;50307:18;50299:26;;50363:9;50357:4;50353:20;50349:1;50338:9;50334:17;50327:47;50383:131;50509:4;50383:131;:::i;:::-;50375:139;;50126:391;;;:::o;50519:211::-;50651:34;50647:1;50639:6;50635:14;50628:58;50712:14;50707:2;50699:6;50695:15;50688:39;50519:211;:::o;50732:338::-;50874:3;50887:67;50951:2;50946:3;50887:67;:::i;:::-;50880:74;;50955:93;51044:3;50955:93;:::i;:::-;51065:2;51060:3;51056:12;51049:19;;50732:338;;;:::o;51072:391::-;51238:4;51268:2;51257:9;51253:18;51245:26;;51309:9;51303:4;51299:20;51295:1;51284:9;51280:17;51273:47;51329:131;51455:4;51329:131;:::i;:::-;51321:139;;51072:391;;;:::o;51465:208::-;51597:34;51593:1;51585:6;51581:14;51574:58;51658:11;51653:2;51645:6;51641:15;51634:36;51465:208;:::o;51675:338::-;51817:3;51830:67;51894:2;51889:3;51830:67;:::i;:::-;51823:74;;51898:93;51987:3;51898:93;:::i;:::-;52008:2;52003:3;51999:12;51992:19;;51675:338;;;:::o;52015:391::-;52181:4;52211:2;52200:9;52196:18;52188:26;;52252:9;52246:4;52242:20;52238:1;52227:9;52223:17;52216:47;52272:131;52398:4;52272:131;:::i;:::-;52264:139;;52015:391;;;:::o;52408:203::-;52540:34;52536:1;52528:6;52524:14;52517:58;52601:6;52596:2;52588:6;52584:15;52577:31;52408:203;:::o;52613:338::-;52755:3;52768:67;52832:2;52827:3;52768:67;:::i;:::-;52761:74;;52836:93;52925:3;52836:93;:::i;:::-;52946:2;52941:3;52937:12;52930:19;;52613:338;;;:::o;52953:391::-;53119:4;53149:2;53138:9;53134:18;53126:26;;53190:9;53184:4;53180:20;53176:1;53165:9;53161:17;53154:47;53210:131;53336:4;53210:131;:::i;:::-;53202:139;;52953:391;;;:::o;53346:155::-;53386:4;53398:20;53416:1;53398:20;:::i;:::-;53393:25;;53424:20;53442:1;53424:20;:::i;:::-;53419:25;;53455:1;53452;53449:8;53446:34;;;53460:18;;:::i;:::-;53446:34;53497:1;53494;53490:9;53482:17;;53346:155;;;;:::o;53503:261::-;53543:3;53554:20;53572:1;53554:20;:::i;:::-;53549:25;;53580:20;53598:1;53580:20;:::i;:::-;53575:25;;53718:1;53650:66;53646:74;53643:1;53640:81;53637:107;;;53724:18;;:::i;:::-;53637:107;53760:1;53757;53753:9;53746:16;;53503:261;;;;:::o;53766:170::-;53898:34;53894:1;53886:6;53882:14;53875:58;53766:170;:::o;53938:338::-;54080:3;54093:67;54157:2;54152:3;54093:67;:::i;:::-;54086:74;;54161:93;54250:3;54161:93;:::i;:::-;54271:2;54266:3;54262:12;54255:19;;53938:338;;;:::o;54278:391::-;54444:4;54474:2;54463:9;54459:18;54451:26;;54515:9;54509:4;54505:20;54501:1;54490:9;54486:17;54479:47;54535:131;54661:4;54535:131;:::i;:::-;54527:139;;54278:391;;;:::o;54671:166::-;54803:30;54799:1;54791:6;54787:14;54780:54;54671:166;:::o;54839:338::-;54981:3;54994:67;55058:2;55053:3;54994:67;:::i;:::-;54987:74;;55062:93;55151:3;55062:93;:::i;:::-;55172:2;55167:3;55163:12;55156:19;;54839:338;;;:::o;55179:391::-;55345:4;55375:2;55364:9;55360:18;55352:26;;55416:9;55410:4;55406:20;55402:1;55391:9;55387:17;55380:47;55436:131;55562:4;55436:131;:::i;:::-;55428:139;;55179:391;;;:::o;55572:217::-;55704:34;55700:1;55692:6;55688:14;55681:58;55765:20;55760:2;55752:6;55748:15;55741:45;55572:217;:::o;55791:338::-;55933:3;55946:67;56010:2;56005:3;55946:67;:::i;:::-;55939:74;;56014:93;56103:3;56014:93;:::i;:::-;56124:2;56119:3;56115:12;56108:19;;55791:338;;;:::o;56131:391::-;56297:4;56327:2;56316:9;56312:18;56304:26;;56368:9;56362:4;56358:20;56354:1;56343:9;56339:17;56332:47;56388:131;56514:4;56388:131;:::i;:::-;56380:139;;56131:391;;;:::o;56524:152::-;56564:77;56561:1;56554:88;56653:4;56650:1;56643:15;56669:4;56666:1;56659:15;56678:149;56718:1;56727:20;56745:1;56727:20;:::i;:::-;56722:25;;56753:20;56771:1;56753:20;:::i;:::-;56748:25;;56784:1;56774:35;;56789:18;;:::i;:::-;56774:35;56823:1;56820;56816:9;56811:14;;56678:149;;;;:::o;56829:140::-;56861:1;56870:20;56888:1;56870:20;:::i;:::-;56865:25;;56896:20;56914:1;56896:20;:::i;:::-;56891:25;;56927:1;56917:35;;56932:18;;:::i;:::-;56917:35;56965:1;56962;56958:9;56953:14;;56829:140;;;;:::o;56971:152::-;57011:77;57008:1;57001:88;57100:4;57097:1;57090:15;57116:4;57113:1;57106:15;57125:304;57165:7;57180:20;57198:1;57180:20;:::i;:::-;57175:25;;57206:20;57224:1;57206:20;:::i;:::-;57201:25;;57378:1;57310:66;57306:74;57303:1;57300:81;57295:1;57288:9;57281:17;57277:105;57274:131;;;57385:18;;:::i;:::-;57274:131;57425:1;57422;57418:9;57407:20;;57125:304;;;;:::o;57431:86::-;57482:6;57508:5;57502:12;57492:22;;57431:86;;;:::o;57519:148::-;57602:11;57628:6;57623:3;57616:19;57660:4;57655:3;57651:14;57636:29;;57519:148;;;;:::o;57669:324::-;57755:3;57775:38;57807:5;57775:38;:::i;:::-;57821:70;57884:6;57879:3;57821:70;:::i;:::-;57814:77;;57892:52;57937:6;57932:3;57925:4;57918:5;57914:16;57892:52;:::i;:::-;57961:29;57983:6;57961:29;:::i;:::-;57956:3;57952:39;57945:46;;57759:234;57669:324;;;;:::o;57995:588::-;58190:4;58220:3;58209:9;58205:19;58197:27;;58226:71;58294:1;58283:9;58279:17;58270:6;58226:71;:::i;:::-;58299:72;58367:2;58356:9;58352:18;58343:6;58299:72;:::i;:::-;58373;58441:2;58430:9;58426:18;58417:6;58373:72;:::i;:::-;58484:9;58478:4;58474:20;58469:2;58458:9;58454:18;58447:48;58504:76;58575:4;58566:6;58504:76;:::i;:::-;58496:84;;57995:588;;;;;;;:::o;58585:121::-;58641:5;58664:6;58658:13;58649:22;;58672:32;58698:5;58672:32;:::i;:::-;58585:121;;;;:::o;58708:305::-;58777:6;58818:2;58806:9;58797:7;58793:23;58789:32;58786:119;;;58824:79;;:::i;:::-;58786:119;58928:1;58945:63;59000:7;58991:6;58980:9;58976:22;58945:63;:::i;:::-;58935:73;;58907:103;58708:305;;;;:::o

Swarm Source

ipfs://a05c578a57d84aa7951c422f2919aff4b91ba9be0dbf2c845dafbe60825d34e5
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.