ETH Price: $3,409.80 (+3.31%)

Token

ApesOnChain (APOC)
 

Overview

Max Total Supply

3,450 APOC

Holders

1,322

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 APOC
0xbdc364bd4d3d9c1a4a817e85d3ce23997af237c5
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:
ApesOnChain

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-21
*/

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

/*
################################################################################
################################################################################
################################################################################
########################&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#######################
########################&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#######################
########################&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#######################
########################&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#######################
########################(((((((((((((((((((((((((((((((((#######################
########################(((((((((((((((((((((((((((((((((#######################
#######################%%%%%%%%...................%%%%%%%%######################
#####################%%%%%%%........................./%%%%%%####################
###################%%%%%%...............................%%%%%%##################
##################%%%%%*....        ......................%%%%%#################
############%%%%%%%%%%.....   #####   ....... *####   .....%%%%%%%%%%###########
#########%%%%%%%%%%%%,.....  ##@@%##  ...... (##@@##   .....%%%%%%%%%%%%########
########%%%%%%..%%%%%.......  ####   ........  ####   ......%%%%%../%%%%%#######
########%%%%%...%%%%%...........................   .........%%%%%...#%%%%#######
########%%%%%%..%%%%%.......................................%%%%%..%%%%%%#######
##########%%%%%%%%%%%#................     ................,%%%%%%%%%%%%########
#############%%%%%%%%%.......        @     @        .......%%%%%%%%%############
##################%%%%%%...                           ...%%%%%%#################
###################%%%%%%/..                         ...%%%%%%##################
#####################%%%%%%%.....               @....%%%%%%%####################
#######################%%%%%%%%%.................%@%%%%%%%######################
###########################%%%%%%%%%%%%%%%%%%%%%%%%%%%%#########################
###############################%%%%%%%%%%%%%%%%%%%##############################
################/(((((((////((((/((((((///(/(/(//(((((((///(((((/###############
################(((/((/(/((//((///(/(/((///((//(((/((/((((//((///###############
################//((/((///(((/(/(((///////(/(//////////(/(/(/(((/###############
################/(//((/(/(((/(///(/((((((/(((/////////(//(//((//(###############
################/(((////////(//(//((//(///(/(//////////(//((/(((/###############
################(/(/((/(((((((/(////((/(/(/(///////////((((((/(//###############
*/
// @title: ApesOnChain
// @author: MasterApe
//
// On chain PFP collection of 3.5K unique profile images with the following properties:
//   - a single Ethereum transaction created everything
//   - all metadata on chain
//   - all images on chain in svg format
//   - all created in the constraints of a single txn without need of any other txns to load additional data
//   - no use of other deployed contracts
//   - all 3.500 ApesOnChain are unique
//   - there are 7 traits with 171 values (including 3 traits of no hat, no clothes, and no earring)
//   - the traits have distribution and rarities interesting for collecting
//   - everything on chain can be used in other apps and collections in the future
// Do u wanna be an Ape On Chain? 



/// [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 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;
}

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

/*
 * @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 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 Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. 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 {}
}

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// Bring on the ApesOnChain!
contract ApesOnChain is ERC721Enumerable, ReentrancyGuard, Ownable {
  using Strings for uint256;

  uint256 public constant maxSupply = 3500;
  uint256 public numClaimed = 0;
  string[] private background = ["1eb","dda","e92","656","663","9de","367","ccc"]; // only trait that is uniform, no need for rarity weights
  string[] private fur1 = ["444","532","653","a71","ffc","ca9","f89","777","049","901","fc5","ffe","574","bcc","d04","222","889","7f9","fd1"];
  string[] private fur2 = ["344","653","653","653","110","653","653","653","653","653","344","653","711","110","799","555","8a8","32f","110"];
  uint8[] private fur_w =[249, 246, 223, 141, 116, 114, 93, 90, 89, 86, 74, 28, 55, 48, 39, 32, 72, 14, 8];
  string[] private eyes = ["888","0a0","653","653","be7","abe","0a0","653","888","be7","cef","abe","0a0","653","888","be7","cef","abe","0a0","abe","888","be7","cef"];
  uint8[] private eyes_w = [68, 121, 107, 101, 33, 78, 70, 245, 62, 58, 56, 51, 50, 48, 44, 38, 35, 79, 31, 22, 15, 10, 7];
  string[] private mouth = ["bcc","049","f89","777","ffc","901","653","d04","fd1","ffc","bcc","f89","777","049","049","901","901","bcc","653","d04","ffc","f89","bcc","049","fd1","f89","777","bcc","d04","049","ffc","901","fd1"];
  uint8[] private mouth_w = [252, 172, 80, 10, 27, 49, 37, 33, 31, 30, 28, 56, 26, 23, 22, 18, 15, 14, 13, 12, 11, 79, 10, 10, 9, 8, 7, 7, 6, 5, 5, 4, 3];
  string[] private earring = ["999","fe7","999","999","fe7","bdd"];
  uint8[] private earring_w = [251, 32, 29, 17, 16, 8, 5];
  string[] private clothes1 = ["222","f00","222","f00","f00","f00","90f","f00","90f","00f","00f","00f","00f","00f","00f","00f","222","00f","f0f","222","f0f","f0f","f0f","f0f","f0f","f0f","f0f","f80","f80","f80","f80","f80","f00","f80","f80","f80","90f","90f","00f","90f","00f","90f","222"];
  string[] private clothes2 = ["ddd","00f","f00","f0f","f80","ddd","f48","0f0","ff0","f0f","00d","f0f","f80","90f","f48","0f0","ddd","ff0","f00","653","00f","d0d","f80","90f","f48","0f0","ff0","f00","f0f","00f","d60","f48","ddd","90f","0f0","ff0","f00","00f","fd1","f0f","f80","70d","fd1"];
  uint8[] private clothes_w = [251, 55, 31, 43, 38, 37, 34, 33, 32, 31, 31, 31, 45, 45, 30, 30, 29, 29, 28, 27, 27, 27, 26, 25, 24, 22, 21, 20, 19, 19, 19, 19, 19, 19, 18, 17, 16, 15, 14, 13, 11, 9, 8, 6];
  string[] private hat1 = ["ff0","f80","f00","f00","90f","f80","f00","00f","00f","00f","00f","00f","00f","00f","f00","f00","f0f","f0f","f0f","f00","f00","f0f","f80","f80","f80","f80","22d","f80","f00","f80","90f","f48","22d","90f","90f","ff0",""];
  string[] private hat2 = ["0f0","00f","f80","ff0","f80","f0f","f48","f00","0f0","00f","f80","ff0","90f","f80","000","f00","0f0","00f","f80","000","90f","f0f","90f","f80","00f","f80","ff0","90f","f00","f0f","f00","000","000","0f0","00f","f48",""];  
  uint8[] private hat_w = [36, 64, 47, 42, 39, 38, 251, 35, 34, 34, 33, 29, 28, 26, 26, 25, 25, 25, 22, 21, 20, 20, 18, 17, 17, 15, 14, 14, 13, 13, 12, 12, 12, 10, 9, 8, 7];
  string[] private z = ['<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 500 500"><rect x="0" y="0" width="500" height="500" style="fill:#',
    '"/><rect width="300" height="120" x="99" y="400" style="fill:#', '"/><circle cx="190" cy="470" r="5" style="fill:#', '"/><circle cx="310" cy="470" r="5" style="fill:#',
    '"/><circle cx="100" cy="250" r="50" style="fill:#', '"/><circle cx="100" cy="250" r="20" style="fill:#', '"/><circle cx="400" cy="250" r="50" style="fill:#',
    '"/><circle cx="400" cy="250" r="20" style="fill:#', '"/><circle cx="250" cy="250" r="150" style="fill:#', '"/><circle cx="250" cy="250" r="120" style="fill:#',
    '"/><circle cx="200" cy="215" r="35" style="fill:#fff"/><circle cx="305" cy="222" r="31" style="fill:#fff"/><circle cx="200" cy="220" r="20" style="fill:#',
    '"/><circle cx="300" cy="220" r="20" style="fill:#', '"/><circle cx="200" cy="220" r="7" style="fill:#000"/><circle cx="300" cy="220" r="7" style="fill:#000"/>',
    '<ellipse cx="250" cy="315" rx="84" ry="34" style="fill:#',
     '"/><rect x="195" y="330" width="110" height="3" style="fill:#000"/><circle cx="268" cy="295" r="5" style="fill:#000"/><circle cx="232" cy="295" r="5" style="fill:#000"/>',
    '</svg>'];
  string private cross='<rect x="95" y="275" width="10" height="40" style="fill:#872"/><rect x="85" y="285" width="30" height="10" style="fill:#872"/>';
  string private clo1='<rect width="300" height="120" x="99" y="400" style="fill:#';
  string private clo2='"/><rect width="50" height="55" x="280" y="430" style="fill:#';
  string private hh1='<rect width="200" height="99" x="150" y="40" style="fill:#';
  string private hh2='"/><rect width="200" height="33" x="150" y="106" style="fill:#';
  string private sl1='<rect x="150" y="190" width="200" height="30" style="fill:#';
  string private sl2='"/><rect x="160" y="170" width="180" height="50" style="fill:#';
  string private mou='<line x1="287" y1="331" x2="320" y2="366" style="stroke:#000;stroke-width:5"/>';
  string private ey1='<rect x="160" y="190" width="75" height="15" style="fill:#';
  string private ey2='"/><rect x="275" y="190" width="65" height="15" style="fill:#';
  string private ey3='<rect x="160" y="235" width="180" height="50" style="fill:#';
  string private zz='"/>';
  string private ea1='<circle cx="100" cy="290" r="14" style="fill:#';
  string private ea2='fe7';
  string private ea3='999';
  string private ea4='"/><circle cx="100" cy="290" r="4" style="fill:#000"/>';
  string private ea5='<circle cx="100" cy="290" r="12" style="fill:#';
  string private ea6='bdd';
  string private mo1='<line x1="';
  string private mo2='" y1="307" x2="';
  string private mo3='" y2="312" style="stroke:#000;stroke-width:2"/>';
  string private mo4='" y1="317" x2="';
  string private mo5='" y2="322" style="stroke:#000;stroke-width:2"/>';
  string private tr1='", "attributes": [{"trait_type": "Background","value": "';
  string private tr2='"},{"trait_type": "Fur","value": "';
  string private tr3='"},{"trait_type": "Earring","value": "';
  string private tr4='"},{"trait_type": "Hat","value": "';
  string private tr5='"},{"trait_type": "Eyes","value": "';
  string private tr6='"},{"trait_type": "Clothes","value": "';
  string private tr7='"},{"trait_type": "Mouth","value": "';
  string private tr8='"}],"image": "data:image/svg+xml;base64,';
  string private ra1='A';
  string private ra2='C';
  string private ra3='D';
  string private ra4='E';
  string private ra5='F';
  string private ra6='G';
  string private co1=', ';
  string private rl1='{"name": "Ape On Chain #';
  string private rl3='"}';
  string private rl4='data:application/json;base64,';

  struct Ape { 
    uint8 bg;
    uint8 fur;
    uint8 eyes;
    uint8 mouth;
    uint8 earring;
    uint8 clothes;
    uint8 hat;
  }

  // this was used to create the distributon of 3,500 and tested for uniqueness for the given parameters of this collection
  function random(string memory input) internal pure returns (uint256) {
    return uint256(keccak256(abi.encodePacked(input)));
  }

  function usew(uint8[] memory w,uint256 i) internal pure returns (uint8) {
    uint8 ind=0;
    uint256 j=uint256(w[0]);
    while (j<=i) {
      ind++;
      j+=uint256(w[ind]);
    }
    return ind;
  }

  function randomOne(uint256 tokenId) internal view returns (Ape memory) {
    tokenId=12839-tokenId; // avoid dupes
    Ape memory ape;
    ape.bg = uint8(random(string(abi.encodePacked(ra1,tokenId.toString()))) % 8);
    ape.fur = usew(fur_w,random(string(abi.encodePacked(clo1,tokenId.toString())))%1817);
    ape.eyes = usew(eyes_w,random(string(abi.encodePacked(ra2,tokenId.toString())))%1429);
    ape.mouth = usew(mouth_w,random(string(abi.encodePacked(ra3,tokenId.toString())))%1112);
    ape.earring = usew(earring_w,random(string(abi.encodePacked(ra4,tokenId.toString())))%358);
    ape.clothes = usew(clothes_w,random(string(abi.encodePacked(ra5,tokenId.toString())))%1329);
    ape.hat = usew(hat_w,random(string(abi.encodePacked(ra6,tokenId.toString())))%1111);
    if (tokenId==7403) {
      ape.hat++; 
    }
    return ape;
  }

  // get string attributes of properties, used in tokenURI call
  function getTraits(Ape memory ape) internal view returns (string memory) {
    string memory o=string(abi.encodePacked(tr1,uint256(ape.bg).toString(),tr2,uint256(ape.fur).toString(),tr3,uint256(ape.earring).toString()));
    return string(abi.encodePacked(o,tr4,uint256(ape.hat).toString(),tr5,uint256(ape.eyes).toString(),tr6,uint256(ape.clothes).toString(),tr7,uint256(ape.mouth).toString(),tr8));
  }

  // return comma separated traits in order: hat, fur, clothes, eyes, earring, mouth, background
  function getAttributes(uint256 tokenId) public view returns (string memory) {
    Ape memory ape = randomOne(tokenId);
    string memory o=string(abi.encodePacked(uint256(ape.hat).toString(),co1,uint256(ape.fur).toString(),co1,uint256(ape.clothes).toString(),co1));
    return string(abi.encodePacked(o,uint256(ape.eyes).toString(),co1,uint256(ape.earring).toString(),co1,uint256(ape.mouth).toString(),co1,uint256(ape.bg).toString()));
  }

  function genEye(string memory a,string memory b,uint8 h) internal view returns (string memory) {
    string memory out = '';
    if (h>4) { out = string(abi.encodePacked(sl1,a,sl2,a,zz)); }
    if (h>10) { out = string(abi.encodePacked(out,ey1,b,ey2,b,zz)); }
    if (h>16) { out = string(abi.encodePacked(out,ey3,a,zz)); }
    return out;
  }

  function genMouth(uint8 h) internal view returns (string memory) {
    string memory out = '';
    uint i;
    if ((h>24) || ((h>8) && (h<16))) {
      for (i=0;i<7;i++) {
        out = string(abi.encodePacked(out,mo1,(175+i*25).toString(),mo2,(175+i*25).toString(),mo3));
      }
      for (i=0;i<6;i++) {
        out = string(abi.encodePacked(out,mo1,(187+i*25).toString(),mo4,(187+i*25).toString(),mo5));
      }
    }
    if (h>15) {
      out = string(abi.encodePacked(out,mou));
    }
    return out;
  }

  function genEarring(uint8 h) internal view returns (string memory) {
    if (h==0) {
      return '';
    }
    if (h<3) {
      if (h>1) {
        return string(abi.encodePacked(ea1,ea2,ea4));
      } 
      return string(abi.encodePacked(ea1,ea3,ea4));
    }
    if (h>3) {
      if (h>5) {
        return string(abi.encodePacked(ea5,ea6,zz));
      } 
      if (h>4) {
        return string(abi.encodePacked(ea5,ea2,zz));
      } 
      return string(abi.encodePacked(ea5,ea3,zz));
    }
    return cross;
  }

  function genSVG(Ape memory ape) internal view returns (string memory) {
    string memory a=fur1[ape.fur];
    string memory b=fur2[ape.fur];
    string memory hatst='';
    string memory clost='';
    if (ape.clothes>0) {
      clost=string(abi.encodePacked(clo1,clothes1[ape.clothes-1],clo2,clothes2[ape.clothes-1],zz));
    }
    if (ape.hat>0) {
      hatst=string(abi.encodePacked(hh1,hat1[ape.hat-1],hh2,hat2[ape.hat-1],zz));
    }
    string memory output = string(abi.encodePacked(z[0],background[ape.bg],z[1],b,z[2]));
    output = string(abi.encodePacked(output,a,z[3],a,z[4],b,z[5],a,z[6]));
    output = string(abi.encodePacked(output,b,z[7],a,z[8],b,z[9],a,z[10]));
    output = string(abi.encodePacked(output,eyes[ape.eyes],z[11],eyes[ape.eyes],z[12],genEye(a,b,ape.eyes),z[13],mouth[ape.mouth],z[14]));
    return string(abi.encodePacked(output,genMouth(ape.mouth),genEarring(ape.earring),hatst,clost,z[15]));
  }

  function tokenURI(uint256 tokenId) override public view returns (string memory) {
    Ape memory ape = randomOne(tokenId);
    return string(abi.encodePacked(rl4,Base64.encode(bytes(string(abi.encodePacked(rl1,tokenId.toString(),getTraits(ape),Base64.encode(bytes(genSVG(ape))),rl3))))));
  }

  function mint() public nonReentrant {
    require(numClaimed >= 0 && numClaimed < 3450, "invalid mint");
    _safeMint(_msgSender(), numClaimed + 1);
    numClaimed += 1;
  }
    
  function ownerClaim(uint256 tokenId) public nonReentrant onlyOwner {
    require(tokenId > 3450 && tokenId < 3501, "invalid mint");
    _safeMint(owner(), tokenId);
  }
    
  constructor() ERC721("ApesOnChain", "APOC") Ownable() {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getAttributes","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"ownerClaim","outputs":[],"stateMutability":"nonpayable","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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600c556040518061010001604052806040518060400160405280600381526020017f316562000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f646461000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f653932000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363536000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363633000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f396465000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f333637000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f6363630000000000000000000000000000000000000000000000000000000000815250815250600d906008620001fd9291906200535e565b506040518061026001604052806040518060400160405280600381526020017f343434000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f353332000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f613731000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666663000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f636139000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663839000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f373737000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303439000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393031000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666335000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666665000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f353734000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f626363000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f643034000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323232000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f383839000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f376639000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f6664310000000000000000000000000000000000000000000000000000000000815250815250600e9060136200067b929190620053c5565b506040518061026001604052806040518060400160405280600381526020017f333434000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f313130000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f333434000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f373131000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f313130000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f373939000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f353535000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f386138000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f333266000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f3131300000000000000000000000000000000000000000000000000000000000815250815250600f90601362000af9929190620053c5565b5060405180610260016040528060f960ff16815260200160f660ff16815260200160df60ff168152602001608d60ff168152602001607460ff168152602001607260ff168152602001605d60ff168152602001605a60ff168152602001605960ff168152602001605660ff168152602001604a60ff168152602001601c60ff168152602001603760ff168152602001603060ff168152602001602760ff168152602001602060ff168152602001604860ff168152602001600e60ff168152602001600860ff16815250601090601362000bd49291906200542c565b50604051806102e001604052806040518060400160405280600381526020017f383838000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306130000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f626537000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f616265000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306130000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f383838000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f626537000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f636566000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f616265000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306130000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f383838000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f626537000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f636566000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f616265000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306130000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f616265000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f383838000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f626537000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f636566000000000000000000000000000000000000000000000000000000000081525081525060119060176200113e929190620054da565b50604051806102e00160405280604460ff168152602001607960ff168152602001606b60ff168152602001606560ff168152602001602160ff168152602001604e60ff168152602001604660ff16815260200160f560ff168152602001603e60ff168152602001603a60ff168152602001603860ff168152602001603360ff168152602001603260ff168152602001603060ff168152602001602c60ff168152602001602660ff168152602001602360ff168152602001604f60ff168152602001601f60ff168152602001601660ff168152602001600f60ff168152602001600a60ff168152602001600760ff1681525060129060176200124192919062005541565b506040518061042001604052806040518060400160405280600381526020017f626363000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303439000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663839000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f373737000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666663000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393031000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f643034000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666431000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666663000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f626363000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663839000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f373737000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303439000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303439000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393031000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393031000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f626363000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f643034000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666663000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663839000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f626363000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303439000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666431000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663839000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f373737000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f626363000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f643034000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303439000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666663000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393031000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f66643100000000000000000000000000000000000000000000000000000000008152508152506013906021620019f9929190620055ef565b5060405180610420016040528060fc60ff16815260200160ac60ff168152602001605060ff168152602001600a60ff168152602001601b60ff168152602001603160ff168152602001602560ff168152602001602160ff168152602001601f60ff168152602001601e60ff168152602001601c60ff168152602001603860ff168152602001601a60ff168152602001601760ff168152602001601660ff168152602001601260ff168152602001600f60ff168152602001600e60ff168152602001600d60ff168152602001600c60ff168152602001600b60ff168152602001604f60ff168152602001600a60ff168152602001600a60ff168152602001600960ff168152602001600860ff168152602001600760ff168152602001600760ff168152602001600660ff168152602001600560ff168152602001600560ff168152602001600460ff168152602001600360ff16815250601490602162001b6092919062005656565b506040518060c001604052806040518060400160405280600381526020017f393939000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666537000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393939000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393939000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666537000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f6264640000000000000000000000000000000000000000000000000000000000815250815250601590600662001cde92919062005704565b506040518060e0016040528060fb60ff168152602001602060ff168152602001601d60ff168152602001601160ff168152602001601060ff168152602001600860ff168152602001600560ff16815250601690600762001d409291906200576b565b506040518061056001604052806040518060400160405280600381526020017f323232000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323232000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323232000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323232000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f3232320000000000000000000000000000000000000000000000000000000000815250815250601790602b6200274692919062005819565b506040518061056001604052806040518060400160405280600381526020017f646464000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f646464000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663438000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303064000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663438000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f646464000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f643064000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663438000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f643630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663438000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f646464000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666431000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f373064000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f6664310000000000000000000000000000000000000000000000000000000000815250815250601890602b6200314c92919062005819565b5060405180610580016040528060fb60ff168152602001603760ff168152602001601f60ff168152602001602b60ff168152602001602660ff168152602001602560ff168152602001602260ff168152602001602160ff168152602001602060ff168152602001601f60ff168152602001601f60ff168152602001601f60ff168152602001602d60ff168152602001602d60ff168152602001601e60ff168152602001601e60ff168152602001601d60ff168152602001601d60ff168152602001601c60ff168152602001601b60ff168152602001601b60ff168152602001601b60ff168152602001601a60ff168152602001601960ff168152602001601860ff168152602001601660ff168152602001601560ff168152602001601460ff168152602001601360ff168152602001601360ff168152602001601360ff168152602001601360ff168152602001601360ff168152602001601360ff168152602001601260ff168152602001601160ff168152602001601060ff168152602001600f60ff168152602001600e60ff168152602001600d60ff168152602001600b60ff168152602001600960ff168152602001600860ff168152602001600660ff16815250601990602c6200332192919062005880565b50604051806104a001604052806040518060400160405280600381526020017f666630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323264000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663438000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323264000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f6666300000000000000000000000000000000000000000000000000000000000815250815260200160405180602001604052806000815250815250601a90602562003b9f9291906200592e565b50604051806104a001604052806040518060400160405280600381526020017f306630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663438000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f6634380000000000000000000000000000000000000000000000000000000000815250815260200160405180602001604052806000815250815250601b9060256200441d9291906200592e565b50604051806104a00160405280602460ff168152602001604060ff168152602001602f60ff168152602001602a60ff168152602001602760ff168152602001602660ff16815260200160fb60ff168152602001602360ff168152602001602260ff168152602001602260ff168152602001602160ff168152602001601d60ff168152602001601c60ff168152602001601a60ff168152602001601a60ff168152602001601960ff168152602001601960ff168152602001601960ff168152602001601660ff168152602001601560ff168152602001601460ff168152602001601460ff168152602001601260ff168152602001601160ff168152602001601160ff168152602001600f60ff168152602001600e60ff168152602001600e60ff168152602001600d60ff168152602001600d60ff168152602001600c60ff168152602001600c60ff168152602001600c60ff168152602001600a60ff168152602001600960ff168152602001600860ff168152602001600760ff16815250601c906025620045ac92919062005995565b506040518061020001604052806040518060c00160405280609a81526020016200ae2e609a913981526020016040518060600160405280603e81526020016200b268603e913981526020016040518060600160405280603081526020016200ad036030913981526020016040518060600160405280603081526020016200b17a6030913981526020016040518060600160405280603181526020016200b1496031913981526020016040518060600160405280603181526020016200af7f6031913981526020016040518060600160405280603181526020016200adfd6031913981526020016040518060600160405280603181526020016200b52b6031913981526020016040518060600160405280603281526020016200b0a66032913981526020016040518060600160405280603281526020016200b55c6032913981526020016040518060c00160405280609981526020016200ad646099913981526020016040518060600160405280603181526020016200ad336031913981526020016040518060a00160405280606981526020016200b1ff6069913981526020016040518060600160405280603881526020016200b3c76038913981526020016040518060e0016040528060a981526020016200b2a660a9913981526020016040518060400160405280600681526020017f3c2f7376673e0000000000000000000000000000000000000000000000000000815250815250601d906010620047d592919062005a43565b506040518060a00160405280607e81526020016200afed607e9139601e90805190602001906200480792919062005aaa565b506040518060600160405280603b81526020016200af44603b9139601f90805190602001906200483992919062005aaa565b506040518060600160405280603d81526020016200afb0603d9139602090805190602001906200486b92919062005aaa565b506040518060600160405280603a81526020016200b34f603a9139602190805190602001906200489d92919062005aaa565b506040518060600160405280603e81526020016200b389603e913960229080519060200190620048cf92919062005aaa565b506040518060600160405280603b81526020016200b06b603b9139602390805190602001906200490192919062005aaa565b506040518060600160405280603e81526020016200b439603e9139602490805190602001906200493392919062005aaa565b506040518060800160405280604e81526020016200b0d8604e9139602590805190602001906200496592919062005aaa565b506040518060600160405280603a81526020016200b3ff603a9139602690805190602001906200499792919062005aaa565b506040518060600160405280603d81526020016200b499603d913960279080519060200190620049c992919062005aaa565b506040518060600160405280603b81526020016200b5ea603b913960289080519060200190620049fb92919062005aaa565b506040518060400160405280600381526020017f222f3e00000000000000000000000000000000000000000000000000000000008152506029908051906020019062004a4992919062005aaa565b506040518060600160405280602e81526020016200b58e602e9139602a908051906020019062004a7b92919062005aaa565b506040518060400160405280600381526020017f6665370000000000000000000000000000000000000000000000000000000000815250602b908051906020019062004ac992919062005aaa565b506040518060400160405280600381526020017f3939390000000000000000000000000000000000000000000000000000000000815250602c908051906020019062004b1792919062005aaa565b506040518060600160405280603681526020016200af0e60369139602d908051906020019062004b4992919062005aaa565b506040518060600160405280602e81526020016200b5bc602e9139602e908051906020019062004b7b92919062005aaa565b506040518060400160405280600381526020017f6264640000000000000000000000000000000000000000000000000000000000815250602f908051906020019062004bc992919062005aaa565b506040518060400160405280600a81526020017f3c6c696e652078313d22000000000000000000000000000000000000000000008152506030908051906020019062004c1792919062005aaa565b506040518060400160405280600f81526020017f222079313d22333037222078323d2200000000000000000000000000000000008152506031908051906020019062004c6592919062005aaa565b506040518060600160405280602f81526020016200b4fc602f91396032908051906020019062004c9792919062005aaa565b506040518060400160405280600f81526020017f222079313d22333137222078323d2200000000000000000000000000000000008152506033908051906020019062004ce592919062005aaa565b506040518060600160405280602f81526020016200b1aa602f91396034908051906020019062004d1792919062005aaa565b506040518060600160405280603881526020016200accb603891396035908051906020019062004d4992919062005aaa565b506040518060600160405280602281526020016200aeec602291396036908051906020019062004d7b92919062005aaa565b506040518060600160405280602681526020016200b4d6602691396037908051906020019062004dad92919062005aaa565b506040518060600160405280602281526020016200b477602291396038908051906020019062004ddf92919062005aaa565b506040518060600160405280602381526020016200b126602391396039908051906020019062004e1192919062005aaa565b506040518060600160405280602681526020016200b1d960269139603a908051906020019062004e4392919062005aaa565b506040518060600160405280602481526020016200aec860249139603b908051906020019062004e7592919062005aaa565b506040518060600160405280602881526020016200aca360289139603c908051906020019062004ea792919062005aaa565b506040518060400160405280600181526020017f4100000000000000000000000000000000000000000000000000000000000000815250603d908051906020019062004ef592919062005aaa565b506040518060400160405280600181526020017f4300000000000000000000000000000000000000000000000000000000000000815250603e908051906020019062004f4392919062005aaa565b506040518060400160405280600181526020017f4400000000000000000000000000000000000000000000000000000000000000815250603f908051906020019062004f9192919062005aaa565b506040518060400160405280600181526020017f45000000000000000000000000000000000000000000000000000000000000008152506040908051906020019062004fdf92919062005aaa565b506040518060400160405280600181526020017f4600000000000000000000000000000000000000000000000000000000000000815250604190805190602001906200502d92919062005aaa565b506040518060400160405280600181526020017f4700000000000000000000000000000000000000000000000000000000000000815250604290805190602001906200507b92919062005aaa565b506040518060400160405280600281526020017f2c2000000000000000000000000000000000000000000000000000000000000081525060439080519060200190620050c992919062005aaa565b506040518060400160405280601881526020017f7b226e616d65223a2022417065204f6e20436861696e20230000000000000000815250604490805190602001906200511792919062005aaa565b506040518060400160405280600281526020017f227d000000000000000000000000000000000000000000000000000000000000815250604590805190602001906200516592919062005aaa565b506040518060400160405280601d81526020017f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081525060469080519060200190620051b392919062005aaa565b50348015620051c157600080fd5b506040518060400160405280600b81526020017f417065734f6e436861696e0000000000000000000000000000000000000000008152506040518060400160405280600481526020017f41504f430000000000000000000000000000000000000000000000000000000081525081600090805190602001906200524692919062005aaa565b5080600190805190602001906200525f92919062005aaa565b5050506001600a819055506200528a6200527e6200529060201b60201c565b6200529860201b60201c565b62005c2d565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054828255906000526020600020908101928215620053b2579160200282015b82811115620053b1578251829080519060200190620053a092919062005aaa565b50916020019190600101906200537f565b5b509050620053c1919062005b3b565b5090565b82805482825590600052602060002090810192821562005419579160200282015b82811115620054185782518290805190602001906200540792919062005aaa565b5091602001919060010190620053e6565b5b50905062005428919062005b3b565b5090565b82805482825590600052602060002090601f01602090048101928215620054c75791602002820160005b838211156200549657835183826101000a81548160ff021916908360ff160217905550926020019260010160208160000104928301926001030262005456565b8015620054c55782816101000a81549060ff021916905560010160208160000104928301926001030262005496565b505b509050620054d6919062005b63565b5090565b8280548282559060005260206000209081019282156200552e579160200282015b828111156200552d5782518290805190602001906200551c92919062005aaa565b5091602001919060010190620054fb565b5b5090506200553d919062005b3b565b5090565b82805482825590600052602060002090601f01602090048101928215620055dc5791602002820160005b83821115620055ab57835183826101000a81548160ff021916908360ff16021790555092602001926001016020816000010492830192600103026200556b565b8015620055da5782816101000a81549060ff0219169055600101602081600001049283019260010302620055ab565b505b509050620055eb919062005b63565b5090565b82805482825590600052602060002090810192821562005643579160200282015b82811115620056425782518290805190602001906200563192919062005aaa565b509160200191906001019062005610565b5b50905062005652919062005b3b565b5090565b82805482825590600052602060002090601f01602090048101928215620056f15791602002820160005b83821115620056c057835183826101000a81548160ff021916908360ff160217905550926020019260010160208160000104928301926001030262005680565b8015620056ef5782816101000a81549060ff0219169055600101602081600001049283019260010302620056c0565b505b50905062005700919062005b63565b5090565b82805482825590600052602060002090810192821562005758579160200282015b82811115620057575782518290805190602001906200574692919062005aaa565b509160200191906001019062005725565b5b50905062005767919062005b3b565b5090565b82805482825590600052602060002090601f01602090048101928215620058065791602002820160005b83821115620057d557835183826101000a81548160ff021916908360ff160217905550926020019260010160208160000104928301926001030262005795565b8015620058045782816101000a81549060ff0219169055600101602081600001049283019260010302620057d5565b505b50905062005815919062005b63565b5090565b8280548282559060005260206000209081019282156200586d579160200282015b828111156200586c5782518290805190602001906200585b92919062005aaa565b50916020019190600101906200583a565b5b5090506200587c919062005b3b565b5090565b82805482825590600052602060002090601f016020900481019282156200591b5791602002820160005b83821115620058ea57835183826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302620058aa565b8015620059195782816101000a81549060ff0219169055600101602081600001049283019260010302620058ea565b505b5090506200592a919062005b63565b5090565b82805482825590600052602060002090810192821562005982579160200282015b82811115620059815782518290805190602001906200597092919062005aaa565b50916020019190600101906200594f565b5b50905062005991919062005b3b565b5090565b82805482825590600052602060002090601f0160209004810192821562005a305791602002820160005b83821115620059ff57835183826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302620059bf565b801562005a2e5782816101000a81549060ff0219169055600101602081600001049283019260010302620059ff565b505b50905062005a3f919062005b63565b5090565b82805482825590600052602060002090810192821562005a97579160200282015b8281111562005a9657825182908051906020019062005a8592919062005aaa565b509160200191906001019062005a64565b5b50905062005aa6919062005b3b565b5090565b82805462005ab89062005bc8565b90600052602060002090601f01602090048101928262005adc576000855562005b28565b82601f1062005af757805160ff191683800117855562005b28565b8280016001018555821562005b28579182015b8281111562005b2757825182559160200191906001019062005b0a565b5b50905062005b37919062005b63565b5090565b5b8082111562005b5f576000818162005b55919062005b82565b5060010162005b3c565b5090565b5b8082111562005b7e57600081600090555060010162005b64565b5090565b50805462005b909062005bc8565b6000825580601f1062005ba4575062005bc5565b601f01602090049060005260206000209081019062005bc4919062005b63565b5b50565b6000600282049050600182168062005be157607f821691505b6020821081141562005bf85762005bf762005bfe565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6150668062005c3d6000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c80636352211e116100c3578063a22cb4651161007c578063a22cb465146103c7578063b88d4fde146103e3578063c87b56dd146103ff578063d5abeb011461042f578063e985e9c51461044d578063f2fde38b1461047d57610158565b80636352211e1461030357806370a0823114610333578063715018a6146103635780638da5cb5b1461036d57806395d89b411461038b5780639c2f2a42146103a957610158565b806323b872dd1161011557806323b872dd1461021f5780632f745c591461023b57806342842e0e1461026b578063434f48c4146102875780634378a6e3146102a35780634f6ccce7146102d357610158565b806301ffc9a71461015d57806306fdde031461018d578063081812fc146101ab578063095ea7b3146101db5780631249c58b146101f757806318160ddd14610201575b600080fd5b6101776004803603810190610172919061390f565b610499565b60405161018491906142e3565b60405180910390f35b610195610513565b6040516101a291906142fe565b60405180910390f35b6101c560048036038101906101c09190613969565b6105a5565b6040516101d2919061427c565b60405180910390f35b6101f560048036038101906101f091906138cf565b61062a565b005b6101ff610742565b005b610209610828565b6040516102169190614580565b60405180910390f35b610239600480360381019061023491906137b9565b610835565b005b610255600480360381019061025091906138cf565b610895565b6040516102629190614580565b60405180910390f35b610285600480360381019061028091906137b9565b61093a565b005b6102a1600480360381019061029c9190613969565b61095a565b005b6102bd60048036038101906102b89190613969565b610a91565b6040516102ca91906142fe565b60405180910390f35b6102ed60048036038101906102e89190613969565b610b74565b6040516102fa9190614580565b60405180910390f35b61031d60048036038101906103189190613969565b610be5565b60405161032a919061427c565b60405180910390f35b61034d6004803603810190610348919061374c565b610c97565b60405161035a9190614580565b60405180910390f35b61036b610d4f565b005b610375610dd7565b604051610382919061427c565b60405180910390f35b610393610e01565b6040516103a091906142fe565b60405180910390f35b6103b1610e93565b6040516103be9190614580565b60405180910390f35b6103e160048036038101906103dc919061388f565b610e99565b005b6103fd60048036038101906103f8919061380c565b61101a565b005b61041960048036038101906104149190613969565b61107c565b60405161042691906142fe565b60405180910390f35b610437611107565b6040516104449190614580565b60405180910390f35b61046760048036038101906104629190613779565b61110d565b60405161047491906142e3565b60405180910390f35b6104976004803603810190610492919061374c565b6111a1565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061050c575061050b82611299565b5b9050919050565b60606000805461052290614855565b80601f016020809104026020016040519081016040528092919081815260200182805461054e90614855565b801561059b5780601f106105705761010080835404028352916020019161059b565b820191906000526020600020905b81548152906001019060200180831161057e57829003601f168201915b5050505050905090565b60006105b08261137b565b6105ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e690614480565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061063582610be5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069d906144e0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106c56113e7565b73ffffffffffffffffffffffffffffffffffffffff1614806106f457506106f3816106ee6113e7565b61110d565b5b610733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072a90614400565b60405180910390fd5b61073d83836113ef565b505050565b6002600a541415610788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077f90614540565b60405180910390fd5b6002600a819055506000600c54101580156107a65750610d7a600c54105b6107e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107dc90614560565b60405180910390fd5b6108046107f06113e7565b6001600c546107ff9190614649565b6114a8565b6001600c60008282546108179190614649565b925050819055506001600a81905550565b6000600880549050905090565b6108466108406113e7565b826114c6565b610885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087c90614500565b60405180910390fd5b6108908383836115a4565b505050565b60006108a083610c97565b82106108e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d890614320565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6109558383836040518060200160405280600081525061101a565b505050565b6002600a5414156109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099790614540565b60405180910390fd5b6002600a819055506109b06113e7565b73ffffffffffffffffffffffffffffffffffffffff166109ce610dd7565b73ffffffffffffffffffffffffffffffffffffffff1614610a24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1b906144a0565b60405180910390fd5b610d7a81118015610a365750610dad81105b610a75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6c90614560565b60405180910390fd5b610a86610a80610dd7565b826114a8565b6001600a8190555050565b60606000610a9e83611800565b90506000610ab28260c0015160ff16611d80565b6043610ac4846020015160ff16611d80565b6043610ad68660a0015160ff16611d80565b6043604051602001610aed96959493929190613f40565b604051602081830303815290604052905080610b0f836040015160ff16611d80565b6043610b21856080015160ff16611d80565b6043610b33876060015160ff16611d80565b6043610b45896000015160ff16611d80565b604051602001610b5c989796959493929190613ded565b60405160208183030381529060405292505050919050565b6000610b7e610828565b8210610bbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb690614520565b60405180910390fd5b60088281548110610bd357610bd2614a18565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8590614440565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cff90614420565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d576113e7565b73ffffffffffffffffffffffffffffffffffffffff16610d75610dd7565b73ffffffffffffffffffffffffffffffffffffffff1614610dcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc2906144a0565b60405180910390fd5b610dd56000611ee1565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610e1090614855565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3c90614855565b8015610e895780601f10610e5e57610100808354040283529160200191610e89565b820191906000526020600020905b815481529060010190602001808311610e6c57829003601f168201915b5050505050905090565b600c5481565b610ea16113e7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f06906143c0565b60405180910390fd5b8060056000610f1c6113e7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610fc96113e7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161100e91906142e3565b60405180910390a35050565b61102b6110256113e7565b836114c6565b61106a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106190614500565b60405180910390fd5b61107684848484611fa7565b50505050565b6060600061108983611800565b905060466110df604461109b86611d80565b6110a485612003565b6110b56110b0876120de565b612736565b60456040516020016110cb9594939291906140c7565b604051602081830303815290604052612736565b6040516020016110f09291906140a3565b604051602081830303815290604052915050919050565b610dac81565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6111a96113e7565b73ffffffffffffffffffffffffffffffffffffffff166111c7610dd7565b73ffffffffffffffffffffffffffffffffffffffff161461121d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611214906144a0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561128d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128490614360565b60405180910390fd5b61129681611ee1565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061136457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806113745750611373826128ce565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661146283610be5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6114c2828260405180602001604052806000815250612938565b5050565b60006114d18261137b565b611510576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611507906143e0565b60405180910390fd5b600061151b83610be5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061158a57508373ffffffffffffffffffffffffffffffffffffffff16611572846105a5565b73ffffffffffffffffffffffffffffffffffffffff16145b8061159b575061159a818561110d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166115c482610be5565b73ffffffffffffffffffffffffffffffffffffffff161461161a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611611906144c0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561168a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611681906143a0565b60405180910390fd5b611695838383612993565b6116a06000826113ef565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116f0919061472a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117479190614649565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611808613621565b81613227611816919061472a565b9150611820613621565b6008611855603d61183086611d80565b6040516020016118419291906140a3565b604051602081830303815290604052612aa7565b61185f919061492b565b816000019060ff16908160ff168152505061192f60108054806020026020016040519081016040528092919081815260200182805480156118e557602002820191906000526020600020906000905b82829054906101000a900460ff1660ff16815260200190600101906020826000010492830192600103820291508084116118ae5790505b5050505050610719611920601f6118fb88611d80565b60405160200161190c9291906140a3565b604051602081830303815290604052612aa7565b61192a919061492b565b612ada565b816020019060ff16908160ff16815250506119ff60128054806020026020016040519081016040528092919081815260200182805480156119b557602002820191906000526020600020906000905b82829054906101000a900460ff1660ff168152602001906001019060208260000104928301926001038202915080841161197e5790505b50505050506105956119f0603e6119cb88611d80565b6040516020016119dc9291906140a3565b604051602081830303815290604052612aa7565b6119fa919061492b565b612ada565b816040019060ff16908160ff1681525050611acf6014805480602002602001604051908101604052809291908181526020018280548015611a8557602002820191906000526020600020906000905b82829054906101000a900460ff1660ff1681526020019060010190602082600001049283019260010382029150808411611a4e5790505b5050505050610458611ac0603f611a9b88611d80565b604051602001611aac9291906140a3565b604051602081830303815290604052612aa7565b611aca919061492b565b612ada565b816060019060ff16908160ff1681525050611b9f6016805480602002602001604051908101604052809291908181526020018280548015611b5557602002820191906000526020600020906000905b82829054906101000a900460ff1660ff1681526020019060010190602082600001049283019260010382029150808411611b1e5790505b5050505050610166611b906040611b6b88611d80565b604051602001611b7c9291906140a3565b604051602081830303815290604052612aa7565b611b9a919061492b565b612ada565b816080019060ff16908160ff1681525050611c6f6019805480602002602001604051908101604052809291908181526020018280548015611c2557602002820191906000526020600020906000905b82829054906101000a900460ff1660ff1681526020019060010190602082600001049283019260010382029150808411611bee5790505b5050505050610531611c606041611c3b88611d80565b604051602001611c4c9291906140a3565b604051602081830303815290604052612aa7565b611c6a919061492b565b612ada565b8160a0019060ff16908160ff1681525050611d3f601c805480602002602001604051908101604052809291908181526020018280548015611cf557602002820191906000526020600020906000905b82829054906101000a900460ff1660ff1681526020019060010190602082600001049283019260010382029150808411611cbe5790505b5050505050610457611d306042611d0b88611d80565b604051602001611d1c9291906140a3565b604051602081830303815290604052612aa7565b611d3a919061492b565b612ada565b8160c0019060ff16908160ff1681525050611ceb831415611d77578060c0018051809190611d6c90614901565b60ff1660ff16815250505b80915050919050565b60606000821415611dc8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611edc565b600082905060005b60008214611dfa578080611de3906148b8565b915050600a82611df3919061469f565b9150611dd0565b60008167ffffffffffffffff811115611e1657611e15614a47565b5b6040519080825280601f01601f191660200182016040528015611e485781602001600182028036833780820191505090505b5090505b60008514611ed557600182611e61919061472a565b9150600a85611e70919061492b565b6030611e7c9190614649565b60f81b818381518110611e9257611e91614a18565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611ece919061469f565b9450611e4c565b8093505050505b919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611fb28484846115a4565b611fbe84848484612b58565b611ffd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff490614340565b60405180910390fd5b50505050565b606060006035612019846000015160ff16611d80565b603661202b866020015160ff16611d80565b603761203d886080015160ff16611d80565b6040516020016120529695949392919061415d565b60405160208183030381529060405290508060386120768560c0015160ff16611d80565b6039612088876040015160ff16611d80565b603a61209a8960a0015160ff16611d80565b603b6120ac8b6060015160ff16611d80565b603c6040516020016120c79a99989796959493929190613f98565b604051602081830303815290604052915050919050565b60606000600e836020015160ff16815481106120fd576120fc614a18565b5b90600052602060002001805461211290614855565b80601f016020809104026020016040519081016040528092919081815260200182805461213e90614855565b801561218b5780601f106121605761010080835404028352916020019161218b565b820191906000526020600020905b81548152906001019060200180831161216e57829003601f168201915b505050505090506000600f846020015160ff16815481106121af576121ae614a18565b5b9060005260206000200180546121c490614855565b80601f01602080910402602001604051908101604052809291908181526020018280546121f090614855565b801561223d5780601f106122125761010080835404028352916020019161223d565b820191906000526020600020905b81548152906001019060200180831161222057829003601f168201915b505050505090506000604051806020016040528060008152509050600060405180602001604052806000815250905060008660a0015160ff16111561230a57601f601760018860a00151612291919061475e565b60ff16815481106122a5576122a4614a18565b5b906000526020600020016020601860018a60a001516122c4919061475e565b60ff16815481106122d8576122d7614a18565b5b9060005260206000200160296040516020016122f8959493929190614231565b60405160208183030381529060405290505b60008660c0015160ff1611156123a8576021601a60018860c0015161232f919061475e565b60ff168154811061234357612342614a18565b5b906000526020600020016022601b60018a60c00151612362919061475e565b60ff168154811061237657612375614a18565b5b906000526020600020016029604051602001612396959493929190614231565b60405160208183030381529060405291505b6000601d6000815481106123bf576123be614a18565b5b90600052602060002001600d886000015160ff16815481106123e4576123e3614a18565b5b90600052602060002001601d60018154811061240357612402614a18565b5b9060005260206000200186601d60028154811061242357612422614a18565b5b906000526020600020016040516020016124419594939291906141e6565b60405160208183030381529060405290508085601d60038154811061246957612468614a18565b5b9060005260206000200187601d60048154811061248957612488614a18565b5b9060005260206000200188601d6005815481106124a9576124a8614a18565b5b906000526020600020018b601d6006815481106124c9576124c8614a18565b5b906000526020600020016040516020016124eb99989796959493929190613e5f565b60405160208183030381529060405290508084601d60078154811061251357612512614a18565b5b9060005260206000200187601d60088154811061253357612532614a18565b5b9060005260206000200188601d60098154811061255357612552614a18565b5b906000526020600020018b601d600a8154811061257357612572614a18565b5b9060005260206000200160405160200161259599989796959493929190613e5f565b6040516020818303038152906040529050806011886040015160ff16815481106125c2576125c1614a18565b5b90600052602060002001601d600b815481106125e1576125e0614a18565b5b9060005260206000200160118a6040015160ff168154811061260657612605614a18565b5b90600052602060002001601d600c8154811061262557612624614a18565b5b9060005260206000200161263e8a8a8e60400151612cef565b601d600d8154811061265357612652614a18565b5b9060005260206000200160138e6060015160ff168154811061267857612677614a18565b5b90600052602060002001601d600e8154811061269757612696614a18565b5b906000526020600020016040516020016126b999989796959493929190614024565b6040516020818303038152906040529050806126d88860600151612dbd565b6126e58960800151612f5b565b8585601d600f815481106126fc576126fb614a18565b5b9060005260206000200160405160200161271b96959493929190613d95565b60405160208183030381529060405295505050505050919050565b6060600082519050600081141561275f57604051806020016040528060008152509150506128c9565b600060036002836127709190614649565b61277a919061469f565b600461278691906146d0565b905060006020826127979190614649565b67ffffffffffffffff8111156127b0576127af614a47565b5b6040519080825280601f01601f1916602001820160405280156127e25781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001614ff1604091399050600181016020830160005b868110156128865760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b9050808452600484019350505061280d565b5060038606600181146128a057600281146128b0576128bb565b613d3d60f01b60028303526128bb565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6129428383613135565b61294f6000848484612b58565b61298e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298590614340565b60405180910390fd5b505050565b61299e838383613303565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129e1576129dc81613308565b612a20565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612a1f57612a1e8382613351565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a6357612a5e816134be565b612aa2565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612aa157612aa0828261358f565b5b5b505050565b600081604051602001612aba9190613d7e565b6040516020818303038152906040528051906020012060001c9050919050565b60008060009050600084600081518110612af757612af6614a18565b5b602002602001015160ff1690505b838111612b4d578180612b1790614901565b925050848260ff1681518110612b3057612b2f614a18565b5b602002602001015160ff1681612b469190614649565b9050612b05565b819250505092915050565b6000612b798473ffffffffffffffffffffffffffffffffffffffff1661360e565b15612ce2578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ba26113e7565b8786866040518563ffffffff1660e01b8152600401612bc49493929190614297565b602060405180830381600087803b158015612bde57600080fd5b505af1925050508015612c0f57506040513d601f19601f82011682018060405250810190612c0c919061393c565b60015b612c92573d8060008114612c3f576040519150601f19603f3d011682016040523d82523d6000602084013e612c44565b606091505b50600081511415612c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8190614340565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ce7565b600190505b949350505050565b6060600060405180602001604052806000815250905060048360ff161115612d3f576023856024876029604051602001612d2d959493929190614112565b60405160208183030381529060405290505b600a8360ff161115612d7b57806026856027876029604051602001612d6996959493929190613f40565b60405160208183030381529060405290505b60108360ff161115612db257806028866029604051602001612da09493929190613f02565b60405160208183030381529060405290505b809150509392505050565b60606000604051806020016040528060008152509050600060188460ff161180612df9575060088460ff16118015612df8575060108460ff16105b5b15612f1f57600090505b6007811015612e8e57816030612e30601984612e1f91906146d0565b60af612e2b9190614649565b611d80565b6031612e53601986612e4291906146d0565b60af612e4e9190614649565b611d80565b6032604051602001612e6a96959493929190613f40565b60405160208183030381529060405291508080612e86906148b8565b915050612e03565b600090505b6006811015612f1e57816030612ec0601984612eaf91906146d0565b60bb612ebb9190614649565b611d80565b6033612ee3601986612ed291906146d0565b60bb612ede9190614649565b611d80565b6034604051602001612efa96959493929190613f40565b60405160208183030381529060405291508080612f16906148b8565b915050612e93565b5b600f8460ff161115612f5157816025604051602001612f3f929190613ede565b60405160208183030381529060405291505b8192505050919050565b606060008260ff161415612f8057604051806020016040528060008152509050613130565b60038260ff161015612ff45760018260ff161115612fc657602a602b602d604051602001612fb0939291906141b5565b6040516020818303038152906040529050613130565b602a602c602d604051602001612fde939291906141b5565b6040516020818303038152906040529050613130565b60038260ff1611156130a25760058260ff16111561303a57602e602f6029604051602001613024939291906141b5565b6040516020818303038152906040529050613130565b60048260ff16111561307457602e602b602960405160200161305e939291906141b5565b6040516020818303038152906040529050613130565b602e602c602960405160200161308c939291906141b5565b6040516020818303038152906040529050613130565b601e80546130af90614855565b80601f01602080910402602001604051908101604052809291908181526020018280546130db90614855565b80156131285780601f106130fd57610100808354040283529160200191613128565b820191906000526020600020905b81548152906001019060200180831161310b57829003601f168201915b505050505090505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319c90614460565b60405180910390fd5b6131ae8161137b565b156131ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131e590614380565b60405180910390fd5b6131fa60008383612993565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461324a9190614649565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161335e84610c97565b613368919061472a565b905060006007600084815260200190815260200160002054905081811461344d576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506134d2919061472a565b905060006009600084815260200190815260200160002054905060006008838154811061350257613501614a18565b5b90600052602060002001549050806008838154811061352457613523614a18565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613573576135726149e9565b5b6001900381819060005260206000200160009055905550505050565b600061359a83610c97565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b6040518060e00160405280600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff1681525090565b6000613686613681846145c0565b61459b565b9050828152602081018484840111156136a2576136a1614a7b565b5b6136ad848285614813565b509392505050565b6000813590506136c481614f94565b92915050565b6000813590506136d981614fab565b92915050565b6000813590506136ee81614fc2565b92915050565b60008151905061370381614fc2565b92915050565b600082601f83011261371e5761371d614a76565b5b813561372e848260208601613673565b91505092915050565b60008135905061374681614fd9565b92915050565b60006020828403121561376257613761614a85565b5b6000613770848285016136b5565b91505092915050565b600080604083850312156137905761378f614a85565b5b600061379e858286016136b5565b92505060206137af858286016136b5565b9150509250929050565b6000806000606084860312156137d2576137d1614a85565b5b60006137e0868287016136b5565b93505060206137f1868287016136b5565b925050604061380286828701613737565b9150509250925092565b6000806000806080858703121561382657613825614a85565b5b6000613834878288016136b5565b9450506020613845878288016136b5565b935050604061385687828801613737565b925050606085013567ffffffffffffffff81111561387757613876614a80565b5b61388387828801613709565b91505092959194509250565b600080604083850312156138a6576138a5614a85565b5b60006138b4858286016136b5565b92505060206138c5858286016136ca565b9150509250929050565b600080604083850312156138e6576138e5614a85565b5b60006138f4858286016136b5565b925050602061390585828601613737565b9150509250929050565b60006020828403121561392557613924614a85565b5b6000613933848285016136df565b91505092915050565b60006020828403121561395257613951614a85565b5b6000613960848285016136f4565b91505092915050565b60006020828403121561397f5761397e614a85565b5b600061398d84828501613737565b91505092915050565b61399f81614792565b82525050565b6139ae816147a4565b82525050565b60006139bf82614606565b6139c9818561461c565b93506139d9818560208601614822565b6139e281614a8a565b840191505092915050565b60006139f882614611565b613a02818561462d565b9350613a12818560208601614822565b613a1b81614a8a565b840191505092915050565b6000613a3182614611565b613a3b818561463e565b9350613a4b818560208601614822565b80840191505092915050565b60008154613a6481614855565b613a6e818661463e565b94506001821660008114613a895760018114613a9a57613acd565b60ff19831686528186019350613acd565b613aa3856145f1565b60005b83811015613ac557815481890152600182019150602081019050613aa6565b838801955050505b50505092915050565b6000613ae3602b8361462d565b9150613aee82614a9b565b604082019050919050565b6000613b0660328361462d565b9150613b1182614aea565b604082019050919050565b6000613b2960268361462d565b9150613b3482614b39565b604082019050919050565b6000613b4c601c8361462d565b9150613b5782614b88565b602082019050919050565b6000613b6f60248361462d565b9150613b7a82614bb1565b604082019050919050565b6000613b9260198361462d565b9150613b9d82614c00565b602082019050919050565b6000613bb5602c8361462d565b9150613bc082614c29565b604082019050919050565b6000613bd860388361462d565b9150613be382614c78565b604082019050919050565b6000613bfb602a8361462d565b9150613c0682614cc7565b604082019050919050565b6000613c1e60298361462d565b9150613c2982614d16565b604082019050919050565b6000613c4160208361462d565b9150613c4c82614d65565b602082019050919050565b6000613c64602c8361462d565b9150613c6f82614d8e565b604082019050919050565b6000613c8760208361462d565b9150613c9282614ddd565b602082019050919050565b6000613caa60298361462d565b9150613cb582614e06565b604082019050919050565b6000613ccd60218361462d565b9150613cd882614e55565b604082019050919050565b6000613cf060318361462d565b9150613cfb82614ea4565b604082019050919050565b6000613d13602c8361462d565b9150613d1e82614ef3565b604082019050919050565b6000613d36601f8361462d565b9150613d4182614f42565b602082019050919050565b6000613d59600c8361462d565b9150613d6482614f6b565b602082019050919050565b613d78816147fc565b82525050565b6000613d8a8284613a26565b915081905092915050565b6000613da18289613a26565b9150613dad8288613a26565b9150613db98287613a26565b9150613dc58286613a26565b9150613dd18285613a26565b9150613ddd8284613a57565b9150819050979650505050505050565b6000613df9828b613a26565b9150613e05828a613a26565b9150613e118289613a57565b9150613e1d8288613a26565b9150613e298287613a57565b9150613e358286613a26565b9150613e418285613a57565b9150613e4d8284613a26565b91508190509998505050505050505050565b6000613e6b828c613a26565b9150613e77828b613a26565b9150613e83828a613a57565b9150613e8f8289613a26565b9150613e9b8288613a57565b9150613ea78287613a26565b9150613eb38286613a57565b9150613ebf8285613a26565b9150613ecb8284613a57565b91508190509a9950505050505050505050565b6000613eea8285613a26565b9150613ef68284613a57565b91508190509392505050565b6000613f0e8287613a26565b9150613f1a8286613a57565b9150613f268285613a26565b9150613f328284613a57565b915081905095945050505050565b6000613f4c8289613a26565b9150613f588288613a57565b9150613f648287613a26565b9150613f708286613a57565b9150613f7c8285613a26565b9150613f888284613a57565b9150819050979650505050505050565b6000613fa4828d613a26565b9150613fb0828c613a57565b9150613fbc828b613a26565b9150613fc8828a613a57565b9150613fd48289613a26565b9150613fe08288613a57565b9150613fec8287613a26565b9150613ff88286613a57565b91506140048285613a26565b91506140108284613a57565b91508190509b9a5050505050505050505050565b6000614030828c613a26565b915061403c828b613a57565b9150614048828a613a57565b91506140548289613a57565b91506140608288613a57565b915061406c8287613a26565b91506140788286613a57565b91506140848285613a57565b91506140908284613a57565b91508190509a9950505050505050505050565b60006140af8285613a57565b91506140bb8284613a26565b91508190509392505050565b60006140d38288613a57565b91506140df8287613a26565b91506140eb8286613a26565b91506140f78285613a26565b91506141038284613a57565b91508190509695505050505050565b600061411e8288613a57565b915061412a8287613a26565b91506141368286613a57565b91506141428285613a26565b915061414e8284613a57565b91508190509695505050505050565b60006141698289613a57565b91506141758288613a26565b91506141818287613a57565b915061418d8286613a26565b91506141998285613a57565b91506141a58284613a26565b9150819050979650505050505050565b60006141c18286613a57565b91506141cd8285613a57565b91506141d98284613a57565b9150819050949350505050565b60006141f28288613a57565b91506141fe8287613a57565b915061420a8286613a57565b91506142168285613a26565b91506142228284613a57565b91508190509695505050505050565b600061423d8288613a57565b91506142498287613a57565b91506142558286613a57565b91506142618285613a57565b915061426d8284613a57565b91508190509695505050505050565b60006020820190506142916000830184613996565b92915050565b60006080820190506142ac6000830187613996565b6142b96020830186613996565b6142c66040830185613d6f565b81810360608301526142d881846139b4565b905095945050505050565b60006020820190506142f860008301846139a5565b92915050565b6000602082019050818103600083015261431881846139ed565b905092915050565b6000602082019050818103600083015261433981613ad6565b9050919050565b6000602082019050818103600083015261435981613af9565b9050919050565b6000602082019050818103600083015261437981613b1c565b9050919050565b6000602082019050818103600083015261439981613b3f565b9050919050565b600060208201905081810360008301526143b981613b62565b9050919050565b600060208201905081810360008301526143d981613b85565b9050919050565b600060208201905081810360008301526143f981613ba8565b9050919050565b6000602082019050818103600083015261441981613bcb565b9050919050565b6000602082019050818103600083015261443981613bee565b9050919050565b6000602082019050818103600083015261445981613c11565b9050919050565b6000602082019050818103600083015261447981613c34565b9050919050565b6000602082019050818103600083015261449981613c57565b9050919050565b600060208201905081810360008301526144b981613c7a565b9050919050565b600060208201905081810360008301526144d981613c9d565b9050919050565b600060208201905081810360008301526144f981613cc0565b9050919050565b6000602082019050818103600083015261451981613ce3565b9050919050565b6000602082019050818103600083015261453981613d06565b9050919050565b6000602082019050818103600083015261455981613d29565b9050919050565b6000602082019050818103600083015261457981613d4c565b9050919050565b60006020820190506145956000830184613d6f565b92915050565b60006145a56145b6565b90506145b18282614887565b919050565b6000604051905090565b600067ffffffffffffffff8211156145db576145da614a47565b5b6145e482614a8a565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614654826147fc565b915061465f836147fc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146945761469361495c565b5b828201905092915050565b60006146aa826147fc565b91506146b5836147fc565b9250826146c5576146c461498b565b5b828204905092915050565b60006146db826147fc565b91506146e6836147fc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561471f5761471e61495c565b5b828202905092915050565b6000614735826147fc565b9150614740836147fc565b9250828210156147535761475261495c565b5b828203905092915050565b600061476982614806565b915061477483614806565b9250828210156147875761478661495c565b5b828203905092915050565b600061479d826147dc565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614840578082015181840152602081019050614825565b8381111561484f576000848401525b50505050565b6000600282049050600182168061486d57607f821691505b60208210811415614881576148806149ba565b5b50919050565b61489082614a8a565b810181811067ffffffffffffffff821117156148af576148ae614a47565b5b80604052505050565b60006148c3826147fc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148f6576148f561495c565b5b600182019050919050565b600061490c82614806565b915060ff8214156149205761491f61495c565b5b600182019050919050565b6000614936826147fc565b9150614941836147fc565b9250826149515761495061498b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f696e76616c6964206d696e740000000000000000000000000000000000000000600082015250565b614f9d81614792565b8114614fa857600080fd5b50565b614fb4816147a4565b8114614fbf57600080fd5b50565b614fcb816147b0565b8114614fd657600080fd5b50565b614fe2816147fc565b8114614fed57600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220fc8fdabeaf2cd333afc0d775998445dfdb46f80806e5c5cd20b20835b0faaf4d64736f6c63430008070033227d5d2c22696d616765223a2022646174613a696d6167652f7376672b786d6c3b6261736536342c222c202261747472696275746573223a205b7b2274726169745f74797065223a20224261636b67726f756e64222c2276616c7565223a2022222f3e3c636972636c652063783d22313930222063793d223437302220723d223522207374796c653d2266696c6c3a23222f3e3c636972636c652063783d22333030222063793d223232302220723d22323022207374796c653d2266696c6c3a23222f3e3c636972636c652063783d22323030222063793d223231352220723d22333522207374796c653d2266696c6c3a23666666222f3e3c636972636c652063783d22333035222063793d223232322220723d22333122207374796c653d2266696c6c3a23666666222f3e3c636972636c652063783d22323030222063793d223232302220723d22323022207374796c653d2266696c6c3a23222f3e3c636972636c652063783d22343030222063793d223235302220723d22353022207374796c653d2266696c6c3a233c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302035303020353030223e3c7265637420783d22302220793d2230222077696474683d2235303022206865696768743d2235303022207374796c653d2266696c6c3a23227d2c7b2274726169745f74797065223a20224d6f757468222c2276616c7565223a2022227d2c7b2274726169745f74797065223a2022467572222c2276616c7565223a2022222f3e3c636972636c652063783d22313030222063793d223239302220723d223422207374796c653d2266696c6c3a23303030222f3e3c726563742077696474683d2233303022206865696768743d223132302220783d2239392220793d2234303022207374796c653d2266696c6c3a23222f3e3c636972636c652063783d22313030222063793d223235302220723d22323022207374796c653d2266696c6c3a23222f3e3c726563742077696474683d22353022206865696768743d2235352220783d223238302220793d2234333022207374796c653d2266696c6c3a233c7265637420783d2239352220793d22323735222077696474683d22313022206865696768743d22343022207374796c653d2266696c6c3a23383732222f3e3c7265637420783d2238352220793d22323835222077696474683d22333022206865696768743d22313022207374796c653d2266696c6c3a23383732222f3e3c7265637420783d223135302220793d22313930222077696474683d2232303022206865696768743d22333022207374796c653d2266696c6c3a23222f3e3c636972636c652063783d22323530222063793d223235302220723d2231353022207374796c653d2266696c6c3a233c6c696e652078313d22323837222079313d22333331222078323d22333230222079323d2233363622207374796c653d227374726f6b653a233030303b7374726f6b652d77696474683a35222f3e227d2c7b2274726169745f74797065223a202245796573222c2276616c7565223a2022222f3e3c636972636c652063783d22313030222063793d223235302220723d22353022207374796c653d2266696c6c3a23222f3e3c636972636c652063783d22333130222063793d223437302220723d223522207374796c653d2266696c6c3a23222079323d2233323222207374796c653d227374726f6b653a233030303b7374726f6b652d77696474683a32222f3e227d2c7b2274726169745f74797065223a2022436c6f74686573222c2276616c7565223a2022222f3e3c636972636c652063783d22323030222063793d223232302220723d223722207374796c653d2266696c6c3a23303030222f3e3c636972636c652063783d22333030222063793d223232302220723d223722207374796c653d2266696c6c3a23303030222f3e222f3e3c726563742077696474683d2233303022206865696768743d223132302220783d2239392220793d2234303022207374796c653d2266696c6c3a23222f3e3c7265637420783d223139352220793d22333330222077696474683d2231313022206865696768743d223322207374796c653d2266696c6c3a23303030222f3e3c636972636c652063783d22323638222063793d223239352220723d223522207374796c653d2266696c6c3a23303030222f3e3c636972636c652063783d22323332222063793d223239352220723d223522207374796c653d2266696c6c3a23303030222f3e3c726563742077696474683d2232303022206865696768743d2239392220783d223135302220793d22343022207374796c653d2266696c6c3a23222f3e3c726563742077696474683d2232303022206865696768743d2233332220783d223135302220793d2231303622207374796c653d2266696c6c3a233c656c6c697073652063783d22323530222063793d22333135222072783d223834222072793d22333422207374796c653d2266696c6c3a233c7265637420783d223136302220793d22313930222077696474683d22373522206865696768743d22313522207374796c653d2266696c6c3a23222f3e3c7265637420783d223136302220793d22313730222077696474683d2231383022206865696768743d22353022207374796c653d2266696c6c3a23227d2c7b2274726169745f74797065223a2022486174222c2276616c7565223a2022222f3e3c7265637420783d223237352220793d22313930222077696474683d22363522206865696768743d22313522207374796c653d2266696c6c3a23227d2c7b2274726169745f74797065223a202245617272696e67222c2276616c7565223a2022222079323d2233313222207374796c653d227374726f6b653a233030303b7374726f6b652d77696474683a32222f3e222f3e3c636972636c652063783d22343030222063793d223235302220723d22323022207374796c653d2266696c6c3a23222f3e3c636972636c652063783d22323530222063793d223235302220723d2231323022207374796c653d2266696c6c3a233c636972636c652063783d22313030222063793d223239302220723d22313422207374796c653d2266696c6c3a233c636972636c652063783d22313030222063793d223239302220723d22313222207374796c653d2266696c6c3a233c7265637420783d223136302220793d22323335222077696474683d2231383022206865696768743d22353022207374796c653d2266696c6c3a23

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101585760003560e01c80636352211e116100c3578063a22cb4651161007c578063a22cb465146103c7578063b88d4fde146103e3578063c87b56dd146103ff578063d5abeb011461042f578063e985e9c51461044d578063f2fde38b1461047d57610158565b80636352211e1461030357806370a0823114610333578063715018a6146103635780638da5cb5b1461036d57806395d89b411461038b5780639c2f2a42146103a957610158565b806323b872dd1161011557806323b872dd1461021f5780632f745c591461023b57806342842e0e1461026b578063434f48c4146102875780634378a6e3146102a35780634f6ccce7146102d357610158565b806301ffc9a71461015d57806306fdde031461018d578063081812fc146101ab578063095ea7b3146101db5780631249c58b146101f757806318160ddd14610201575b600080fd5b6101776004803603810190610172919061390f565b610499565b60405161018491906142e3565b60405180910390f35b610195610513565b6040516101a291906142fe565b60405180910390f35b6101c560048036038101906101c09190613969565b6105a5565b6040516101d2919061427c565b60405180910390f35b6101f560048036038101906101f091906138cf565b61062a565b005b6101ff610742565b005b610209610828565b6040516102169190614580565b60405180910390f35b610239600480360381019061023491906137b9565b610835565b005b610255600480360381019061025091906138cf565b610895565b6040516102629190614580565b60405180910390f35b610285600480360381019061028091906137b9565b61093a565b005b6102a1600480360381019061029c9190613969565b61095a565b005b6102bd60048036038101906102b89190613969565b610a91565b6040516102ca91906142fe565b60405180910390f35b6102ed60048036038101906102e89190613969565b610b74565b6040516102fa9190614580565b60405180910390f35b61031d60048036038101906103189190613969565b610be5565b60405161032a919061427c565b60405180910390f35b61034d6004803603810190610348919061374c565b610c97565b60405161035a9190614580565b60405180910390f35b61036b610d4f565b005b610375610dd7565b604051610382919061427c565b60405180910390f35b610393610e01565b6040516103a091906142fe565b60405180910390f35b6103b1610e93565b6040516103be9190614580565b60405180910390f35b6103e160048036038101906103dc919061388f565b610e99565b005b6103fd60048036038101906103f8919061380c565b61101a565b005b61041960048036038101906104149190613969565b61107c565b60405161042691906142fe565b60405180910390f35b610437611107565b6040516104449190614580565b60405180910390f35b61046760048036038101906104629190613779565b61110d565b60405161047491906142e3565b60405180910390f35b6104976004803603810190610492919061374c565b6111a1565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061050c575061050b82611299565b5b9050919050565b60606000805461052290614855565b80601f016020809104026020016040519081016040528092919081815260200182805461054e90614855565b801561059b5780601f106105705761010080835404028352916020019161059b565b820191906000526020600020905b81548152906001019060200180831161057e57829003601f168201915b5050505050905090565b60006105b08261137b565b6105ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e690614480565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061063582610be5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069d906144e0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106c56113e7565b73ffffffffffffffffffffffffffffffffffffffff1614806106f457506106f3816106ee6113e7565b61110d565b5b610733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072a90614400565b60405180910390fd5b61073d83836113ef565b505050565b6002600a541415610788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077f90614540565b60405180910390fd5b6002600a819055506000600c54101580156107a65750610d7a600c54105b6107e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107dc90614560565b60405180910390fd5b6108046107f06113e7565b6001600c546107ff9190614649565b6114a8565b6001600c60008282546108179190614649565b925050819055506001600a81905550565b6000600880549050905090565b6108466108406113e7565b826114c6565b610885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087c90614500565b60405180910390fd5b6108908383836115a4565b505050565b60006108a083610c97565b82106108e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d890614320565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6109558383836040518060200160405280600081525061101a565b505050565b6002600a5414156109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099790614540565b60405180910390fd5b6002600a819055506109b06113e7565b73ffffffffffffffffffffffffffffffffffffffff166109ce610dd7565b73ffffffffffffffffffffffffffffffffffffffff1614610a24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1b906144a0565b60405180910390fd5b610d7a81118015610a365750610dad81105b610a75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6c90614560565b60405180910390fd5b610a86610a80610dd7565b826114a8565b6001600a8190555050565b60606000610a9e83611800565b90506000610ab28260c0015160ff16611d80565b6043610ac4846020015160ff16611d80565b6043610ad68660a0015160ff16611d80565b6043604051602001610aed96959493929190613f40565b604051602081830303815290604052905080610b0f836040015160ff16611d80565b6043610b21856080015160ff16611d80565b6043610b33876060015160ff16611d80565b6043610b45896000015160ff16611d80565b604051602001610b5c989796959493929190613ded565b60405160208183030381529060405292505050919050565b6000610b7e610828565b8210610bbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb690614520565b60405180910390fd5b60088281548110610bd357610bd2614a18565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8590614440565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cff90614420565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d576113e7565b73ffffffffffffffffffffffffffffffffffffffff16610d75610dd7565b73ffffffffffffffffffffffffffffffffffffffff1614610dcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc2906144a0565b60405180910390fd5b610dd56000611ee1565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610e1090614855565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3c90614855565b8015610e895780601f10610e5e57610100808354040283529160200191610e89565b820191906000526020600020905b815481529060010190602001808311610e6c57829003601f168201915b5050505050905090565b600c5481565b610ea16113e7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f06906143c0565b60405180910390fd5b8060056000610f1c6113e7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610fc96113e7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161100e91906142e3565b60405180910390a35050565b61102b6110256113e7565b836114c6565b61106a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106190614500565b60405180910390fd5b61107684848484611fa7565b50505050565b6060600061108983611800565b905060466110df604461109b86611d80565b6110a485612003565b6110b56110b0876120de565b612736565b60456040516020016110cb9594939291906140c7565b604051602081830303815290604052612736565b6040516020016110f09291906140a3565b604051602081830303815290604052915050919050565b610dac81565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6111a96113e7565b73ffffffffffffffffffffffffffffffffffffffff166111c7610dd7565b73ffffffffffffffffffffffffffffffffffffffff161461121d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611214906144a0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561128d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128490614360565b60405180910390fd5b61129681611ee1565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061136457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806113745750611373826128ce565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661146283610be5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6114c2828260405180602001604052806000815250612938565b5050565b60006114d18261137b565b611510576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611507906143e0565b60405180910390fd5b600061151b83610be5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061158a57508373ffffffffffffffffffffffffffffffffffffffff16611572846105a5565b73ffffffffffffffffffffffffffffffffffffffff16145b8061159b575061159a818561110d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166115c482610be5565b73ffffffffffffffffffffffffffffffffffffffff161461161a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611611906144c0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561168a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611681906143a0565b60405180910390fd5b611695838383612993565b6116a06000826113ef565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116f0919061472a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117479190614649565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611808613621565b81613227611816919061472a565b9150611820613621565b6008611855603d61183086611d80565b6040516020016118419291906140a3565b604051602081830303815290604052612aa7565b61185f919061492b565b816000019060ff16908160ff168152505061192f60108054806020026020016040519081016040528092919081815260200182805480156118e557602002820191906000526020600020906000905b82829054906101000a900460ff1660ff16815260200190600101906020826000010492830192600103820291508084116118ae5790505b5050505050610719611920601f6118fb88611d80565b60405160200161190c9291906140a3565b604051602081830303815290604052612aa7565b61192a919061492b565b612ada565b816020019060ff16908160ff16815250506119ff60128054806020026020016040519081016040528092919081815260200182805480156119b557602002820191906000526020600020906000905b82829054906101000a900460ff1660ff168152602001906001019060208260000104928301926001038202915080841161197e5790505b50505050506105956119f0603e6119cb88611d80565b6040516020016119dc9291906140a3565b604051602081830303815290604052612aa7565b6119fa919061492b565b612ada565b816040019060ff16908160ff1681525050611acf6014805480602002602001604051908101604052809291908181526020018280548015611a8557602002820191906000526020600020906000905b82829054906101000a900460ff1660ff1681526020019060010190602082600001049283019260010382029150808411611a4e5790505b5050505050610458611ac0603f611a9b88611d80565b604051602001611aac9291906140a3565b604051602081830303815290604052612aa7565b611aca919061492b565b612ada565b816060019060ff16908160ff1681525050611b9f6016805480602002602001604051908101604052809291908181526020018280548015611b5557602002820191906000526020600020906000905b82829054906101000a900460ff1660ff1681526020019060010190602082600001049283019260010382029150808411611b1e5790505b5050505050610166611b906040611b6b88611d80565b604051602001611b7c9291906140a3565b604051602081830303815290604052612aa7565b611b9a919061492b565b612ada565b816080019060ff16908160ff1681525050611c6f6019805480602002602001604051908101604052809291908181526020018280548015611c2557602002820191906000526020600020906000905b82829054906101000a900460ff1660ff1681526020019060010190602082600001049283019260010382029150808411611bee5790505b5050505050610531611c606041611c3b88611d80565b604051602001611c4c9291906140a3565b604051602081830303815290604052612aa7565b611c6a919061492b565b612ada565b8160a0019060ff16908160ff1681525050611d3f601c805480602002602001604051908101604052809291908181526020018280548015611cf557602002820191906000526020600020906000905b82829054906101000a900460ff1660ff1681526020019060010190602082600001049283019260010382029150808411611cbe5790505b5050505050610457611d306042611d0b88611d80565b604051602001611d1c9291906140a3565b604051602081830303815290604052612aa7565b611d3a919061492b565b612ada565b8160c0019060ff16908160ff1681525050611ceb831415611d77578060c0018051809190611d6c90614901565b60ff1660ff16815250505b80915050919050565b60606000821415611dc8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611edc565b600082905060005b60008214611dfa578080611de3906148b8565b915050600a82611df3919061469f565b9150611dd0565b60008167ffffffffffffffff811115611e1657611e15614a47565b5b6040519080825280601f01601f191660200182016040528015611e485781602001600182028036833780820191505090505b5090505b60008514611ed557600182611e61919061472a565b9150600a85611e70919061492b565b6030611e7c9190614649565b60f81b818381518110611e9257611e91614a18565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611ece919061469f565b9450611e4c565b8093505050505b919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611fb28484846115a4565b611fbe84848484612b58565b611ffd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff490614340565b60405180910390fd5b50505050565b606060006035612019846000015160ff16611d80565b603661202b866020015160ff16611d80565b603761203d886080015160ff16611d80565b6040516020016120529695949392919061415d565b60405160208183030381529060405290508060386120768560c0015160ff16611d80565b6039612088876040015160ff16611d80565b603a61209a8960a0015160ff16611d80565b603b6120ac8b6060015160ff16611d80565b603c6040516020016120c79a99989796959493929190613f98565b604051602081830303815290604052915050919050565b60606000600e836020015160ff16815481106120fd576120fc614a18565b5b90600052602060002001805461211290614855565b80601f016020809104026020016040519081016040528092919081815260200182805461213e90614855565b801561218b5780601f106121605761010080835404028352916020019161218b565b820191906000526020600020905b81548152906001019060200180831161216e57829003601f168201915b505050505090506000600f846020015160ff16815481106121af576121ae614a18565b5b9060005260206000200180546121c490614855565b80601f01602080910402602001604051908101604052809291908181526020018280546121f090614855565b801561223d5780601f106122125761010080835404028352916020019161223d565b820191906000526020600020905b81548152906001019060200180831161222057829003601f168201915b505050505090506000604051806020016040528060008152509050600060405180602001604052806000815250905060008660a0015160ff16111561230a57601f601760018860a00151612291919061475e565b60ff16815481106122a5576122a4614a18565b5b906000526020600020016020601860018a60a001516122c4919061475e565b60ff16815481106122d8576122d7614a18565b5b9060005260206000200160296040516020016122f8959493929190614231565b60405160208183030381529060405290505b60008660c0015160ff1611156123a8576021601a60018860c0015161232f919061475e565b60ff168154811061234357612342614a18565b5b906000526020600020016022601b60018a60c00151612362919061475e565b60ff168154811061237657612375614a18565b5b906000526020600020016029604051602001612396959493929190614231565b60405160208183030381529060405291505b6000601d6000815481106123bf576123be614a18565b5b90600052602060002001600d886000015160ff16815481106123e4576123e3614a18565b5b90600052602060002001601d60018154811061240357612402614a18565b5b9060005260206000200186601d60028154811061242357612422614a18565b5b906000526020600020016040516020016124419594939291906141e6565b60405160208183030381529060405290508085601d60038154811061246957612468614a18565b5b9060005260206000200187601d60048154811061248957612488614a18565b5b9060005260206000200188601d6005815481106124a9576124a8614a18565b5b906000526020600020018b601d6006815481106124c9576124c8614a18565b5b906000526020600020016040516020016124eb99989796959493929190613e5f565b60405160208183030381529060405290508084601d60078154811061251357612512614a18565b5b9060005260206000200187601d60088154811061253357612532614a18565b5b9060005260206000200188601d60098154811061255357612552614a18565b5b906000526020600020018b601d600a8154811061257357612572614a18565b5b9060005260206000200160405160200161259599989796959493929190613e5f565b6040516020818303038152906040529050806011886040015160ff16815481106125c2576125c1614a18565b5b90600052602060002001601d600b815481106125e1576125e0614a18565b5b9060005260206000200160118a6040015160ff168154811061260657612605614a18565b5b90600052602060002001601d600c8154811061262557612624614a18565b5b9060005260206000200161263e8a8a8e60400151612cef565b601d600d8154811061265357612652614a18565b5b9060005260206000200160138e6060015160ff168154811061267857612677614a18565b5b90600052602060002001601d600e8154811061269757612696614a18565b5b906000526020600020016040516020016126b999989796959493929190614024565b6040516020818303038152906040529050806126d88860600151612dbd565b6126e58960800151612f5b565b8585601d600f815481106126fc576126fb614a18565b5b9060005260206000200160405160200161271b96959493929190613d95565b60405160208183030381529060405295505050505050919050565b6060600082519050600081141561275f57604051806020016040528060008152509150506128c9565b600060036002836127709190614649565b61277a919061469f565b600461278691906146d0565b905060006020826127979190614649565b67ffffffffffffffff8111156127b0576127af614a47565b5b6040519080825280601f01601f1916602001820160405280156127e25781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001614ff1604091399050600181016020830160005b868110156128865760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b9050808452600484019350505061280d565b5060038606600181146128a057600281146128b0576128bb565b613d3d60f01b60028303526128bb565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6129428383613135565b61294f6000848484612b58565b61298e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298590614340565b60405180910390fd5b505050565b61299e838383613303565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129e1576129dc81613308565b612a20565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612a1f57612a1e8382613351565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a6357612a5e816134be565b612aa2565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612aa157612aa0828261358f565b5b5b505050565b600081604051602001612aba9190613d7e565b6040516020818303038152906040528051906020012060001c9050919050565b60008060009050600084600081518110612af757612af6614a18565b5b602002602001015160ff1690505b838111612b4d578180612b1790614901565b925050848260ff1681518110612b3057612b2f614a18565b5b602002602001015160ff1681612b469190614649565b9050612b05565b819250505092915050565b6000612b798473ffffffffffffffffffffffffffffffffffffffff1661360e565b15612ce2578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ba26113e7565b8786866040518563ffffffff1660e01b8152600401612bc49493929190614297565b602060405180830381600087803b158015612bde57600080fd5b505af1925050508015612c0f57506040513d601f19601f82011682018060405250810190612c0c919061393c565b60015b612c92573d8060008114612c3f576040519150601f19603f3d011682016040523d82523d6000602084013e612c44565b606091505b50600081511415612c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8190614340565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ce7565b600190505b949350505050565b6060600060405180602001604052806000815250905060048360ff161115612d3f576023856024876029604051602001612d2d959493929190614112565b60405160208183030381529060405290505b600a8360ff161115612d7b57806026856027876029604051602001612d6996959493929190613f40565b60405160208183030381529060405290505b60108360ff161115612db257806028866029604051602001612da09493929190613f02565b60405160208183030381529060405290505b809150509392505050565b60606000604051806020016040528060008152509050600060188460ff161180612df9575060088460ff16118015612df8575060108460ff16105b5b15612f1f57600090505b6007811015612e8e57816030612e30601984612e1f91906146d0565b60af612e2b9190614649565b611d80565b6031612e53601986612e4291906146d0565b60af612e4e9190614649565b611d80565b6032604051602001612e6a96959493929190613f40565b60405160208183030381529060405291508080612e86906148b8565b915050612e03565b600090505b6006811015612f1e57816030612ec0601984612eaf91906146d0565b60bb612ebb9190614649565b611d80565b6033612ee3601986612ed291906146d0565b60bb612ede9190614649565b611d80565b6034604051602001612efa96959493929190613f40565b60405160208183030381529060405291508080612f16906148b8565b915050612e93565b5b600f8460ff161115612f5157816025604051602001612f3f929190613ede565b60405160208183030381529060405291505b8192505050919050565b606060008260ff161415612f8057604051806020016040528060008152509050613130565b60038260ff161015612ff45760018260ff161115612fc657602a602b602d604051602001612fb0939291906141b5565b6040516020818303038152906040529050613130565b602a602c602d604051602001612fde939291906141b5565b6040516020818303038152906040529050613130565b60038260ff1611156130a25760058260ff16111561303a57602e602f6029604051602001613024939291906141b5565b6040516020818303038152906040529050613130565b60048260ff16111561307457602e602b602960405160200161305e939291906141b5565b6040516020818303038152906040529050613130565b602e602c602960405160200161308c939291906141b5565b6040516020818303038152906040529050613130565b601e80546130af90614855565b80601f01602080910402602001604051908101604052809291908181526020018280546130db90614855565b80156131285780601f106130fd57610100808354040283529160200191613128565b820191906000526020600020905b81548152906001019060200180831161310b57829003601f168201915b505050505090505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319c90614460565b60405180910390fd5b6131ae8161137b565b156131ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131e590614380565b60405180910390fd5b6131fa60008383612993565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461324a9190614649565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161335e84610c97565b613368919061472a565b905060006007600084815260200190815260200160002054905081811461344d576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506134d2919061472a565b905060006009600084815260200190815260200160002054905060006008838154811061350257613501614a18565b5b90600052602060002001549050806008838154811061352457613523614a18565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613573576135726149e9565b5b6001900381819060005260206000200160009055905550505050565b600061359a83610c97565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b6040518060e00160405280600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff1681525090565b6000613686613681846145c0565b61459b565b9050828152602081018484840111156136a2576136a1614a7b565b5b6136ad848285614813565b509392505050565b6000813590506136c481614f94565b92915050565b6000813590506136d981614fab565b92915050565b6000813590506136ee81614fc2565b92915050565b60008151905061370381614fc2565b92915050565b600082601f83011261371e5761371d614a76565b5b813561372e848260208601613673565b91505092915050565b60008135905061374681614fd9565b92915050565b60006020828403121561376257613761614a85565b5b6000613770848285016136b5565b91505092915050565b600080604083850312156137905761378f614a85565b5b600061379e858286016136b5565b92505060206137af858286016136b5565b9150509250929050565b6000806000606084860312156137d2576137d1614a85565b5b60006137e0868287016136b5565b93505060206137f1868287016136b5565b925050604061380286828701613737565b9150509250925092565b6000806000806080858703121561382657613825614a85565b5b6000613834878288016136b5565b9450506020613845878288016136b5565b935050604061385687828801613737565b925050606085013567ffffffffffffffff81111561387757613876614a80565b5b61388387828801613709565b91505092959194509250565b600080604083850312156138a6576138a5614a85565b5b60006138b4858286016136b5565b92505060206138c5858286016136ca565b9150509250929050565b600080604083850312156138e6576138e5614a85565b5b60006138f4858286016136b5565b925050602061390585828601613737565b9150509250929050565b60006020828403121561392557613924614a85565b5b6000613933848285016136df565b91505092915050565b60006020828403121561395257613951614a85565b5b6000613960848285016136f4565b91505092915050565b60006020828403121561397f5761397e614a85565b5b600061398d84828501613737565b91505092915050565b61399f81614792565b82525050565b6139ae816147a4565b82525050565b60006139bf82614606565b6139c9818561461c565b93506139d9818560208601614822565b6139e281614a8a565b840191505092915050565b60006139f882614611565b613a02818561462d565b9350613a12818560208601614822565b613a1b81614a8a565b840191505092915050565b6000613a3182614611565b613a3b818561463e565b9350613a4b818560208601614822565b80840191505092915050565b60008154613a6481614855565b613a6e818661463e565b94506001821660008114613a895760018114613a9a57613acd565b60ff19831686528186019350613acd565b613aa3856145f1565b60005b83811015613ac557815481890152600182019150602081019050613aa6565b838801955050505b50505092915050565b6000613ae3602b8361462d565b9150613aee82614a9b565b604082019050919050565b6000613b0660328361462d565b9150613b1182614aea565b604082019050919050565b6000613b2960268361462d565b9150613b3482614b39565b604082019050919050565b6000613b4c601c8361462d565b9150613b5782614b88565b602082019050919050565b6000613b6f60248361462d565b9150613b7a82614bb1565b604082019050919050565b6000613b9260198361462d565b9150613b9d82614c00565b602082019050919050565b6000613bb5602c8361462d565b9150613bc082614c29565b604082019050919050565b6000613bd860388361462d565b9150613be382614c78565b604082019050919050565b6000613bfb602a8361462d565b9150613c0682614cc7565b604082019050919050565b6000613c1e60298361462d565b9150613c2982614d16565b604082019050919050565b6000613c4160208361462d565b9150613c4c82614d65565b602082019050919050565b6000613c64602c8361462d565b9150613c6f82614d8e565b604082019050919050565b6000613c8760208361462d565b9150613c9282614ddd565b602082019050919050565b6000613caa60298361462d565b9150613cb582614e06565b604082019050919050565b6000613ccd60218361462d565b9150613cd882614e55565b604082019050919050565b6000613cf060318361462d565b9150613cfb82614ea4565b604082019050919050565b6000613d13602c8361462d565b9150613d1e82614ef3565b604082019050919050565b6000613d36601f8361462d565b9150613d4182614f42565b602082019050919050565b6000613d59600c8361462d565b9150613d6482614f6b565b602082019050919050565b613d78816147fc565b82525050565b6000613d8a8284613a26565b915081905092915050565b6000613da18289613a26565b9150613dad8288613a26565b9150613db98287613a26565b9150613dc58286613a26565b9150613dd18285613a26565b9150613ddd8284613a57565b9150819050979650505050505050565b6000613df9828b613a26565b9150613e05828a613a26565b9150613e118289613a57565b9150613e1d8288613a26565b9150613e298287613a57565b9150613e358286613a26565b9150613e418285613a57565b9150613e4d8284613a26565b91508190509998505050505050505050565b6000613e6b828c613a26565b9150613e77828b613a26565b9150613e83828a613a57565b9150613e8f8289613a26565b9150613e9b8288613a57565b9150613ea78287613a26565b9150613eb38286613a57565b9150613ebf8285613a26565b9150613ecb8284613a57565b91508190509a9950505050505050505050565b6000613eea8285613a26565b9150613ef68284613a57565b91508190509392505050565b6000613f0e8287613a26565b9150613f1a8286613a57565b9150613f268285613a26565b9150613f328284613a57565b915081905095945050505050565b6000613f4c8289613a26565b9150613f588288613a57565b9150613f648287613a26565b9150613f708286613a57565b9150613f7c8285613a26565b9150613f888284613a57565b9150819050979650505050505050565b6000613fa4828d613a26565b9150613fb0828c613a57565b9150613fbc828b613a26565b9150613fc8828a613a57565b9150613fd48289613a26565b9150613fe08288613a57565b9150613fec8287613a26565b9150613ff88286613a57565b91506140048285613a26565b91506140108284613a57565b91508190509b9a5050505050505050505050565b6000614030828c613a26565b915061403c828b613a57565b9150614048828a613a57565b91506140548289613a57565b91506140608288613a57565b915061406c8287613a26565b91506140788286613a57565b91506140848285613a57565b91506140908284613a57565b91508190509a9950505050505050505050565b60006140af8285613a57565b91506140bb8284613a26565b91508190509392505050565b60006140d38288613a57565b91506140df8287613a26565b91506140eb8286613a26565b91506140f78285613a26565b91506141038284613a57565b91508190509695505050505050565b600061411e8288613a57565b915061412a8287613a26565b91506141368286613a57565b91506141428285613a26565b915061414e8284613a57565b91508190509695505050505050565b60006141698289613a57565b91506141758288613a26565b91506141818287613a57565b915061418d8286613a26565b91506141998285613a57565b91506141a58284613a26565b9150819050979650505050505050565b60006141c18286613a57565b91506141cd8285613a57565b91506141d98284613a57565b9150819050949350505050565b60006141f28288613a57565b91506141fe8287613a57565b915061420a8286613a57565b91506142168285613a26565b91506142228284613a57565b91508190509695505050505050565b600061423d8288613a57565b91506142498287613a57565b91506142558286613a57565b91506142618285613a57565b915061426d8284613a57565b91508190509695505050505050565b60006020820190506142916000830184613996565b92915050565b60006080820190506142ac6000830187613996565b6142b96020830186613996565b6142c66040830185613d6f565b81810360608301526142d881846139b4565b905095945050505050565b60006020820190506142f860008301846139a5565b92915050565b6000602082019050818103600083015261431881846139ed565b905092915050565b6000602082019050818103600083015261433981613ad6565b9050919050565b6000602082019050818103600083015261435981613af9565b9050919050565b6000602082019050818103600083015261437981613b1c565b9050919050565b6000602082019050818103600083015261439981613b3f565b9050919050565b600060208201905081810360008301526143b981613b62565b9050919050565b600060208201905081810360008301526143d981613b85565b9050919050565b600060208201905081810360008301526143f981613ba8565b9050919050565b6000602082019050818103600083015261441981613bcb565b9050919050565b6000602082019050818103600083015261443981613bee565b9050919050565b6000602082019050818103600083015261445981613c11565b9050919050565b6000602082019050818103600083015261447981613c34565b9050919050565b6000602082019050818103600083015261449981613c57565b9050919050565b600060208201905081810360008301526144b981613c7a565b9050919050565b600060208201905081810360008301526144d981613c9d565b9050919050565b600060208201905081810360008301526144f981613cc0565b9050919050565b6000602082019050818103600083015261451981613ce3565b9050919050565b6000602082019050818103600083015261453981613d06565b9050919050565b6000602082019050818103600083015261455981613d29565b9050919050565b6000602082019050818103600083015261457981613d4c565b9050919050565b60006020820190506145956000830184613d6f565b92915050565b60006145a56145b6565b90506145b18282614887565b919050565b6000604051905090565b600067ffffffffffffffff8211156145db576145da614a47565b5b6145e482614a8a565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614654826147fc565b915061465f836147fc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146945761469361495c565b5b828201905092915050565b60006146aa826147fc565b91506146b5836147fc565b9250826146c5576146c461498b565b5b828204905092915050565b60006146db826147fc565b91506146e6836147fc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561471f5761471e61495c565b5b828202905092915050565b6000614735826147fc565b9150614740836147fc565b9250828210156147535761475261495c565b5b828203905092915050565b600061476982614806565b915061477483614806565b9250828210156147875761478661495c565b5b828203905092915050565b600061479d826147dc565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614840578082015181840152602081019050614825565b8381111561484f576000848401525b50505050565b6000600282049050600182168061486d57607f821691505b60208210811415614881576148806149ba565b5b50919050565b61489082614a8a565b810181811067ffffffffffffffff821117156148af576148ae614a47565b5b80604052505050565b60006148c3826147fc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148f6576148f561495c565b5b600182019050919050565b600061490c82614806565b915060ff8214156149205761491f61495c565b5b600182019050919050565b6000614936826147fc565b9150614941836147fc565b9250826149515761495061498b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f696e76616c6964206d696e740000000000000000000000000000000000000000600082015250565b614f9d81614792565b8114614fa857600080fd5b50565b614fb4816147a4565b8114614fbf57600080fd5b50565b614fcb816147b0565b8114614fd657600080fd5b50565b614fe2816147fc565b8114614fed57600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220fc8fdabeaf2cd333afc0d775998445dfdb46f80806e5c5cd20b20835b0faaf4d64736f6c63430008070033

Deployed Bytecode Sourcemap

49745:12366:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43567:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30695:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32254:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31777:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61683:178;;;:::i;:::-;;44207:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33144:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43875:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33554:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61871:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58559:443;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44397:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30389:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30119:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15159:94;;;:::i;:::-;;14508:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30864:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49894:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32547:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33810:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61382:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49849:40;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32913:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15408:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43567:224;43669:4;43708:35;43693:50;;;:11;:50;;;;:90;;;;43747:36;43771:11;43747:23;:36::i;:::-;43693:90;43686:97;;43567:224;;;:::o;30695:100::-;30749:13;30782:5;30775:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30695:100;:::o;32254:221::-;32330:7;32358:16;32366:7;32358;:16::i;:::-;32350:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32443:15;:24;32459:7;32443:24;;;;;;;;;;;;;;;;;;;;;32436:31;;32254:221;;;:::o;31777:411::-;31858:13;31874:23;31889:7;31874:14;:23::i;:::-;31858:39;;31922:5;31916:11;;:2;:11;;;;31908:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;32016:5;32000:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;32025:37;32042:5;32049:12;:10;:12::i;:::-;32025:16;:37::i;:::-;32000:62;31978:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;32159:21;32168:2;32172:7;32159:8;:21::i;:::-;31847:341;31777:411;;:::o;61683:178::-;17439:1;18035:7;;:19;;18027:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;17439:1;18168:7;:18;;;;61748:1:::1;61734:10;;:15;;:36;;;;;61766:4;61753:10;;:17;61734:36;61726:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;61794:39;61804:12;:10;:12::i;:::-;61831:1;61818:10;;:14;;;;:::i;:::-;61794:9;:39::i;:::-;61854:1;61840:10;;:15;;;;;;;:::i;:::-;;;;;;;;17395:1:::0;18347:7;:22;;;;61683:178::o;44207:113::-;44268:7;44295:10;:17;;;;44288:24;;44207:113;:::o;33144:339::-;33339:41;33358:12;:10;:12::i;:::-;33372:7;33339:18;:41::i;:::-;33331:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33447:28;33457:4;33463:2;33467:7;33447:9;:28::i;:::-;33144:339;;;:::o;43875:256::-;43972:7;44008:23;44025:5;44008:16;:23::i;:::-;44000:5;:31;43992:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;44097:12;:19;44110:5;44097:19;;;;;;;;;;;;;;;:26;44117:5;44097:26;;;;;;;;;;;;44090:33;;43875:256;;;;:::o;33554:185::-;33692:39;33709:4;33715:2;33719:7;33692:39;;;;;;;;;;;;:16;:39::i;:::-;33554:185;;;:::o;61871:171::-;17439:1;18035:7;;:19;;18027:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;17439:1;18168:7;:18;;;;14739:12:::1;:10;:12::i;:::-;14728:23;;:7;:5;:7::i;:::-;:23;;;14720:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61963:4:::2;61953:7;:14;:32;;;;;61981:4;61971:7;:14;61953:32;61945:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;62009:27;62019:7;:5;:7::i;:::-;62028;62009:9;:27::i;:::-;17395:1:::0;18347:7;:22;;;;61871:171;:::o;58559:443::-;58620:13;58642:14;58659:18;58669:7;58659:9;:18::i;:::-;58642:35;;58684:15;58724:27;58732:3;:7;;;58724:16;;:25;:27::i;:::-;58752:3;58756:27;58764:3;:7;;;58756:16;;:25;:27::i;:::-;58784:3;58788:31;58796:3;:11;;;58788:20;;:29;:31::i;:::-;58820:3;58707:117;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58684:141;;58863:1;58865:28;58873:3;:8;;;58865:17;;:26;:28::i;:::-;58894:3;58898:31;58906:3;:11;;;58898:20;;:29;:31::i;:::-;58930:3;58934:29;58942:3;:9;;;58934:18;;:27;:29::i;:::-;58964:3;58968:26;58976:3;:6;;;58968:15;;:24;:26::i;:::-;58846:149;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58832:164;;;;58559:443;;;:::o;44397:233::-;44472:7;44508:30;:28;:30::i;:::-;44500:5;:38;44492:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;44605:10;44616:5;44605:17;;;;;;;;:::i;:::-;;;;;;;;;;44598:24;;44397:233;;;:::o;30389:239::-;30461:7;30481:13;30497:7;:16;30505:7;30497:16;;;;;;;;;;;;;;;;;;;;;30481:32;;30549:1;30532:19;;:5;:19;;;;30524:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30615:5;30608:12;;;30389:239;;;:::o;30119:208::-;30191:7;30236:1;30219:19;;:5;:19;;;;30211:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;30303:9;:16;30313:5;30303:16;;;;;;;;;;;;;;;;30296:23;;30119:208;;;:::o;15159:94::-;14739:12;:10;:12::i;:::-;14728:23;;:7;:5;:7::i;:::-;:23;;;14720:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15224:21:::1;15242:1;15224:9;:21::i;:::-;15159:94::o:0;14508:87::-;14554:7;14581:6;;;;;;;;;;;14574:13;;14508:87;:::o;30864:104::-;30920:13;30953:7;30946:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30864:104;:::o;49894:29::-;;;;:::o;32547:295::-;32662:12;:10;:12::i;:::-;32650:24;;:8;:24;;;;32642:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;32762:8;32717:18;:32;32736:12;:10;:12::i;:::-;32717:32;;;;;;;;;;;;;;;:42;32750:8;32717:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;32815:8;32786:48;;32801:12;:10;:12::i;:::-;32786:48;;;32825:8;32786:48;;;;;;:::i;:::-;;;;;;;;32547:295;;:::o;33810:328::-;33985:41;34004:12;:10;:12::i;:::-;34018:7;33985:18;:41::i;:::-;33977:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;34091:39;34105:4;34111:2;34115:7;34124:5;34091:13;:39::i;:::-;33810:328;;;;:::o;61382:295::-;61447:13;61469:14;61486:18;61496:7;61486:9;:18::i;:::-;61469:35;;61542:3;61546:123;61590:3;61594:18;:7;:16;:18::i;:::-;61613:14;61623:3;61613:9;:14::i;:::-;61628:33;61648:11;61655:3;61648:6;:11::i;:::-;61628:13;:33::i;:::-;61662:3;61573:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61546:13;:123::i;:::-;61525:145;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61511:160;;;61382:295;;;:::o;49849:40::-;49885:4;49849:40;:::o;32913:164::-;33010:4;33034:18;:25;33053:5;33034:25;;;;;;;;;;;;;;;:35;33060:8;33034:35;;;;;;;;;;;;;;;;;;;;;;;;;33027:42;;32913:164;;;;:::o;15408:192::-;14739:12;:10;:12::i;:::-;14728:23;;:7;:5;:7::i;:::-;:23;;;14720:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15517:1:::1;15497:22;;:8;:22;;;;15489:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;15573:19;15583:8;15573:9;:19::i;:::-;15408:192:::0;:::o;29750:305::-;29852:4;29904:25;29889:40;;;:11;:40;;;;:105;;;;29961:33;29946:48;;;:11;:48;;;;29889:105;:158;;;;30011:36;30035:11;30011:23;:36::i;:::-;29889:158;29869:178;;29750:305;;;:::o;35648:127::-;35713:4;35765:1;35737:30;;:7;:16;35745:7;35737:16;;;;;;;;;;;;;;;;;;;;;:30;;;;35730:37;;35648:127;;;:::o;13384:98::-;13437:7;13464:10;13457:17;;13384:98;:::o;39630:174::-;39732:2;39705:15;:24;39721:7;39705:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39788:7;39784:2;39750:46;;39759:23;39774:7;39759:14;:23::i;:::-;39750:46;;;;;;;;;;;;39630:174;;:::o;36632:110::-;36708:26;36718:2;36722:7;36708:26;;;;;;;;;;;;:9;:26::i;:::-;36632:110;;:::o;35942:348::-;36035:4;36060:16;36068:7;36060;:16::i;:::-;36052:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36136:13;36152:23;36167:7;36152:14;:23::i;:::-;36136:39;;36205:5;36194:16;;:7;:16;;;:51;;;;36238:7;36214:31;;:20;36226:7;36214:11;:20::i;:::-;:31;;;36194:51;:87;;;;36249:32;36266:5;36273:7;36249:16;:32::i;:::-;36194:87;36186:96;;;35942:348;;;;:::o;38934:578::-;39093:4;39066:31;;:23;39081:7;39066:14;:23::i;:::-;:31;;;39058:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;39176:1;39162:16;;:2;:16;;;;39154:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39232:39;39253:4;39259:2;39263:7;39232:20;:39::i;:::-;39336:29;39353:1;39357:7;39336:8;:29::i;:::-;39397:1;39378:9;:15;39388:4;39378:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;39426:1;39409:9;:13;39419:2;39409:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39457:2;39438:7;:16;39446:7;39438:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39496:7;39492:2;39477:27;;39486:4;39477:27;;;;;;;;;;;;38934:578;;;:::o;57123:855::-;57182:10;;:::i;:::-;57215:7;57209:5;:13;;;;:::i;:::-;57201:21;;57244:14;;:::i;:::-;57339:1;57280:56;57311:3;57315:18;:7;:16;:18::i;:::-;57294:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57280:6;:56::i;:::-;:60;;;;:::i;:::-;57265:3;:6;;:76;;;;;;;;;;;57358:74;57363:5;57358:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57427:4;57369:57;57400:4;57405:18;:7;:16;:18::i;:::-;57383:41;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57369:6;:57::i;:::-;:62;;;;:::i;:::-;57358:4;:74::i;:::-;57348:3;:7;;:84;;;;;;;;;;;57450:74;57455:6;57450:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57519:4;57462:56;57493:3;57497:18;:7;:16;:18::i;:::-;57476:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57462:6;:56::i;:::-;:61;;;;:::i;:::-;57450:4;:74::i;:::-;57439:3;:8;;:85;;;;;;;;;;;57543:75;57548:7;57543:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57613:4;57556:56;57587:3;57591:18;:7;:16;:18::i;:::-;57570:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57556:6;:56::i;:::-;:61;;;;:::i;:::-;57543:4;:75::i;:::-;57531:3;:9;;:87;;;;;;;;;;;57639:76;57644:9;57639:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57711:3;57654:56;57685:3;57689:18;:7;:16;:18::i;:::-;57668:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57654:6;:56::i;:::-;:60;;;;:::i;:::-;57639:4;:76::i;:::-;57625:3;:11;;:90;;;;;;;;;;;57736:77;57741:9;57736:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57808:4;57751:56;57782:3;57786:18;:7;:16;:18::i;:::-;57765:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57751:6;:56::i;:::-;:61;;;;:::i;:::-;57736:4;:77::i;:::-;57722:3;:11;;:91;;;;;;;;;;;57830:73;57835:5;57830:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57898:4;57841:56;57872:3;57876:18;:7;:16;:18::i;:::-;57855:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57841:6;:56::i;:::-;:61;;;;:::i;:::-;57830:4;:73::i;:::-;57820:3;:7;;:83;;;;;;;;;;;57923:4;57914:7;:13;57910:46;;;57938:3;:7;;:9;;;;;;;;:::i;:::-;;;;;;;;;57910:46;57969:3;57962:10;;;57123:855;;;:::o;11086:723::-;11142:13;11372:1;11363:5;:10;11359:53;;;11390:10;;;;;;;;;;;;;;;;;;;;;11359:53;11422:12;11437:5;11422:20;;11453:14;11478:78;11493:1;11485:4;:9;11478:78;;11511:8;;;;;:::i;:::-;;;;11542:2;11534:10;;;;;:::i;:::-;;;11478:78;;;11566:19;11598:6;11588:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11566:39;;11616:154;11632:1;11623:5;:10;11616:154;;11660:1;11650:11;;;;;:::i;:::-;;;11727:2;11719:5;:10;;;;:::i;:::-;11706:2;:24;;;;:::i;:::-;11693:39;;11676:6;11683;11676:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;11756:2;11747:11;;;;;:::i;:::-;;;11616:154;;;11794:6;11780:21;;;;;11086:723;;;;:::o;15608:173::-;15664:16;15683:6;;;;;;;;;;;15664:25;;15709:8;15700:6;;:17;;;;;;;;;;;;;;;;;;15764:8;15733:40;;15754:8;15733:40;;;;;;;;;;;;15653:128;15608:173;:::o;35020:315::-;35177:28;35187:4;35193:2;35197:7;35177:9;:28::i;:::-;35224:48;35247:4;35253:2;35257:7;35266:5;35224:22;:48::i;:::-;35216:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;35020:315;;;;:::o;58049:406::-;58107:13;58129:15;58169:3;58173:26;58181:3;:6;;;58173:15;;:24;:26::i;:::-;58200:3;58204:27;58212:3;:7;;;58204:16;;:25;:27::i;:::-;58232:3;58236:31;58244:3;:11;;;58236:20;;:29;:31::i;:::-;58152:116;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58129:140;;58307:1;58309:3;58313:27;58321:3;:7;;;58313:16;;:25;:27::i;:::-;58341:3;58345:28;58353:3;:8;;;58345:17;;:26;:28::i;:::-;58374:3;58378:31;58386:3;:11;;;58378:20;;:29;:31::i;:::-;58410:3;58414:29;58422:3;:9;;;58414:18;;:27;:29::i;:::-;58444:3;58290:158;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58276:173;;;58049:406;;;:::o;60432:944::-;60487:13;60509:15;60525:4;60530:3;:7;;;60525:13;;;;;;;;;;:::i;:::-;;;;;;;;;60509:29;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60545:15;60561:4;60566:3;:7;;;60561:13;;;;;;;;;;:::i;:::-;;;;;;;;;60545:29;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60581:19;:22;;;;;;;;;;;;;;60610:19;:22;;;;;;;;;;;;;;60655:1;60643:3;:11;;;:13;;;60639:128;;;60697:4;60702:8;60723:1;60711:3;:11;;;:13;;;;:::i;:::-;60702:23;;;;;;;;;;:::i;:::-;;;;;;;;;60726:4;60731:8;60752:1;60740:3;:11;;;:13;;;;:::i;:::-;60731:23;;;;;;;;;;:::i;:::-;;;;;;;;;60755:2;60680:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60667:92;;60639:128;60785:1;60777:3;:7;;;:9;;;60773:106;;;60827:3;60831:4;60844:1;60836:3;:7;;;:9;;;;:::i;:::-;60831:15;;;;;;;;;;:::i;:::-;;;;;;;;;60847:3;60851:4;60864:1;60856:3;:7;;;:9;;;;:::i;:::-;60851:15;;;;;;;;;;:::i;:::-;;;;;;;;;60867:2;60810:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60797:74;;60773:106;60885:20;60932:1;60934;60932:4;;;;;;;;:::i;:::-;;;;;;;;;60937:10;60948:3;:6;;;60937:18;;;;;;;;;;:::i;:::-;;;;;;;;;60956:1;60958;60956:4;;;;;;;;:::i;:::-;;;;;;;;;60961:1;60963;60965;60963:4;;;;;;;;:::i;:::-;;;;;;;;;60915:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60885:84;;61009:6;61016:1;61018;61020;61018:4;;;;;;;;:::i;:::-;;;;;;;;;61023:1;61025;61027;61025:4;;;;;;;;:::i;:::-;;;;;;;;;61030:1;61032;61034;61032:4;;;;;;;;:::i;:::-;;;;;;;;;61037:1;61039;61041;61039:4;;;;;;;;:::i;:::-;;;;;;;;;60992:52;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60976:69;;61085:6;61092:1;61094;61096;61094:4;;;;;;;;:::i;:::-;;;;;;;;;61099:1;61101;61103;61101:4;;;;;;;;:::i;:::-;;;;;;;;;61106:1;61108;61110;61108:4;;;;;;;;:::i;:::-;;;;;;;;;61113:1;61115;61117:2;61115:5;;;;;;;;:::i;:::-;;;;;;;;;61068:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61052:70;;61162:6;61169:4;61174:3;:8;;;61169:14;;;;;;;;;;:::i;:::-;;;;;;;;;61184:1;61186:2;61184:5;;;;;;;;:::i;:::-;;;;;;;;;61190:4;61195:3;:8;;;61190:14;;;;;;;;;;:::i;:::-;;;;;;;;;61205:1;61207:2;61205:5;;;;;;;;:::i;:::-;;;;;;;;;61211:20;61218:1;61220;61222:3;:8;;;61211:6;:20::i;:::-;61232:1;61234:2;61232:5;;;;;;;;:::i;:::-;;;;;;;;;61238;61244:3;:9;;;61238:16;;;;;;;;;;:::i;:::-;;;;;;;;;61255:1;61257:2;61255:5;;;;;;;;:::i;:::-;;;;;;;;;61145:116;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61129:133;;61300:6;61307:19;61316:3;:9;;;61307:8;:19::i;:::-;61327:23;61338:3;:11;;;61327:10;:23::i;:::-;61351:5;61357;61363:1;61365:2;61363:5;;;;;;;;:::i;:::-;;;;;;;;;61283:86;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61269:101;;;;;;;60432:944;;;:::o;3807:1589::-;3865:13;3891:11;3905:4;:11;3891:25;;3938:1;3931:3;:8;3927:23;;;3941:9;;;;;;;;;;;;;;;;;3927:23;4002:18;4040:1;4035;4029:3;:7;;;;:::i;:::-;4028:13;;;;:::i;:::-;4023:1;:19;;;;:::i;:::-;4002:40;;4100:19;4145:2;4132:10;:15;;;;:::i;:::-;4122:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4100:48;;4159:18;4180:5;;;;;;;;;;;;;;;;;4159:26;;4249:1;4242:5;4238:13;4294:2;4286:6;4282:15;4343:1;4311:769;4366:3;4363:1;4360:10;4311:769;;;4419:1;4416;4412:9;4407:14;;4477:8;4472:1;4466:4;4462:12;4456:19;4452:34;4555:4;4547:5;4543:2;4539:14;4535:25;4525:8;4521:40;4515:47;4594:3;4591:1;4587:11;4580:18;;4685:4;4676;4668:5;4664:2;4660:14;4656:25;4646:8;4642:40;4636:47;4632:58;4627:3;4623:68;4616:75;;4723:3;4720:1;4716:11;4709:18;;4813:4;4804;4796:5;4793:1;4789:13;4785:24;4775:8;4771:39;4765:46;4761:57;4756:3;4752:67;4745:74;;4851:3;4848:1;4844:11;4837:18;;4933:4;4924;4917:5;4913:16;4903:8;4899:31;4893:38;4889:49;4884:3;4880:59;4873:66;;4973:3;4968;4964:13;4957:20;;5013:3;5002:9;4995:22;5063:1;5052:9;5048:17;5035:30;;4388:692;;4311:769;;;4315:44;5110:1;5105:3;5101:11;5131:1;5126:84;;;;5229:1;5224:82;;;;5094:212;;5126:84;5187:6;5182:3;5178:16;5174:1;5163:9;5159:17;5152:43;5126:84;;5224:82;5285:4;5280:3;5276:14;5272:1;5261:9;5257:17;5250:41;5094:212;;5335:10;5327:6;5320:26;4207:1150;;5381:6;5367:21;;;;;;3807:1589;;;;:::o;28359:157::-;28444:4;28483:25;28468:40;;;:11;:40;;;;28461:47;;28359:157;;;:::o;36969:321::-;37099:18;37105:2;37109:7;37099:5;:18::i;:::-;37150:54;37181:1;37185:2;37189:7;37198:5;37150:22;:54::i;:::-;37128:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;36969:321;;;:::o;45243:589::-;45387:45;45414:4;45420:2;45424:7;45387:26;:45::i;:::-;45465:1;45449:18;;:4;:18;;;45445:187;;;45484:40;45516:7;45484:31;:40::i;:::-;45445:187;;;45554:2;45546:10;;:4;:10;;;45542:90;;45573:47;45606:4;45612:7;45573:32;:47::i;:::-;45542:90;45445:187;45660:1;45646:16;;:2;:16;;;45642:183;;;45679:45;45716:7;45679:36;:45::i;:::-;45642:183;;;45752:4;45746:10;;:2;:10;;;45742:83;;45773:40;45801:2;45805:7;45773:27;:40::i;:::-;45742:83;45642:183;45243:589;;;:::o;56768:132::-;56828:7;56886:5;56869:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;56859:34;;;;;;56851:43;;56844:50;;56768:132;;;:::o;56906:211::-;56971:5;56985:9;56995:1;56985:11;;57003:9;57021:1;57023;57021:4;;;;;;;;:::i;:::-;;;;;;;;57013:13;;57003:23;;57033:62;57043:1;57040;:4;57033:62;;57055:5;;;;;:::i;:::-;;;;57080:1;57082:3;57080:6;;;;;;;;;;:::i;:::-;;;;;;;;57072:15;;57069:18;;;;;:::i;:::-;;;57033:62;;;57108:3;57101:10;;;;56906:211;;;;:::o;40369:803::-;40524:4;40545:15;:2;:13;;;:15::i;:::-;40541:624;;;40597:2;40581:36;;;40618:12;:10;:12::i;:::-;40632:4;40638:7;40647:5;40581:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40577:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40844:1;40827:6;:13;:18;40823:272;;;40870:60;;;;;;;;;;:::i;:::-;;;;;;;;40823:272;41045:6;41039:13;41030:6;41026:2;41022:15;41015:38;40577:533;40714:45;;;40704:55;;;:6;:55;;;;40697:62;;;;;40541:624;41149:4;41142:11;;40369:803;;;;;;;:::o;59008:349::-;59088:13;59110:17;:22;;;;;;;;;;;;;;59145:1;59143;:3;;;59139:60;;;59180:3;59184:1;59186:3;59190:1;59192:2;59163:32;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59150:46;;59139:60;59211:2;59209:1;:4;;;59205:65;;;59247:3;59251;59255:1;59257:3;59261:1;59263:2;59230:36;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59217:50;;59205:65;59282:2;59280:1;:4;;;59276:59;;;59318:3;59322;59326:1;59328:2;59301:30;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59288:44;;59276:59;59348:3;59341:10;;;59008:349;;;;;:::o;59363:525::-;59413:13;59435:17;:22;;;;;;;;;;;;;;59464:6;59484:2;59482:1;:4;;;59481:27;;;;59495:1;59493;:3;;;59492:15;;;;;59504:2;59502:1;:4;;;59492:15;59481:27;59477:317;;;59526:1;59524:3;;59519:130;59530:1;59528;:3;59519:130;;;59578:3;59582;59586:21;59593:2;59591:1;:4;;;;:::i;:::-;59587:3;:8;;;;:::i;:::-;59586:19;:21::i;:::-;59608:3;59612:21;59619:2;59617:1;:4;;;;:::i;:::-;59613:3;:8;;;;:::i;:::-;59612:19;:21::i;:::-;59634:3;59561:77;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59548:91;;59532:3;;;;;:::i;:::-;;;;59519:130;;;59664:1;59662:3;;59657:130;59668:1;59666;:3;59657:130;;;59716:3;59720;59724:21;59731:2;59729:1;:4;;;;:::i;:::-;59725:3;:8;;;;:::i;:::-;59724:19;:21::i;:::-;59746:3;59750:21;59757:2;59755:1;:4;;;;:::i;:::-;59751:3;:8;;;;:::i;:::-;59750:19;:21::i;:::-;59772:3;59699:77;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59686:91;;59670:3;;;;;:::i;:::-;;;;59657:130;;;59477:317;59806:2;59804:1;:4;;;59800:66;;;59849:3;59853;59832:25;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59819:39;;59800:66;59879:3;59872:10;;;;59363:525;;;:::o;59894:532::-;59946:13;59975:1;59972;:4;;;59968:36;;;59987:9;;;;;;;;;;;;;;;;59968:36;60016:1;60014;:3;;;60010:153;;;60034:1;60032;:3;;;60028:74;;;60079:3;60083;60087;60062:29;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60048:44;;;;60028:74;60142:3;60146;60150;60125:29;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60111:44;;;;60010:153;60175:1;60173;:3;;;60169:233;;;60193:1;60191;:3;;;60187:73;;;60238:3;60242;60246:2;60221:28;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60207:43;;;;60187:73;60275:1;60273;:3;;;60269:73;;;60320:3;60324;60328:2;60303:28;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60289:43;;;;60269:73;60382:3;60386;60390:2;60365:28;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60351:43;;;;60169:233;60415:5;60408:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59894:532;;;;:::o;37626:382::-;37720:1;37706:16;;:2;:16;;;;37698:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37779:16;37787:7;37779;:16::i;:::-;37778:17;37770:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37841:45;37870:1;37874:2;37878:7;37841:20;:45::i;:::-;37916:1;37899:9;:13;37909:2;37899:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37947:2;37928:7;:16;37936:7;37928:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37992:7;37988:2;37967:33;;37984:1;37967:33;;;;;;;;;;;;37626:382;;:::o;41744:126::-;;;;:::o;46555:164::-;46659:10;:17;;;;46632:15;:24;46648:7;46632:24;;;;;;;;;;;:44;;;;46687:10;46703:7;46687:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46555:164;:::o;47346:988::-;47612:22;47662:1;47637:22;47654:4;47637:16;:22::i;:::-;:26;;;;:::i;:::-;47612:51;;47674:18;47695:17;:26;47713:7;47695:26;;;;;;;;;;;;47674:47;;47842:14;47828:10;:28;47824:328;;47873:19;47895:12;:18;47908:4;47895:18;;;;;;;;;;;;;;;:34;47914:14;47895:34;;;;;;;;;;;;47873:56;;47979:11;47946:12;:18;47959:4;47946:18;;;;;;;;;;;;;;;:30;47965:10;47946:30;;;;;;;;;;;:44;;;;48096:10;48063:17;:30;48081:11;48063:30;;;;;;;;;;;:43;;;;47858:294;47824:328;48248:17;:26;48266:7;48248:26;;;;;;;;;;;48241:33;;;48292:12;:18;48305:4;48292:18;;;;;;;;;;;;;;;:34;48311:14;48292:34;;;;;;;;;;;48285:41;;;47427:907;;47346:988;;:::o;48629:1079::-;48882:22;48927:1;48907:10;:17;;;;:21;;;;:::i;:::-;48882:46;;48939:18;48960:15;:24;48976:7;48960:24;;;;;;;;;;;;48939:45;;49311:19;49333:10;49344:14;49333:26;;;;;;;;:::i;:::-;;;;;;;;;;49311:48;;49397:11;49372:10;49383;49372:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;49508:10;49477:15;:28;49493:11;49477:28;;;;;;;;;;;:41;;;;49649:15;:24;49665:7;49649:24;;;;;;;;;;;49642:31;;;49684:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;48700:1008;;;48629:1079;:::o;46133:221::-;46218:14;46235:20;46252:2;46235:16;:20::i;:::-;46218:37;;46293:7;46266:12;:16;46279:2;46266:16;;;;;;;;;;;;;;;:24;46283:6;46266:24;;;;;;;;;;;:34;;;;46340:6;46311:17;:26;46329:7;46311:26;;;;;;;;;;;:35;;;;46207:147;46133:221;;:::o;20547:387::-;20607:4;20815:12;20882:7;20870:20;20862:28;;20925:1;20918:4;:8;20911:15;;;20547:387;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1354:139::-;1400:5;1438:6;1425:20;1416:29;;1454:33;1481:5;1454:33;:::i;:::-;1354:139;;;;:::o;1499:329::-;1558:6;1607:2;1595:9;1586:7;1582:23;1578:32;1575:119;;;1613:79;;:::i;:::-;1575:119;1733:1;1758:53;1803:7;1794:6;1783:9;1779:22;1758:53;:::i;:::-;1748:63;;1704:117;1499:329;;;;:::o;1834:474::-;1902:6;1910;1959:2;1947:9;1938:7;1934:23;1930:32;1927:119;;;1965:79;;:::i;:::-;1927:119;2085:1;2110:53;2155:7;2146:6;2135:9;2131:22;2110:53;:::i;:::-;2100:63;;2056:117;2212:2;2238:53;2283:7;2274:6;2263:9;2259:22;2238:53;:::i;:::-;2228:63;;2183:118;1834:474;;;;;:::o;2314:619::-;2391:6;2399;2407;2456:2;2444:9;2435:7;2431:23;2427:32;2424:119;;;2462:79;;:::i;:::-;2424:119;2582:1;2607:53;2652:7;2643:6;2632:9;2628:22;2607:53;:::i;:::-;2597:63;;2553:117;2709:2;2735:53;2780:7;2771:6;2760:9;2756:22;2735:53;:::i;:::-;2725:63;;2680:118;2837:2;2863:53;2908:7;2899:6;2888:9;2884:22;2863:53;:::i;:::-;2853:63;;2808:118;2314:619;;;;;:::o;2939:943::-;3034:6;3042;3050;3058;3107:3;3095:9;3086:7;3082:23;3078:33;3075:120;;;3114:79;;:::i;:::-;3075:120;3234:1;3259:53;3304:7;3295:6;3284:9;3280:22;3259:53;:::i;:::-;3249:63;;3205:117;3361:2;3387:53;3432:7;3423:6;3412:9;3408:22;3387:53;:::i;:::-;3377:63;;3332:118;3489:2;3515:53;3560:7;3551:6;3540:9;3536:22;3515:53;:::i;:::-;3505:63;;3460:118;3645:2;3634:9;3630:18;3617:32;3676:18;3668:6;3665:30;3662:117;;;3698:79;;:::i;:::-;3662:117;3803:62;3857:7;3848:6;3837:9;3833:22;3803:62;:::i;:::-;3793:72;;3588:287;2939:943;;;;;;;:::o;3888:468::-;3953:6;3961;4010:2;3998:9;3989:7;3985:23;3981:32;3978:119;;;4016:79;;:::i;:::-;3978:119;4136:1;4161:53;4206:7;4197:6;4186:9;4182:22;4161:53;:::i;:::-;4151:63;;4107:117;4263:2;4289:50;4331:7;4322:6;4311:9;4307:22;4289:50;:::i;:::-;4279:60;;4234:115;3888:468;;;;;:::o;4362:474::-;4430:6;4438;4487:2;4475:9;4466:7;4462:23;4458:32;4455:119;;;4493:79;;:::i;:::-;4455:119;4613:1;4638:53;4683:7;4674:6;4663:9;4659:22;4638:53;:::i;:::-;4628:63;;4584:117;4740:2;4766:53;4811:7;4802:6;4791:9;4787:22;4766:53;:::i;:::-;4756:63;;4711:118;4362:474;;;;;:::o;4842:327::-;4900:6;4949:2;4937:9;4928:7;4924:23;4920:32;4917:119;;;4955:79;;:::i;:::-;4917:119;5075:1;5100:52;5144:7;5135:6;5124:9;5120:22;5100:52;:::i;:::-;5090:62;;5046:116;4842:327;;;;:::o;5175:349::-;5244:6;5293:2;5281:9;5272:7;5268:23;5264:32;5261:119;;;5299:79;;:::i;:::-;5261:119;5419:1;5444:63;5499:7;5490:6;5479:9;5475:22;5444:63;:::i;:::-;5434:73;;5390:127;5175:349;;;;:::o;5530:329::-;5589:6;5638:2;5626:9;5617:7;5613:23;5609:32;5606:119;;;5644:79;;:::i;:::-;5606:119;5764:1;5789:53;5834:7;5825:6;5814:9;5810:22;5789:53;:::i;:::-;5779:63;;5735:117;5530:329;;;;:::o;5865:118::-;5952:24;5970:5;5952:24;:::i;:::-;5947:3;5940:37;5865:118;;:::o;5989:109::-;6070:21;6085:5;6070:21;:::i;:::-;6065:3;6058:34;5989:109;;:::o;6104:360::-;6190:3;6218:38;6250:5;6218:38;:::i;:::-;6272:70;6335:6;6330:3;6272:70;:::i;:::-;6265:77;;6351:52;6396:6;6391:3;6384:4;6377:5;6373:16;6351:52;:::i;:::-;6428:29;6450:6;6428:29;:::i;:::-;6423:3;6419:39;6412:46;;6194:270;6104:360;;;;:::o;6470:364::-;6558:3;6586:39;6619:5;6586:39;:::i;:::-;6641:71;6705:6;6700:3;6641:71;:::i;:::-;6634:78;;6721:52;6766:6;6761:3;6754:4;6747:5;6743:16;6721:52;:::i;:::-;6798:29;6820:6;6798:29;:::i;:::-;6793:3;6789:39;6782:46;;6562:272;6470:364;;;;:::o;6840:377::-;6946:3;6974:39;7007:5;6974:39;:::i;:::-;7029:89;7111:6;7106:3;7029:89;:::i;:::-;7022:96;;7127:52;7172:6;7167:3;7160:4;7153:5;7149:16;7127:52;:::i;:::-;7204:6;7199:3;7195:16;7188:23;;6950:267;6840:377;;;;:::o;7247:845::-;7350:3;7387:5;7381:12;7416:36;7442:9;7416:36;:::i;:::-;7468:89;7550:6;7545:3;7468:89;:::i;:::-;7461:96;;7588:1;7577:9;7573:17;7604:1;7599:137;;;;7750:1;7745:341;;;;7566:520;;7599:137;7683:4;7679:9;7668;7664:25;7659:3;7652:38;7719:6;7714:3;7710:16;7703:23;;7599:137;;7745:341;7812:38;7844:5;7812:38;:::i;:::-;7872:1;7886:154;7900:6;7897:1;7894:13;7886:154;;;7974:7;7968:14;7964:1;7959:3;7955:11;7948:35;8024:1;8015:7;8011:15;8000:26;;7922:4;7919:1;7915:12;7910:17;;7886:154;;;8069:6;8064:3;8060:16;8053:23;;7752:334;;7566:520;;7354:738;;7247:845;;;;:::o;8098:366::-;8240:3;8261:67;8325:2;8320:3;8261:67;:::i;:::-;8254:74;;8337:93;8426:3;8337:93;:::i;:::-;8455:2;8450:3;8446:12;8439:19;;8098:366;;;:::o;8470:::-;8612:3;8633:67;8697:2;8692:3;8633:67;:::i;:::-;8626:74;;8709:93;8798:3;8709:93;:::i;:::-;8827:2;8822:3;8818:12;8811:19;;8470:366;;;:::o;8842:::-;8984:3;9005:67;9069:2;9064:3;9005:67;:::i;:::-;8998:74;;9081:93;9170:3;9081:93;:::i;:::-;9199:2;9194:3;9190:12;9183:19;;8842:366;;;:::o;9214:::-;9356:3;9377:67;9441:2;9436:3;9377:67;:::i;:::-;9370:74;;9453:93;9542:3;9453:93;:::i;:::-;9571:2;9566:3;9562:12;9555:19;;9214:366;;;:::o;9586:::-;9728:3;9749:67;9813:2;9808:3;9749:67;:::i;:::-;9742:74;;9825:93;9914:3;9825:93;:::i;:::-;9943:2;9938:3;9934:12;9927:19;;9586:366;;;:::o;9958:::-;10100:3;10121:67;10185:2;10180:3;10121:67;:::i;:::-;10114:74;;10197:93;10286:3;10197:93;:::i;:::-;10315:2;10310:3;10306:12;10299:19;;9958:366;;;:::o;10330:::-;10472:3;10493:67;10557:2;10552:3;10493:67;:::i;:::-;10486:74;;10569:93;10658:3;10569:93;:::i;:::-;10687:2;10682:3;10678:12;10671:19;;10330:366;;;:::o;10702:::-;10844:3;10865:67;10929:2;10924:3;10865:67;:::i;:::-;10858:74;;10941:93;11030:3;10941:93;:::i;:::-;11059:2;11054:3;11050:12;11043:19;;10702:366;;;:::o;11074:::-;11216:3;11237:67;11301:2;11296:3;11237:67;:::i;:::-;11230:74;;11313:93;11402:3;11313:93;:::i;:::-;11431:2;11426:3;11422:12;11415:19;;11074:366;;;:::o;11446:::-;11588:3;11609:67;11673:2;11668:3;11609:67;:::i;:::-;11602:74;;11685:93;11774:3;11685:93;:::i;:::-;11803:2;11798:3;11794:12;11787:19;;11446:366;;;:::o;11818:::-;11960:3;11981:67;12045:2;12040:3;11981:67;:::i;:::-;11974:74;;12057:93;12146:3;12057:93;:::i;:::-;12175:2;12170:3;12166:12;12159:19;;11818:366;;;:::o;12190:::-;12332:3;12353:67;12417:2;12412:3;12353:67;:::i;:::-;12346:74;;12429:93;12518:3;12429:93;:::i;:::-;12547:2;12542:3;12538:12;12531:19;;12190:366;;;:::o;12562:::-;12704:3;12725:67;12789:2;12784:3;12725:67;:::i;:::-;12718:74;;12801:93;12890:3;12801:93;:::i;:::-;12919:2;12914:3;12910:12;12903:19;;12562:366;;;:::o;12934:::-;13076:3;13097:67;13161:2;13156:3;13097:67;:::i;:::-;13090:74;;13173:93;13262:3;13173:93;:::i;:::-;13291:2;13286:3;13282:12;13275:19;;12934:366;;;:::o;13306:::-;13448:3;13469:67;13533:2;13528:3;13469:67;:::i;:::-;13462:74;;13545:93;13634:3;13545:93;:::i;:::-;13663:2;13658:3;13654:12;13647:19;;13306:366;;;:::o;13678:::-;13820:3;13841:67;13905:2;13900:3;13841:67;:::i;:::-;13834:74;;13917:93;14006:3;13917:93;:::i;:::-;14035:2;14030:3;14026:12;14019:19;;13678:366;;;:::o;14050:::-;14192:3;14213:67;14277:2;14272:3;14213:67;:::i;:::-;14206:74;;14289:93;14378:3;14289:93;:::i;:::-;14407:2;14402:3;14398:12;14391:19;;14050:366;;;:::o;14422:::-;14564:3;14585:67;14649:2;14644:3;14585:67;:::i;:::-;14578:74;;14661:93;14750:3;14661:93;:::i;:::-;14779:2;14774:3;14770:12;14763:19;;14422:366;;;:::o;14794:::-;14936:3;14957:67;15021:2;15016:3;14957:67;:::i;:::-;14950:74;;15033:93;15122:3;15033:93;:::i;:::-;15151:2;15146:3;15142:12;15135:19;;14794:366;;;:::o;15166:118::-;15253:24;15271:5;15253:24;:::i;:::-;15248:3;15241:37;15166:118;;:::o;15290:275::-;15422:3;15444:95;15535:3;15526:6;15444:95;:::i;:::-;15437:102;;15556:3;15549:10;;15290:275;;;;:::o;15571:1069::-;15940:3;15962:95;16053:3;16044:6;15962:95;:::i;:::-;15955:102;;16074:95;16165:3;16156:6;16074:95;:::i;:::-;16067:102;;16186:95;16277:3;16268:6;16186:95;:::i;:::-;16179:102;;16298:95;16389:3;16380:6;16298:95;:::i;:::-;16291:102;;16410:95;16501:3;16492:6;16410:95;:::i;:::-;16403:102;;16522:92;16610:3;16601:6;16522:92;:::i;:::-;16515:99;;16631:3;16624:10;;15571:1069;;;;;;;;;:::o;16646:1377::-;17105:3;17127:95;17218:3;17209:6;17127:95;:::i;:::-;17120:102;;17239:95;17330:3;17321:6;17239:95;:::i;:::-;17232:102;;17351:92;17439:3;17430:6;17351:92;:::i;:::-;17344:99;;17460:95;17551:3;17542:6;17460:95;:::i;:::-;17453:102;;17572:92;17660:3;17651:6;17572:92;:::i;:::-;17565:99;;17681:95;17772:3;17763:6;17681:95;:::i;:::-;17674:102;;17793:92;17881:3;17872:6;17793:92;:::i;:::-;17786:99;;17902:95;17993:3;17984:6;17902:95;:::i;:::-;17895:102;;18014:3;18007:10;;16646:1377;;;;;;;;;;;:::o;18029:1531::-;18533:3;18555:95;18646:3;18637:6;18555:95;:::i;:::-;18548:102;;18667:95;18758:3;18749:6;18667:95;:::i;:::-;18660:102;;18779:92;18867:3;18858:6;18779:92;:::i;:::-;18772:99;;18888:95;18979:3;18970:6;18888:95;:::i;:::-;18881:102;;19000:92;19088:3;19079:6;19000:92;:::i;:::-;18993:99;;19109:95;19200:3;19191:6;19109:95;:::i;:::-;19102:102;;19221:92;19309:3;19300:6;19221:92;:::i;:::-;19214:99;;19330:95;19421:3;19412:6;19330:95;:::i;:::-;19323:102;;19442:92;19530:3;19521:6;19442:92;:::i;:::-;19435:99;;19551:3;19544:10;;18029:1531;;;;;;;;;;;;:::o;19566:429::-;19743:3;19765:95;19856:3;19847:6;19765:95;:::i;:::-;19758:102;;19877:92;19965:3;19956:6;19877:92;:::i;:::-;19870:99;;19986:3;19979:10;;19566:429;;;;;:::o;20001:743::-;20271:3;20293:95;20384:3;20375:6;20293:95;:::i;:::-;20286:102;;20405:92;20493:3;20484:6;20405:92;:::i;:::-;20398:99;;20514:95;20605:3;20596:6;20514:95;:::i;:::-;20507:102;;20626:92;20714:3;20705:6;20626:92;:::i;:::-;20619:99;;20735:3;20728:10;;20001:743;;;;;;;:::o;20750:1057::-;21113:3;21135:95;21226:3;21217:6;21135:95;:::i;:::-;21128:102;;21247:92;21335:3;21326:6;21247:92;:::i;:::-;21240:99;;21356:95;21447:3;21438:6;21356:95;:::i;:::-;21349:102;;21468:92;21556:3;21547:6;21468:92;:::i;:::-;21461:99;;21577:95;21668:3;21659:6;21577:95;:::i;:::-;21570:102;;21689:92;21777:3;21768:6;21689:92;:::i;:::-;21682:99;;21798:3;21791:10;;20750:1057;;;;;;;;;:::o;21813:1685::-;22362:3;22384:95;22475:3;22466:6;22384:95;:::i;:::-;22377:102;;22496:92;22584:3;22575:6;22496:92;:::i;:::-;22489:99;;22605:95;22696:3;22687:6;22605:95;:::i;:::-;22598:102;;22717:92;22805:3;22796:6;22717:92;:::i;:::-;22710:99;;22826:95;22917:3;22908:6;22826:95;:::i;:::-;22819:102;;22938:92;23026:3;23017:6;22938:92;:::i;:::-;22931:99;;23047:95;23138:3;23129:6;23047:95;:::i;:::-;23040:102;;23159:92;23247:3;23238:6;23159:92;:::i;:::-;23152:99;;23268:95;23359:3;23350:6;23268:95;:::i;:::-;23261:102;;23380:92;23468:3;23459:6;23380:92;:::i;:::-;23373:99;;23489:3;23482:10;;21813:1685;;;;;;;;;;;;;:::o;23504:1513::-;23999:3;24021:95;24112:3;24103:6;24021:95;:::i;:::-;24014:102;;24133:92;24221:3;24212:6;24133:92;:::i;:::-;24126:99;;24242:92;24330:3;24321:6;24242:92;:::i;:::-;24235:99;;24351:92;24439:3;24430:6;24351:92;:::i;:::-;24344:99;;24460:92;24548:3;24539:6;24460:92;:::i;:::-;24453:99;;24569:95;24660:3;24651:6;24569:95;:::i;:::-;24562:102;;24681:92;24769:3;24760:6;24681:92;:::i;:::-;24674:99;;24790:92;24878:3;24869:6;24790:92;:::i;:::-;24783:99;;24899:92;24987:3;24978:6;24899:92;:::i;:::-;24892:99;;25008:3;25001:10;;23504:1513;;;;;;;;;;;;:::o;25023:429::-;25200:3;25222:92;25310:3;25301:6;25222:92;:::i;:::-;25215:99;;25331:95;25422:3;25413:6;25331:95;:::i;:::-;25324:102;;25443:3;25436:10;;25023:429;;;;;:::o;25458:903::-;25776:3;25798:92;25886:3;25877:6;25798:92;:::i;:::-;25791:99;;25907:95;25998:3;25989:6;25907:95;:::i;:::-;25900:102;;26019:95;26110:3;26101:6;26019:95;:::i;:::-;26012:102;;26131:95;26222:3;26213:6;26131:95;:::i;:::-;26124:102;;26243:92;26331:3;26322:6;26243:92;:::i;:::-;26236:99;;26352:3;26345:10;;25458:903;;;;;;;;:::o;26367:897::-;26682:3;26704:92;26792:3;26783:6;26704:92;:::i;:::-;26697:99;;26813:95;26904:3;26895:6;26813:95;:::i;:::-;26806:102;;26925:92;27013:3;27004:6;26925:92;:::i;:::-;26918:99;;27034:95;27125:3;27116:6;27034:95;:::i;:::-;27027:102;;27146:92;27234:3;27225:6;27146:92;:::i;:::-;27139:99;;27255:3;27248:10;;26367:897;;;;;;;;:::o;27270:1057::-;27633:3;27655:92;27743:3;27734:6;27655:92;:::i;:::-;27648:99;;27764:95;27855:3;27846:6;27764:95;:::i;:::-;27757:102;;27876:92;27964:3;27955:6;27876:92;:::i;:::-;27869:99;;27985:95;28076:3;28067:6;27985:95;:::i;:::-;27978:102;;28097:92;28185:3;28176:6;28097:92;:::i;:::-;28090:99;;28206:95;28297:3;28288:6;28206:95;:::i;:::-;28199:102;;28318:3;28311:10;;27270:1057;;;;;;;;;:::o;28333:577::-;28552:3;28574:92;28662:3;28653:6;28574:92;:::i;:::-;28567:99;;28683:92;28771:3;28762:6;28683:92;:::i;:::-;28676:99;;28792:92;28880:3;28871:6;28792:92;:::i;:::-;28785:99;;28901:3;28894:10;;28333:577;;;;;;:::o;28916:891::-;29228:3;29250:92;29338:3;29329:6;29250:92;:::i;:::-;29243:99;;29359:92;29447:3;29438:6;29359:92;:::i;:::-;29352:99;;29468:92;29556:3;29547:6;29468:92;:::i;:::-;29461:99;;29577:95;29668:3;29659:6;29577:95;:::i;:::-;29570:102;;29689:92;29777:3;29768:6;29689:92;:::i;:::-;29682:99;;29798:3;29791:10;;28916:891;;;;;;;;:::o;29813:885::-;30122:3;30144:92;30232:3;30223:6;30144:92;:::i;:::-;30137:99;;30253:92;30341:3;30332:6;30253:92;:::i;:::-;30246:99;;30362:92;30450:3;30441:6;30362:92;:::i;:::-;30355:99;;30471:92;30559:3;30550:6;30471:92;:::i;:::-;30464:99;;30580:92;30668:3;30659:6;30580:92;:::i;:::-;30573:99;;30689:3;30682:10;;29813:885;;;;;;;;:::o;30704:222::-;30797:4;30835:2;30824:9;30820:18;30812:26;;30848:71;30916:1;30905:9;30901:17;30892:6;30848:71;:::i;:::-;30704:222;;;;:::o;30932:640::-;31127:4;31165:3;31154:9;31150:19;31142:27;;31179:71;31247:1;31236:9;31232:17;31223:6;31179:71;:::i;:::-;31260:72;31328:2;31317:9;31313:18;31304:6;31260:72;:::i;:::-;31342;31410:2;31399:9;31395:18;31386:6;31342:72;:::i;:::-;31461:9;31455:4;31451:20;31446:2;31435:9;31431:18;31424:48;31489:76;31560:4;31551:6;31489:76;:::i;:::-;31481:84;;30932:640;;;;;;;:::o;31578:210::-;31665:4;31703:2;31692:9;31688:18;31680:26;;31716:65;31778:1;31767:9;31763:17;31754:6;31716:65;:::i;:::-;31578:210;;;;:::o;31794:313::-;31907:4;31945:2;31934:9;31930:18;31922:26;;31994:9;31988:4;31984:20;31980:1;31969:9;31965:17;31958:47;32022:78;32095:4;32086:6;32022:78;:::i;:::-;32014:86;;31794:313;;;;:::o;32113:419::-;32279:4;32317:2;32306:9;32302:18;32294:26;;32366:9;32360:4;32356:20;32352:1;32341:9;32337:17;32330:47;32394:131;32520:4;32394:131;:::i;:::-;32386:139;;32113:419;;;:::o;32538:::-;32704:4;32742:2;32731:9;32727:18;32719:26;;32791:9;32785:4;32781:20;32777:1;32766:9;32762:17;32755:47;32819:131;32945:4;32819:131;:::i;:::-;32811:139;;32538:419;;;:::o;32963:::-;33129:4;33167:2;33156:9;33152:18;33144:26;;33216:9;33210:4;33206:20;33202:1;33191:9;33187:17;33180:47;33244:131;33370:4;33244:131;:::i;:::-;33236:139;;32963:419;;;:::o;33388:::-;33554:4;33592:2;33581:9;33577:18;33569:26;;33641:9;33635:4;33631:20;33627:1;33616:9;33612:17;33605:47;33669:131;33795:4;33669:131;:::i;:::-;33661:139;;33388:419;;;:::o;33813:::-;33979:4;34017:2;34006:9;34002:18;33994:26;;34066:9;34060:4;34056:20;34052:1;34041:9;34037:17;34030:47;34094:131;34220:4;34094:131;:::i;:::-;34086:139;;33813:419;;;:::o;34238:::-;34404:4;34442:2;34431:9;34427:18;34419:26;;34491:9;34485:4;34481:20;34477:1;34466:9;34462:17;34455:47;34519:131;34645:4;34519:131;:::i;:::-;34511:139;;34238:419;;;:::o;34663:::-;34829:4;34867:2;34856:9;34852:18;34844:26;;34916:9;34910:4;34906:20;34902:1;34891:9;34887:17;34880:47;34944:131;35070:4;34944:131;:::i;:::-;34936:139;;34663:419;;;:::o;35088:::-;35254:4;35292:2;35281:9;35277:18;35269:26;;35341:9;35335:4;35331:20;35327:1;35316:9;35312:17;35305:47;35369:131;35495:4;35369:131;:::i;:::-;35361:139;;35088:419;;;:::o;35513:::-;35679:4;35717:2;35706:9;35702:18;35694:26;;35766:9;35760:4;35756:20;35752:1;35741:9;35737:17;35730:47;35794:131;35920:4;35794:131;:::i;:::-;35786:139;;35513:419;;;:::o;35938:::-;36104:4;36142:2;36131:9;36127:18;36119:26;;36191:9;36185:4;36181:20;36177:1;36166:9;36162:17;36155:47;36219:131;36345:4;36219:131;:::i;:::-;36211:139;;35938:419;;;:::o;36363:::-;36529:4;36567:2;36556:9;36552:18;36544:26;;36616:9;36610:4;36606:20;36602:1;36591:9;36587:17;36580:47;36644:131;36770:4;36644:131;:::i;:::-;36636:139;;36363:419;;;:::o;36788:::-;36954:4;36992:2;36981:9;36977:18;36969:26;;37041:9;37035:4;37031:20;37027:1;37016:9;37012:17;37005:47;37069:131;37195:4;37069:131;:::i;:::-;37061:139;;36788:419;;;:::o;37213:::-;37379:4;37417:2;37406:9;37402:18;37394:26;;37466:9;37460:4;37456:20;37452:1;37441:9;37437:17;37430:47;37494:131;37620:4;37494:131;:::i;:::-;37486:139;;37213:419;;;:::o;37638:::-;37804:4;37842:2;37831:9;37827:18;37819:26;;37891:9;37885:4;37881:20;37877:1;37866:9;37862:17;37855:47;37919:131;38045:4;37919:131;:::i;:::-;37911:139;;37638:419;;;:::o;38063:::-;38229:4;38267:2;38256:9;38252:18;38244:26;;38316:9;38310:4;38306:20;38302:1;38291:9;38287:17;38280:47;38344:131;38470:4;38344:131;:::i;:::-;38336:139;;38063:419;;;:::o;38488:::-;38654:4;38692:2;38681:9;38677:18;38669:26;;38741:9;38735:4;38731:20;38727:1;38716:9;38712:17;38705:47;38769:131;38895:4;38769:131;:::i;:::-;38761:139;;38488:419;;;:::o;38913:::-;39079:4;39117:2;39106:9;39102:18;39094:26;;39166:9;39160:4;39156:20;39152:1;39141:9;39137:17;39130:47;39194:131;39320:4;39194:131;:::i;:::-;39186:139;;38913:419;;;:::o;39338:::-;39504:4;39542:2;39531:9;39527:18;39519:26;;39591:9;39585:4;39581:20;39577:1;39566:9;39562:17;39555:47;39619:131;39745:4;39619:131;:::i;:::-;39611:139;;39338:419;;;:::o;39763:::-;39929:4;39967:2;39956:9;39952:18;39944:26;;40016:9;40010:4;40006:20;40002:1;39991:9;39987:17;39980:47;40044:131;40170:4;40044:131;:::i;:::-;40036:139;;39763:419;;;:::o;40188:222::-;40281:4;40319:2;40308:9;40304:18;40296:26;;40332:71;40400:1;40389:9;40385:17;40376:6;40332:71;:::i;:::-;40188:222;;;;:::o;40416:129::-;40450:6;40477:20;;:::i;:::-;40467:30;;40506:33;40534:4;40526:6;40506:33;:::i;:::-;40416:129;;;:::o;40551:75::-;40584:6;40617:2;40611:9;40601:19;;40551:75;:::o;40632:307::-;40693:4;40783:18;40775:6;40772:30;40769:56;;;40805:18;;:::i;:::-;40769:56;40843:29;40865:6;40843:29;:::i;:::-;40835:37;;40927:4;40921;40917:15;40909:23;;40632:307;;;:::o;40945:141::-;40994:4;41017:3;41009:11;;41040:3;41037:1;41030:14;41074:4;41071:1;41061:18;41053:26;;40945:141;;;:::o;41092:98::-;41143:6;41177:5;41171:12;41161:22;;41092:98;;;:::o;41196:99::-;41248:6;41282:5;41276:12;41266:22;;41196:99;;;:::o;41301:168::-;41384:11;41418:6;41413:3;41406:19;41458:4;41453:3;41449:14;41434:29;;41301:168;;;;:::o;41475:169::-;41559:11;41593:6;41588:3;41581:19;41633:4;41628:3;41624:14;41609:29;;41475:169;;;;:::o;41650:148::-;41752:11;41789:3;41774:18;;41650:148;;;;:::o;41804:305::-;41844:3;41863:20;41881:1;41863:20;:::i;:::-;41858:25;;41897:20;41915:1;41897:20;:::i;:::-;41892:25;;42051:1;41983:66;41979:74;41976:1;41973:81;41970:107;;;42057:18;;:::i;:::-;41970:107;42101:1;42098;42094:9;42087:16;;41804:305;;;;:::o;42115:185::-;42155:1;42172:20;42190:1;42172:20;:::i;:::-;42167:25;;42206:20;42224:1;42206:20;:::i;:::-;42201:25;;42245:1;42235:35;;42250:18;;:::i;:::-;42235:35;42292:1;42289;42285:9;42280:14;;42115:185;;;;:::o;42306:348::-;42346:7;42369:20;42387:1;42369:20;:::i;:::-;42364:25;;42403:20;42421:1;42403:20;:::i;:::-;42398:25;;42591:1;42523:66;42519:74;42516:1;42513:81;42508:1;42501:9;42494:17;42490:105;42487:131;;;42598:18;;:::i;:::-;42487:131;42646:1;42643;42639:9;42628:20;;42306:348;;;;:::o;42660:191::-;42700:4;42720:20;42738:1;42720:20;:::i;:::-;42715:25;;42754:20;42772:1;42754:20;:::i;:::-;42749:25;;42793:1;42790;42787:8;42784:34;;;42798:18;;:::i;:::-;42784:34;42843:1;42840;42836:9;42828:17;;42660:191;;;;:::o;42857:185::-;42895:4;42915:18;42931:1;42915:18;:::i;:::-;42910:23;;42947:18;42963:1;42947:18;:::i;:::-;42942:23;;42984:1;42981;42978:8;42975:34;;;42989:18;;:::i;:::-;42975:34;43034:1;43031;43027:9;43019:17;;42857:185;;;;:::o;43048:96::-;43085:7;43114:24;43132:5;43114:24;:::i;:::-;43103:35;;43048:96;;;:::o;43150:90::-;43184:7;43227:5;43220:13;43213:21;43202:32;;43150:90;;;:::o;43246:149::-;43282:7;43322:66;43315:5;43311:78;43300:89;;43246:149;;;:::o;43401:126::-;43438:7;43478:42;43471:5;43467:54;43456:65;;43401:126;;;:::o;43533:77::-;43570:7;43599:5;43588:16;;43533:77;;;:::o;43616:86::-;43651:7;43691:4;43684:5;43680:16;43669:27;;43616:86;;;:::o;43708:154::-;43792:6;43787:3;43782;43769:30;43854:1;43845:6;43840:3;43836:16;43829:27;43708:154;;;:::o;43868:307::-;43936:1;43946:113;43960:6;43957:1;43954:13;43946:113;;;44045:1;44040:3;44036:11;44030:18;44026:1;44021:3;44017:11;44010:39;43982:2;43979:1;43975:10;43970:15;;43946:113;;;44077:6;44074:1;44071:13;44068:101;;;44157:1;44148:6;44143:3;44139:16;44132:27;44068:101;43917:258;43868:307;;;:::o;44181:320::-;44225:6;44262:1;44256:4;44252:12;44242:22;;44309:1;44303:4;44299:12;44330:18;44320:81;;44386:4;44378:6;44374:17;44364:27;;44320:81;44448:2;44440:6;44437:14;44417:18;44414:38;44411:84;;;44467:18;;:::i;:::-;44411:84;44232:269;44181:320;;;:::o;44507:281::-;44590:27;44612:4;44590:27;:::i;:::-;44582:6;44578:40;44720:6;44708:10;44705:22;44684:18;44672:10;44669:34;44666:62;44663:88;;;44731:18;;:::i;:::-;44663:88;44771:10;44767:2;44760:22;44550:238;44507:281;;:::o;44794:233::-;44833:3;44856:24;44874:5;44856:24;:::i;:::-;44847:33;;44902:66;44895:5;44892:77;44889:103;;;44972:18;;:::i;:::-;44889:103;45019:1;45012:5;45008:13;45001:20;;44794:233;;;:::o;45033:167::-;45070:3;45093:22;45109:5;45093:22;:::i;:::-;45084:31;;45137:4;45130:5;45127:15;45124:41;;;45145:18;;:::i;:::-;45124:41;45192:1;45185:5;45181:13;45174:20;;45033:167;;;:::o;45206:176::-;45238:1;45255:20;45273:1;45255:20;:::i;:::-;45250:25;;45289:20;45307:1;45289:20;:::i;:::-;45284:25;;45328:1;45318:35;;45333:18;;:::i;:::-;45318:35;45374:1;45371;45367:9;45362:14;;45206:176;;;;:::o;45388:180::-;45436:77;45433:1;45426:88;45533:4;45530:1;45523:15;45557:4;45554:1;45547:15;45574:180;45622:77;45619:1;45612:88;45719:4;45716:1;45709:15;45743:4;45740:1;45733:15;45760:180;45808:77;45805:1;45798:88;45905:4;45902:1;45895:15;45929:4;45926:1;45919:15;45946:180;45994:77;45991:1;45984:88;46091:4;46088:1;46081:15;46115:4;46112:1;46105:15;46132:180;46180:77;46177:1;46170:88;46277:4;46274:1;46267:15;46301:4;46298:1;46291:15;46318:180;46366:77;46363:1;46356:88;46463:4;46460:1;46453:15;46487:4;46484:1;46477:15;46504:117;46613:1;46610;46603:12;46627:117;46736:1;46733;46726:12;46750:117;46859:1;46856;46849:12;46873:117;46982:1;46979;46972:12;46996:102;47037:6;47088:2;47084:7;47079:2;47072:5;47068:14;47064:28;47054:38;;46996:102;;;:::o;47104:230::-;47244:34;47240:1;47232:6;47228:14;47221:58;47313:13;47308:2;47300:6;47296:15;47289:38;47104:230;:::o;47340:237::-;47480:34;47476:1;47468:6;47464:14;47457:58;47549:20;47544:2;47536:6;47532:15;47525:45;47340:237;:::o;47583:225::-;47723:34;47719:1;47711:6;47707:14;47700:58;47792:8;47787:2;47779:6;47775:15;47768:33;47583:225;:::o;47814:178::-;47954:30;47950:1;47942:6;47938:14;47931:54;47814:178;:::o;47998:223::-;48138:34;48134:1;48126:6;48122:14;48115:58;48207:6;48202:2;48194:6;48190:15;48183:31;47998:223;:::o;48227:175::-;48367:27;48363:1;48355:6;48351:14;48344:51;48227:175;:::o;48408:231::-;48548:34;48544:1;48536:6;48532:14;48525:58;48617:14;48612:2;48604:6;48600:15;48593:39;48408:231;:::o;48645:243::-;48785:34;48781:1;48773:6;48769:14;48762:58;48854:26;48849:2;48841:6;48837:15;48830:51;48645:243;:::o;48894:229::-;49034:34;49030:1;49022:6;49018:14;49011:58;49103:12;49098:2;49090:6;49086:15;49079:37;48894:229;:::o;49129:228::-;49269:34;49265:1;49257:6;49253:14;49246:58;49338:11;49333:2;49325:6;49321:15;49314:36;49129:228;:::o;49363:182::-;49503:34;49499:1;49491:6;49487:14;49480:58;49363:182;:::o;49551:231::-;49691:34;49687:1;49679:6;49675:14;49668:58;49760:14;49755:2;49747:6;49743:15;49736:39;49551:231;:::o;49788:182::-;49928:34;49924:1;49916:6;49912:14;49905:58;49788:182;:::o;49976:228::-;50116:34;50112:1;50104:6;50100:14;50093:58;50185:11;50180:2;50172:6;50168:15;50161:36;49976:228;:::o;50210:220::-;50350:34;50346:1;50338:6;50334:14;50327:58;50419:3;50414:2;50406:6;50402:15;50395:28;50210:220;:::o;50436:236::-;50576:34;50572:1;50564:6;50560:14;50553:58;50645:19;50640:2;50632:6;50628:15;50621:44;50436:236;:::o;50678:231::-;50818:34;50814:1;50806:6;50802:14;50795:58;50887:14;50882:2;50874:6;50870:15;50863:39;50678:231;:::o;50915:181::-;51055:33;51051:1;51043:6;51039:14;51032:57;50915:181;:::o;51102:162::-;51242:14;51238:1;51230:6;51226:14;51219:38;51102:162;:::o;51270:122::-;51343:24;51361:5;51343:24;:::i;:::-;51336:5;51333:35;51323:63;;51382:1;51379;51372:12;51323:63;51270:122;:::o;51398:116::-;51468:21;51483:5;51468:21;:::i;:::-;51461:5;51458:32;51448:60;;51504:1;51501;51494:12;51448:60;51398:116;:::o;51520:120::-;51592:23;51609:5;51592:23;:::i;:::-;51585:5;51582:34;51572:62;;51630:1;51627;51620:12;51572:62;51520:120;:::o;51646:122::-;51719:24;51737:5;51719:24;:::i;:::-;51712:5;51709:35;51699:63;;51758:1;51755;51748:12;51699:63;51646:122;:::o

Swarm Source

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