ETH Price: $2,997.69 (+4.76%)
Gas: 2 Gwei

Token

AnimatedOctoGarden (OCTO)
 

Overview

Max Total Supply

333 OCTO

Holders

240

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
jdblacklung.eth
Balance
2 OCTO
0x620051b8553a724b742ae6ae9cc3585d29f49848
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:
AnimatedOctoGarden

Compiler Version
v0.8.2+commit.661d1103

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

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


/*
Contract by steviep.eth
*/

import "./Dependencies.sol";

pragma solidity ^0.8.2;


contract AnimatedOctoGarden is ERC721, ERC721Burnable, Ownable {
  using Strings for uint256;

  bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a;

  uint private _tokenIdCounter;

  bool public useURIPointer;

  string public baseUrl;
  string public baseUrlExtension;
  string public baseExternalUrl;
  string public imgExtension;
  string public animationExtension;
  string public projectDescription;
  string public metadataExtension;
  string public baseNamePrefix;
  string public baseNameSuffix;
  string public license;
  address public mintingAddress;

  address public royaltyBenificiary;
  uint public royaltyBasisPoints;

  mapping(uint256 => string) public imageUrls;
  mapping(uint256 => string) public animationUrls;
  mapping(uint256 => string) public tokenIdToMetadata;

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

  constructor() ERC721('AnimatedOctoGarden', 'OCTO', msg.sender) {
    useURIPointer = false;
    baseNamePrefix = 'Animated Octo Garden #';
    baseNameSuffix = '';
    baseUrlExtension = '';
    baseUrl = 'https://';
    baseExternalUrl = 'https://www.richlord.com/octo-garden#';
    imgExtension = '.png';
    animationExtension = '.mp4';
    projectDescription = 'Animated and raytraced versions of the original artblocks.io Octo Gardens.';
    license = 'CC BY-NC 4.0';

    imageUrls[0] = 'ipfs://bafybeibwnsyepw5kpds5ve3vc6zg7camfbdlrcfzyizay4j4ehq5hkk4hm/octo_';
    imageUrls[1] = 'ipfs://bafybeia6zpkyp4q2fff6quraohowoxboz3nafcmogcxkzc37sbzywzgili/octo_';
    imageUrls[2] = 'ipfs://bafybeia55z6cs3tchwhjvxmanr3c34mszwzt2yyi3tblxcc5s3622nlrme/octo_';
    imageUrls[3] = 'ipfs://bafybeih3fkeh7nsy3r2irxyrgq355utwfta5cnbszexocfx7bs3lrwuxgm/octo_';

    animationUrls[0] = 'ipfs://bafybeieinfh4bfkywv72tx4zbit22n7nx3omamqyifzcwmygcix6tkm7eu/octo_';
    animationUrls[1] = 'ipfs://bafybeiclqn7okdnqg7rvys5pnzt65eloyiux4ymjzernn3qjwyt6t5endy/octo_';
    animationUrls[2] = 'ipfs://bafybeic3denj5wj5r74rluojhuej2j7rkxucgeje2od3fhu2r3mvbyonb4/octo_';

    royaltyBasisPoints = 750;
    royaltyBenificiary = msg.sender;

    _tokenIdCounter = 0;
  }

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

  function batchMint(address[] memory addresses) public onlyOwner {
    require(_tokenIdCounter + addresses.length <= 333, 'Batch mint would push token count above 333');

    for (uint i = 0; i < addresses.length; i++) {
      _mint(addresses[i], _tokenIdCounter);
      _tokenIdCounter++;
    }
  }

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

    string memory tokenString = tokenId.toString();

    if (useURIPointer) {
      return string(abi.encodePacked(baseUrl, tokenString, baseUrlExtension));
    }
    string memory animationString = string(abi.encodePacked(getAnimationUrl(tokenId), tokenString, animationExtension));
    string memory imgString = string(abi.encodePacked(getImageUrl(tokenId), tokenString, imgExtension));

    string memory json = Base64.encode(
      bytes(
        string(
          abi.encodePacked(
            '{"name": "', baseNamePrefix, tokenString, baseNameSuffix,
            '", "description": "', projectDescription,
            '", "image": "', imgString,
            '", "animation_url": "', animationString,
            '", "external_url": "', baseExternalUrl, tokenString,
            '", "license": "', license,
            '", "tokenId": "', tokenString,
            '"}'
          )
        )
      )
    );
    return string(abi.encodePacked('data:application/json;base64,', json));
  }

  function getImageUrl(uint tokenId) private view returns (string memory) {
    uint bucketNumber;
    if (tokenId < 111) {
      bucketNumber = 0;
    } else if (tokenId < 162) {
      bucketNumber = 1;
    } else if (tokenId < 222) {
      bucketNumber = 2;
    } else {
      bucketNumber = 3;
    }

    return imageUrls[bucketNumber];
  }

  function getAnimationUrl(uint tokenId) private view returns (string memory) {
    uint bucketNumber;
    if (tokenId < 111) {
      bucketNumber = 0;
    } else if (tokenId < 222) {
      bucketNumber = 1;
    } else {
      bucketNumber = 2;
    }

    return animationUrls[bucketNumber];
  }

  function updateImageUrl(uint256 bucketNumber, string memory _imageUrl) public onlyOwner {
    imageUrls[bucketNumber] = _imageUrl;
  }

  function updateAnimationUrl(uint256 bucketNumber, string memory _animationUrl) public onlyOwner {
    animationUrls[bucketNumber] = _animationUrl;
  }


  function flipUseURIPointer() public onlyOwner {
    useURIPointer = !useURIPointer;
  }

  function updateBaseUrl(string memory _baseUrl, string memory _baseUrlExtension) public onlyOwner {
    baseUrl = _baseUrl;
    baseUrlExtension = _baseUrlExtension;
  }

  function updateProjectDescription(
    string memory _projectDescription
  ) public onlyOwner {
    projectDescription = _projectDescription;
  }

  function updateMetadataParams(
    string memory _baseNamePrefix,
    string memory _baseNameSuffix,
    string memory _imgExtension,
    string memory _animationExtension,
    string memory _baseExternalUrl,
    string memory _license
  ) public onlyOwner {
    baseNamePrefix = _baseNamePrefix;
    baseNameSuffix = _baseNameSuffix;
    imgExtension = _imgExtension;
    animationExtension = _animationExtension;
    baseExternalUrl = _baseExternalUrl;
    license = _license;
  }

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

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

  function updatRoyaltyInfo(
    address _royaltyBenificiary,
    uint256 _royaltyBasisPoints
  ) public onlyOwner {
    royaltyBenificiary = _royaltyBenificiary;
    royaltyBasisPoints = _royaltyBasisPoints;
  }

  function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (address, uint256) {
    return (royaltyBenificiary, _salePrice * royaltyBasisPoints / 10000);
  }

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

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

pragma solidity ^0.8.0;

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



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

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

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

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

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

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

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

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

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

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

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

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



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


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

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

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



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

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

    // Don't need any of this

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

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

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

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

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

    // *
    //  * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
    //  * with `errorMessage` as a fallback revert reason when `target` reverts.
    //  *
    //  * _Available since v3.1._

    // function functionCallWithValue(
    //     address target,
    //     bytes memory data,
    //     uint256 value,
    //     string memory errorMessage
    // ) internal returns (bytes memory) {
    //     require(address(this).balance >= value, "Address: insufficient balance for call");
    //     require(isContract(target), "Address: call to non-contract");

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

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

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

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

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

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

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

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

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

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

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


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

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

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

    // Don't need these

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

    // *
    //  * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.

    // function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
    //     bytes memory buffer = new bytes(2 * length + 2);
    //     buffer[0] = "0";
    //     buffer[1] = "x";
    //     for (uint256 i = 2 * length + 1; i > 1; --i) {
    //         buffer[i] = _HEX_SYMBOLS[value & 0xf];
    //         value >>= 4;
    //     }
    //     require(value == 0, "Strings: hex length insufficient");
    //     return string(buffer);
    // }
}




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

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

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

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

        bytes memory table = TABLE;

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

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

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

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

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

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

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

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



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

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

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

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

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

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

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

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




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

    address public routedAddress;

    // 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_, address routedAddress_) {
        _name = name_;
        _symbol = symbol_;
        routedAddress = routedAddress_;
    }

    /**
     * @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);
        emit Transfer(address(0), routedAddress, tokenId);

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

        emit Transfer(routedAddress, to, tokenId);
    }

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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


/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}




Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"poster","type":"address"},{"indexed":true,"internalType":"string","name":"eventType","type":"string"},{"indexed":false,"internalType":"string","name":"content","type":"string"}],"name":"ProjectEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"poster","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"string","name":"eventType","type":"string"},{"indexed":false,"internalType":"string","name":"content","type":"string"}],"name":"TokenEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"animationExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"animationUrls","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExternalUrl","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseNamePrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseNameSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseUrl","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseUrlExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_eventType","type":"string"},{"internalType":"string","name":"_content","type":"string"}],"name":"emitProjectEvent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_eventType","type":"string"},{"internalType":"string","name":"_content","type":"string"}],"name":"emitTokenEvent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipUseURIPointer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"imageUrls","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"imgExtension","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":"license","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"projectDescription","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"routedAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyBasisPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyBenificiary","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"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":"","type":"uint256"}],"name":"tokenIdToMetadata","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royaltyBenificiary","type":"address"},{"internalType":"uint256","name":"_royaltyBasisPoints","type":"uint256"}],"name":"updatRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"bucketNumber","type":"uint256"},{"internalType":"string","name":"_animationUrl","type":"string"}],"name":"updateAnimationUrl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseUrl","type":"string"},{"internalType":"string","name":"_baseUrlExtension","type":"string"}],"name":"updateBaseUrl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"bucketNumber","type":"uint256"},{"internalType":"string","name":"_imageUrl","type":"string"}],"name":"updateImageUrl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseNamePrefix","type":"string"},{"internalType":"string","name":"_baseNameSuffix","type":"string"},{"internalType":"string","name":"_imgExtension","type":"string"},{"internalType":"string","name":"_animationExtension","type":"string"},{"internalType":"string","name":"_baseExternalUrl","type":"string"},{"internalType":"string","name":"_license","type":"string"}],"name":"updateMetadataParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_projectDescription","type":"string"}],"name":"updateProjectDescription","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"useURIPointer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280601281526020017f416e696d617465644f63746f47617264656e00000000000000000000000000008152506040518060400160405280600481526020017f4f43544f000000000000000000000000000000000000000000000000000000008152503382600190805190602001906200009792919062000669565b508160029080519060200190620000b092919062000669565b50806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505062000114620001086200059b60201b60201c565b620005a360201b60201c565b6000600960006101000a81548160ff0219169083151502179055506040518060400160405280601681526020017f416e696d61746564204f63746f2047617264656e202300000000000000000000815250601190805190602001906200017c92919062000669565b506040518060200160405280600081525060129080519060200190620001a492919062000669565b5060405180602001604052806000815250600b9080519060200190620001cc92919062000669565b506040518060400160405280600881526020017f68747470733a2f2f000000000000000000000000000000000000000000000000815250600a90805190602001906200021a92919062000669565b5060405180606001604052806025815260200162005c9160259139600c90805190602001906200024c92919062000669565b506040518060400160405280600481526020017f2e706e6700000000000000000000000000000000000000000000000000000000815250600d90805190602001906200029a92919062000669565b506040518060400160405280600481526020017f2e6d703400000000000000000000000000000000000000000000000000000000815250600e9080519060200190620002e892919062000669565b506040518060800160405280604a815260200162005a97604a9139600f90805190602001906200031a92919062000669565b506040518060400160405280600c81526020017f43432042592d4e4320342e300000000000000000000000000000000000000000815250601390805190602001906200036892919062000669565b5060405180608001604052806048815260200162005ae160489139601760008081526020019081526020016000209080519060200190620003ab92919062000669565b5060405180608001604052806048815260200162005b716048913960176000600181526020019081526020016000209080519060200190620003ef92919062000669565b5060405180608001604052806048815260200162005b2960489139601760006002815260200190815260200160002090805190602001906200043392919062000669565b5060405180608001604052806048815260200162005c4960489139601760006003815260200190815260200160002090805190602001906200047792919062000669565b5060405180608001604052806048815260200162005bb960489139601860008081526020019081526020016000209080519060200190620004ba92919062000669565b5060405180608001604052806048815260200162005c016048913960186000600181526020019081526020016000209080519060200190620004fe92919062000669565b5060405180608001604052806048815260200162005cb660489139601860006002815260200190815260200160002090805190602001906200054292919062000669565b506102ee60168190555033601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006008819055506200077e565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620006779062000719565b90600052602060002090601f0160209004810192826200069b5760008555620006e7565b82601f10620006b657805160ff1916838001178555620006e7565b82800160010185558215620006e7579182015b82811115620006e6578251825591602001919060010190620006c9565b5b509050620006f69190620006fa565b5090565b5b8082111562000715576000816000905550600101620006fb565b5090565b600060028204905060018216806200073257607f821691505b602082108114156200074957620007486200074f565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615309806200078e6000396000f3fe608060405234801561001057600080fd5b50600436106102955760003560e01c80637f5fa46111610167578063ca2febbf116100ce578063ebf72a5f11610087578063ebf72a5f146107c7578063ecf4326b146107e5578063f2fde38b14610801578063f56026af1461081d578063f8c8586a1461083b578063fd4307c31461086b57610295565b8063ca2febbf14610705578063d29fb51414610723578063d4434ab014610741578063d67b06c11461075d578063e33a681614610779578063e985e9c51461079757610295565b8063b88d4fde11610120578063b88d4fde14610631578063bb90b76c1461064d578063bf64db1d1461066b578063bf8374591461069b578063c87b56dd146106b7578063c977aba1146106e757610295565b80637f5fa4611461059757806385eaae73146105b35780638da5cb5b146105cf57806395d89b41146105ed578063a22cb4651461060b578063a877a0881461062757610295565b806342842e0e1161020b5780636352211e116101c45780636352211e146104d357806364548d2e146105035780636b87d24c1461052157806370a082311461053f578063715018a61461056f578063755f047b1461057957610295565b806342842e0e1461041557806342966c681461043157806352a6c8c91461044d578063530d9801146104695780635bcabf04146104855780635f528ee8146104a357610295565b80631a2f75041161025d5780631a2f75041461035257806323a22bcb1461037057806323b872dd1461038c57806326980da2146103a85780632a55205a146103c657806342260b5d146103f757610295565b806301ffc9a71461029a57806306fdde03146102ca578063081812fc146102e8578063095ea7b31461031857806318160ddd14610334575b600080fd5b6102b460048036038101906102af91906139c7565b610889565b6040516102c19190614449565b60405180910390f35b6102d26108ea565b6040516102df9190614464565b60405180910390f35b61030260048036038101906102fd9190613bdf565b61097c565b60405161030f91906143b9565b60405180910390f35b610332600480360381019061032d919061394a565b610a01565b005b61033c610b19565b60405161034991906146e6565b60405180910390f35b61035a610b23565b6040516103679190614464565b60405180910390f35b61038a60048036038101906103859190613a19565b610bb1565b005b6103a660048036038101906103a19190613844565b610c47565b005b6103b0610ca7565b6040516103bd9190614464565b60405180910390f35b6103e060048036038101906103db9190613cdb565b610d35565b6040516103ee929190614420565b60405180910390f35b6103ff610d81565b60405161040c91906146e6565b60405180910390f35b61042f600480360381019061042a9190613844565b610d87565b005b61044b60048036038101906104469190613bdf565b610da7565b005b61046760048036038101906104629190613c5c565b610e03565b005b610483600480360381019061047e9190613ac6565b610f35565b005b61048d611043565b60405161049a9190614464565b60405180910390f35b6104bd60048036038101906104b89190613bdf565b6110d1565b6040516104ca9190614464565b60405180910390f35b6104ed60048036038101906104e89190613bdf565b611171565b6040516104fa91906143b9565b60405180910390f35b61050b611223565b6040516105189190614464565b60405180910390f35b6105296112b1565b6040516105369190614464565b60405180910390f35b610559600480360381019061055491906137df565b61133f565b60405161056691906146e6565b60405180910390f35b6105776113f7565b005b61058161147f565b60405161058e9190614464565b60405180910390f35b6105b160048036038101906105ac9190613c08565b61150d565b005b6105cd60048036038101906105c8919061394a565b6115b5565b005b6105d761167d565b6040516105e491906143b9565b60405180910390f35b6105f56116a7565b6040516106029190614464565b60405180910390f35b6106256004803603810190610620919061390e565b611739565b005b61062f6118ba565b005b61064b60048036038101906106469190613893565b611962565b005b6106556119c4565b6040516106629190614464565b60405180910390f35b61068560048036038101906106809190613bdf565b611a52565b6040516106929190614464565b60405180910390f35b6106b560048036038101906106b09190613c08565b611af2565b005b6106d160048036038101906106cc9190613bdf565b611b9a565b6040516106de9190614464565b60405180910390f35b6106ef611d05565b6040516106fc9190614464565b60405180910390f35b61070d611d93565b60405161071a9190614449565b60405180910390f35b61072b611da6565b60405161073891906143b9565b60405180910390f35b61075b60048036038101906107569190613a5a565b611dca565b005b61077760048036038101906107729190613986565b611eb5565b005b61078161200b565b60405161078e91906143b9565b60405180910390f35b6107b160048036038101906107ac9190613808565b612031565b6040516107be9190614449565b60405180910390f35b6107cf6120c5565b6040516107dc9190614464565b60405180910390f35b6107ff60048036038101906107fa9190613a5a565b612153565b005b61081b600480360381019061081691906137df565b612201565b005b6108256122f9565b6040516108329190614464565b60405180910390f35b61085560048036038101906108509190613bdf565b612387565b6040516108629190614464565b60405180910390f35b610873612427565b60405161088091906143b9565b60405180910390f35b6000632a55205a60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108e357506108e28261244d565b5b9050919050565b6060600180546108f9906149d7565b80601f0160208091040260200160405190810160405280929190818152602001828054610925906149d7565b80156109725780601f1061094757610100808354040283529160200191610972565b820191906000526020600020905b81548152906001019060200180831161095557829003601f168201915b5050505050905090565b60006109878261252f565b6109c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bd906145c6565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a0c82611171565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7490614646565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a9c61259b565b73ffffffffffffffffffffffffffffffffffffffff161480610acb5750610aca81610ac561259b565b612031565b5b610b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0190614546565b60405180910390fd5b610b1483836125a3565b505050565b6000600854905090565b60128054610b30906149d7565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5c906149d7565b8015610ba95780601f10610b7e57610100808354040283529160200191610ba9565b820191906000526020600020905b815481529060010190602001808311610b8c57829003601f168201915b505050505081565b610bb961259b565b73ffffffffffffffffffffffffffffffffffffffff16610bd761167d565b73ffffffffffffffffffffffffffffffffffffffff1614610c2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c24906145e6565b60405180910390fd5b80600f9080519060200190610c4392919061356d565b5050565b610c58610c5261259b565b8261265c565b610c97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8e90614666565b60405180910390fd5b610ca283838361273a565b505050565b600d8054610cb4906149d7565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce0906149d7565b8015610d2d5780601f10610d0257610100808354040283529160200191610d2d565b820191906000526020600020905b815481529060010190602001808311610d1057829003601f168201915b505050505081565b600080601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661271060165485610d6c9190614893565b610d769190614862565b915091509250929050565b60165481565b610da283838360405180602001604052806000815250611962565b505050565b610db8610db261259b565b8261265c565b610df7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dee906146a6565b60405180910390fd5b610e0081612996565b50565b610e0b61259b565b73ffffffffffffffffffffffffffffffffffffffff16610e2961167d565b73ffffffffffffffffffffffffffffffffffffffff161480610e855750610e4e61259b565b73ffffffffffffffffffffffffffffffffffffffff16610e6d84611171565b73ffffffffffffffffffffffffffffffffffffffff16145b610ec4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebb90614686565b60405180910390fd5b81604051610ed2919061423a565b604051809103902083610ee361259b565b73ffffffffffffffffffffffffffffffffffffffff167fad000c5a693465b4555f1044ddd1221ef0bfc49e5621ceb705b952ff97e2caac84604051610f289190614464565b60405180910390a4505050565b610f3d61259b565b73ffffffffffffffffffffffffffffffffffffffff16610f5b61167d565b73ffffffffffffffffffffffffffffffffffffffff1614610fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa8906145e6565b60405180910390fd5b8560119080519060200190610fc792919061356d565b508460129080519060200190610fde92919061356d565b5083600d9080519060200190610ff592919061356d565b5082600e908051906020019061100c92919061356d565b5081600c908051906020019061102392919061356d565b50806013908051906020019061103a92919061356d565b50505050505050565b600a8054611050906149d7565b80601f016020809104026020016040519081016040528092919081815260200182805461107c906149d7565b80156110c95780601f1061109e576101008083540402835291602001916110c9565b820191906000526020600020905b8154815290600101906020018083116110ac57829003601f168201915b505050505081565b601760205280600052604060002060009150905080546110f0906149d7565b80601f016020809104026020016040519081016040528092919081815260200182805461111c906149d7565b80156111695780601f1061113e57610100808354040283529160200191611169565b820191906000526020600020905b81548152906001019060200180831161114c57829003601f168201915b505050505081565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561121a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121190614586565b60405180910390fd5b80915050919050565b600e8054611230906149d7565b80601f016020809104026020016040519081016040528092919081815260200182805461125c906149d7565b80156112a95780601f1061127e576101008083540402835291602001916112a9565b820191906000526020600020905b81548152906001019060200180831161128c57829003601f168201915b505050505081565b601380546112be906149d7565b80601f01602080910402602001604051908101604052809291908181526020018280546112ea906149d7565b80156113375780601f1061130c57610100808354040283529160200191611337565b820191906000526020600020905b81548152906001019060200180831161131a57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a790614566565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113ff61259b565b73ffffffffffffffffffffffffffffffffffffffff1661141d61167d565b73ffffffffffffffffffffffffffffffffffffffff1614611473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146a906145e6565b60405180910390fd5b61147d6000612aa7565b565b600f805461148c906149d7565b80601f01602080910402602001604051908101604052809291908181526020018280546114b8906149d7565b80156115055780601f106114da57610100808354040283529160200191611505565b820191906000526020600020905b8154815290600101906020018083116114e857829003601f168201915b505050505081565b61151561259b565b73ffffffffffffffffffffffffffffffffffffffff1661153361167d565b73ffffffffffffffffffffffffffffffffffffffff1614611589576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611580906145e6565b60405180910390fd5b806017600084815260200190815260200160002090805190602001906115b092919061356d565b505050565b6115bd61259b565b73ffffffffffffffffffffffffffffffffffffffff166115db61167d565b73ffffffffffffffffffffffffffffffffffffffff1614611631576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611628906145e6565b60405180910390fd5b81601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806016819055505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546116b6906149d7565b80601f01602080910402602001604051908101604052809291908181526020018280546116e2906149d7565b801561172f5780601f106117045761010080835404028352916020019161172f565b820191906000526020600020905b81548152906001019060200180831161171257829003601f168201915b5050505050905090565b61174161259b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a690614506565b60405180910390fd5b80600660006117bc61259b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661186961259b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118ae9190614449565b60405180910390a35050565b6118c261259b565b73ffffffffffffffffffffffffffffffffffffffff166118e061167d565b73ffffffffffffffffffffffffffffffffffffffff1614611936576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192d906145e6565b60405180910390fd5b600960009054906101000a900460ff1615600960006101000a81548160ff021916908315150217905550565b61197361196d61259b565b8361265c565b6119b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a990614666565b60405180910390fd5b6119be84848484612b6d565b50505050565b600b80546119d1906149d7565b80601f01602080910402602001604051908101604052809291908181526020018280546119fd906149d7565b8015611a4a5780601f10611a1f57610100808354040283529160200191611a4a565b820191906000526020600020905b815481529060010190602001808311611a2d57829003601f168201915b505050505081565b60196020528060005260406000206000915090508054611a71906149d7565b80601f0160208091040260200160405190810160405280929190818152602001828054611a9d906149d7565b8015611aea5780601f10611abf57610100808354040283529160200191611aea565b820191906000526020600020905b815481529060010190602001808311611acd57829003601f168201915b505050505081565b611afa61259b565b73ffffffffffffffffffffffffffffffffffffffff16611b1861167d565b73ffffffffffffffffffffffffffffffffffffffff1614611b6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b65906145e6565b60405180910390fd5b80601860008481526020019081526020016000209080519060200190611b9592919061356d565b505050565b6060611ba58261252f565b611be4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdb90614626565b60405180910390fd5b6000611bef83612bc9565b9050600960009054906101000a900460ff1615611c3457600a81600b604051602001611c1d93929190614282565b604051602081830303815290604052915050611d00565b6000611c3f84612d76565b82600e604051602001611c5493929190614251565b60405160208183030381529060405290506000611c7085612e48565b83600d604051602001611c8593929190614251565b60405160208183030381529060405290506000611cd76011856012600f8688600c8b60138d604051602001611cc39a999897969594939291906142b3565b604051602081830303815290604052612f2d565b905080604051602001611cea9190614397565b6040516020818303038152906040529450505050505b919050565b60118054611d12906149d7565b80601f0160208091040260200160405190810160405280929190818152602001828054611d3e906149d7565b8015611d8b5780601f10611d6057610100808354040283529160200191611d8b565b820191906000526020600020905b815481529060010190602001808311611d6e57829003601f168201915b505050505081565b600960009054906101000a900460ff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611dd261259b565b73ffffffffffffffffffffffffffffffffffffffff16611df061167d565b73ffffffffffffffffffffffffffffffffffffffff1614611e46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3d906145e6565b60405180910390fd5b81604051611e54919061423a565b6040518091039020611e6461259b565b73ffffffffffffffffffffffffffffffffffffffff167f3d366eac52dec4372766dc4b15bba20b935b45d33171465a598eedabb5a5dff883604051611ea99190614464565b60405180910390a35050565b611ebd61259b565b73ffffffffffffffffffffffffffffffffffffffff16611edb61167d565b73ffffffffffffffffffffffffffffffffffffffff1614611f31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f28906145e6565b60405180910390fd5b61014d8151600854611f43919061480c565b1115611f84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7b906146c6565b60405180910390fd5b60005b815181101561200757611fdc828281518110611fcc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516008546130eb565b60086000815480929190611fef90614a3a565b91905055508080611fff90614a3a565b915050611f87565b5050565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601080546120d2906149d7565b80601f01602080910402602001604051908101604052809291908181526020018280546120fe906149d7565b801561214b5780601f106121205761010080835404028352916020019161214b565b820191906000526020600020905b81548152906001019060200180831161212e57829003601f168201915b505050505081565b61215b61259b565b73ffffffffffffffffffffffffffffffffffffffff1661217961167d565b73ffffffffffffffffffffffffffffffffffffffff16146121cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c6906145e6565b60405180910390fd5b81600a90805190602001906121e592919061356d565b5080600b90805190602001906121fc92919061356d565b505050565b61220961259b565b73ffffffffffffffffffffffffffffffffffffffff1661222761167d565b73ffffffffffffffffffffffffffffffffffffffff161461227d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612274906145e6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e4906144a6565b60405180910390fd5b6122f681612aa7565b50565b600c8054612306906149d7565b80601f0160208091040260200160405190810160405280929190818152602001828054612332906149d7565b801561237f5780601f106123545761010080835404028352916020019161237f565b820191906000526020600020905b81548152906001019060200180831161236257829003601f168201915b505050505081565b601860205280600052604060002060009150905080546123a6906149d7565b80601f01602080910402602001604051908101604052809291908181526020018280546123d2906149d7565b801561241f5780601f106123f45761010080835404028352916020019161241f565b820191906000526020600020905b81548152906001019060200180831161240257829003601f168201915b505050505081565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061251857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612528575061252782613354565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661261683611171565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006126678261252f565b6126a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269d90614526565b60405180910390fd5b60006126b183611171565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061272057508373ffffffffffffffffffffffffffffffffffffffff166127088461097c565b73ffffffffffffffffffffffffffffffffffffffff16145b8061273157506127308185612031565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661275a82611171565b73ffffffffffffffffffffffffffffffffffffffff16146127b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a790614606565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612820576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612817906144e6565b60405180910390fd5b61282b8383836133be565b6128366000826125a3565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461288691906148ed565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128dd919061480c565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006129a182611171565b90506129af816000846133be565b6129ba6000836125a3565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a0a91906148ed565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612b7884848461273a565b612b84848484846133c3565b612bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bba90614486565b60405180910390fd5b50505050565b60606000821415612c11576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d71565b600082905060005b60008214612c43578080612c2c90614a3a565b915050600a82612c3c9190614862565b9150612c19565b60008167ffffffffffffffff811115612c85577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612cb75781602001600182028036833780820191505090505b5090505b60008514612d6a57600182612cd091906148ed565b9150600a85612cdf9190614a83565b6030612ceb919061480c565b60f81b818381518110612d27577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d639190614862565b9450612cbb565b8093505050505b919050565b60606000606f831015612d8c5760009050612da4565b60de831015612d9e5760019050612da3565b600290505b5b601860008281526020019081526020016000208054612dc2906149d7565b80601f0160208091040260200160405190810160405280929190818152602001828054612dee906149d7565b8015612e3b5780601f10612e1057610100808354040283529160200191612e3b565b820191906000526020600020905b815481529060010190602001808311612e1e57829003601f168201915b5050505050915050919050565b60606000606f831015612e5e5760009050612e89565b60a2831015612e705760019050612e88565b60de831015612e825760029050612e87565b600390505b5b5b601760008281526020019081526020016000208054612ea7906149d7565b80601f0160208091040260200160405190810160405280929190818152602001828054612ed3906149d7565b8015612f205780601f10612ef557610100808354040283529160200191612f20565b820191906000526020600020905b815481529060010190602001808311612f0357829003601f168201915b5050505050915050919050565b60606000825190506000811415612f5657604051806020016040528060008152509150506130e6565b60006003600283612f67919061480c565b612f719190614862565b6004612f7d9190614893565b90506000602082612f8e919061480c565b67ffffffffffffffff811115612fcd577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612fff5781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001615294604091399050600181016020830160005b868110156130a35760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b9050808452600484019350505061302a565b5060038606600181146130bd57600281146130cd576130d8565b613d3d60f01b60028303526130d8565b603d60f81b60018303525b508484525050819450505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561315b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613152906145a6565b60405180910390fd5b6131648161252f565b156131a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319b906144c6565b60405180910390fd5b6131b0600083836133be565b8060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461327c919061480c565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b60006133e48473ffffffffffffffffffffffffffffffffffffffff1661355a565b1561354d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261340d61259b565b8786866040518563ffffffff1660e01b815260040161342f94939291906143d4565b602060405180830381600087803b15801561344957600080fd5b505af192505050801561347a57506040513d601f19601f8201168201806040525081019061347791906139f0565b60015b6134fd573d80600081146134aa576040519150601f19603f3d011682016040523d82523d6000602084013e6134af565b606091505b506000815114156134f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ec90614486565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613552565b600190505b949350505050565b600080823b905060008111915050919050565b828054613579906149d7565b90600052602060002090601f01602090048101928261359b57600085556135e2565b82601f106135b457805160ff19168380011785556135e2565b828001600101855582156135e2579182015b828111156135e15782518255916020019190600101906135c6565b5b5090506135ef91906135f3565b5090565b5b8082111561360c5760008160009055506001016135f4565b5090565b600061362361361e84614726565b614701565b9050808382526020820190508285602086028201111561364257600080fd5b60005b85811015613672578161365888826136f8565b845260208401935060208301925050600181019050613645565b5050509392505050565b600061368f61368a84614752565b614701565b9050828152602081018484840111156136a757600080fd5b6136b2848285614995565b509392505050565b60006136cd6136c884614783565b614701565b9050828152602081018484840111156136e557600080fd5b6136f0848285614995565b509392505050565b60008135905061370781615237565b92915050565b600082601f83011261371e57600080fd5b813561372e848260208601613610565b91505092915050565b6000813590506137468161524e565b92915050565b60008135905061375b81615265565b92915050565b60008151905061377081615265565b92915050565b600082601f83011261378757600080fd5b813561379784826020860161367c565b91505092915050565b600082601f8301126137b157600080fd5b81356137c18482602086016136ba565b91505092915050565b6000813590506137d98161527c565b92915050565b6000602082840312156137f157600080fd5b60006137ff848285016136f8565b91505092915050565b6000806040838503121561381b57600080fd5b6000613829858286016136f8565b925050602061383a858286016136f8565b9150509250929050565b60008060006060848603121561385957600080fd5b6000613867868287016136f8565b9350506020613878868287016136f8565b9250506040613889868287016137ca565b9150509250925092565b600080600080608085870312156138a957600080fd5b60006138b7878288016136f8565b94505060206138c8878288016136f8565b93505060406138d9878288016137ca565b925050606085013567ffffffffffffffff8111156138f657600080fd5b61390287828801613776565b91505092959194509250565b6000806040838503121561392157600080fd5b600061392f858286016136f8565b925050602061394085828601613737565b9150509250929050565b6000806040838503121561395d57600080fd5b600061396b858286016136f8565b925050602061397c858286016137ca565b9150509250929050565b60006020828403121561399857600080fd5b600082013567ffffffffffffffff8111156139b257600080fd5b6139be8482850161370d565b91505092915050565b6000602082840312156139d957600080fd5b60006139e78482850161374c565b91505092915050565b600060208284031215613a0257600080fd5b6000613a1084828501613761565b91505092915050565b600060208284031215613a2b57600080fd5b600082013567ffffffffffffffff811115613a4557600080fd5b613a51848285016137a0565b91505092915050565b60008060408385031215613a6d57600080fd5b600083013567ffffffffffffffff811115613a8757600080fd5b613a93858286016137a0565b925050602083013567ffffffffffffffff811115613ab057600080fd5b613abc858286016137a0565b9150509250929050565b60008060008060008060c08789031215613adf57600080fd5b600087013567ffffffffffffffff811115613af957600080fd5b613b0589828a016137a0565b965050602087013567ffffffffffffffff811115613b2257600080fd5b613b2e89828a016137a0565b955050604087013567ffffffffffffffff811115613b4b57600080fd5b613b5789828a016137a0565b945050606087013567ffffffffffffffff811115613b7457600080fd5b613b8089828a016137a0565b935050608087013567ffffffffffffffff811115613b9d57600080fd5b613ba989828a016137a0565b92505060a087013567ffffffffffffffff811115613bc657600080fd5b613bd289828a016137a0565b9150509295509295509295565b600060208284031215613bf157600080fd5b6000613bff848285016137ca565b91505092915050565b60008060408385031215613c1b57600080fd5b6000613c29858286016137ca565b925050602083013567ffffffffffffffff811115613c4657600080fd5b613c52858286016137a0565b9150509250929050565b600080600060608486031215613c7157600080fd5b6000613c7f868287016137ca565b935050602084013567ffffffffffffffff811115613c9c57600080fd5b613ca8868287016137a0565b925050604084013567ffffffffffffffff811115613cc557600080fd5b613cd1868287016137a0565b9150509250925092565b60008060408385031215613cee57600080fd5b6000613cfc858286016137ca565b9250506020613d0d858286016137ca565b9150509250929050565b613d2081614921565b82525050565b613d2f81614933565b82525050565b6000613d40826147c9565b613d4a81856147df565b9350613d5a8185602086016149a4565b613d6381614b70565b840191505092915050565b6000613d79826147d4565b613d8381856147f0565b9350613d938185602086016149a4565b613d9c81614b70565b840191505092915050565b6000613db2826147d4565b613dbc8185614801565b9350613dcc8185602086016149a4565b80840191505092915050565b60008154613de5816149d7565b613def8186614801565b94506001821660008114613e0a5760018114613e1b57613e4e565b60ff19831686528186019350613e4e565b613e24856147b4565b60005b83811015613e4657815481890152600182019150602081019050613e27565b838801955050505b50505092915050565b6000613e64601383614801565b9150613e6f82614b81565b601382019050919050565b6000613e876032836147f0565b9150613e9282614baa565b604082019050919050565b6000613eaa6026836147f0565b9150613eb582614bf9565b604082019050919050565b6000613ecd601c836147f0565b9150613ed882614c48565b602082019050919050565b6000613ef06024836147f0565b9150613efb82614c71565b604082019050919050565b6000613f136019836147f0565b9150613f1e82614cc0565b602082019050919050565b6000613f36602c836147f0565b9150613f4182614ce9565b604082019050919050565b6000613f596038836147f0565b9150613f6482614d38565b604082019050919050565b6000613f7c602a836147f0565b9150613f8782614d87565b604082019050919050565b6000613f9f6029836147f0565b9150613faa82614dd6565b604082019050919050565b6000613fc2600283614801565b9150613fcd82614e25565b600282019050919050565b6000613fe56020836147f0565b9150613ff082614e4e565b602082019050919050565b6000614008600d83614801565b915061401382614e77565b600d82019050919050565b600061402b600f83614801565b915061403682614ea0565b600f82019050919050565b600061404e602c836147f0565b915061405982614ec9565b604082019050919050565b60006140716020836147f0565b915061407c82614f18565b602082019050919050565b60006140946029836147f0565b915061409f82614f41565b604082019050919050565b60006140b7601483614801565b91506140c282614f90565b601482019050919050565b60006140da602f836147f0565b91506140e582614fb9565b604082019050919050565b60006140fd600a83614801565b915061410882615008565b600a82019050919050565b60006141206021836147f0565b915061412b82615031565b604082019050919050565b6000614143600f83614801565b915061414e82615080565b600f82019050919050565b6000614166601d83614801565b9150614171826150a9565b601d82019050919050565b60006141896031836147f0565b9150614194826150d2565b604082019050919050565b60006141ac6030836147f0565b91506141b782615121565b604082019050919050565b60006141cf6030836147f0565b91506141da82615170565b604082019050919050565b60006141f2601583614801565b91506141fd826151bf565b601582019050919050565b6000614215602b836147f0565b9150614220826151e8565b604082019050919050565b6142348161498b565b82525050565b60006142468284613da7565b915081905092915050565b600061425d8286613da7565b91506142698285613da7565b91506142758284613dd8565b9150819050949350505050565b600061428e8286613dd8565b915061429a8285613da7565b91506142a68284613dd8565b9150819050949350505050565b60006142be826140f0565b91506142ca828d613dd8565b91506142d6828c613da7565b91506142e2828b613dd8565b91506142ed82613e57565b91506142f9828a613dd8565b915061430482613ffb565b91506143108289613da7565b915061431b826141e5565b91506143278288613da7565b9150614332826140aa565b915061433e8287613dd8565b915061434a8286613da7565b91506143558261401e565b91506143618285613dd8565b915061436c82614136565b91506143788284613da7565b915061438382613fb5565b91508190509b9a5050505050505050505050565b60006143a282614159565b91506143ae8284613da7565b915081905092915050565b60006020820190506143ce6000830184613d17565b92915050565b60006080820190506143e96000830187613d17565b6143f66020830186613d17565b614403604083018561422b565b81810360608301526144158184613d35565b905095945050505050565b60006040820190506144356000830185613d17565b614442602083018461422b565b9392505050565b600060208201905061445e6000830184613d26565b92915050565b6000602082019050818103600083015261447e8184613d6e565b905092915050565b6000602082019050818103600083015261449f81613e7a565b9050919050565b600060208201905081810360008301526144bf81613e9d565b9050919050565b600060208201905081810360008301526144df81613ec0565b9050919050565b600060208201905081810360008301526144ff81613ee3565b9050919050565b6000602082019050818103600083015261451f81613f06565b9050919050565b6000602082019050818103600083015261453f81613f29565b9050919050565b6000602082019050818103600083015261455f81613f4c565b9050919050565b6000602082019050818103600083015261457f81613f6f565b9050919050565b6000602082019050818103600083015261459f81613f92565b9050919050565b600060208201905081810360008301526145bf81613fd8565b9050919050565b600060208201905081810360008301526145df81614041565b9050919050565b600060208201905081810360008301526145ff81614064565b9050919050565b6000602082019050818103600083015261461f81614087565b9050919050565b6000602082019050818103600083015261463f816140cd565b9050919050565b6000602082019050818103600083015261465f81614113565b9050919050565b6000602082019050818103600083015261467f8161417c565b9050919050565b6000602082019050818103600083015261469f8161419f565b9050919050565b600060208201905081810360008301526146bf816141c2565b9050919050565b600060208201905081810360008301526146df81614208565b9050919050565b60006020820190506146fb600083018461422b565b92915050565b600061470b61471c565b90506147178282614a09565b919050565b6000604051905090565b600067ffffffffffffffff82111561474157614740614b41565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561476d5761476c614b41565b5b61477682614b70565b9050602081019050919050565b600067ffffffffffffffff82111561479e5761479d614b41565b5b6147a782614b70565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006148178261498b565b91506148228361498b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561485757614856614ab4565b5b828201905092915050565b600061486d8261498b565b91506148788361498b565b92508261488857614887614ae3565b5b828204905092915050565b600061489e8261498b565b91506148a98361498b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156148e2576148e1614ab4565b5b828202905092915050565b60006148f88261498b565b91506149038361498b565b92508282101561491657614915614ab4565b5b828203905092915050565b600061492c8261496b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156149c25780820151818401526020810190506149a7565b838111156149d1576000848401525b50505050565b600060028204905060018216806149ef57607f821691505b60208210811415614a0357614a02614b12565b5b50919050565b614a1282614b70565b810181811067ffffffffffffffff82111715614a3157614a30614b41565b5b80604052505050565b6000614a458261498b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614a7857614a77614ab4565b5b600182019050919050565b6000614a8e8261498b565b9150614a998361498b565b925082614aa957614aa8614ae3565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f222c20226465736372697074696f6e223a202200000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f222c2022696d616765223a202200000000000000000000000000000000000000600082015250565b7f222c20226c6963656e7365223a20220000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f222c202265787465726e616c5f75726c223a2022000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f7b226e616d65223a202200000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f222c2022746f6b656e4964223a20220000000000000000000000000000000000600082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4f6e6c792070726f6a656374206f7220746f6b656e206f776e65722063616e2060008201527f656d697420746f6b656e206576656e7400000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f222c2022616e696d6174696f6e5f75726c223a20220000000000000000000000600082015250565b7f4261746368206d696e7420776f756c64207075736820746f6b656e20636f756e60008201527f742061626f766520333333000000000000000000000000000000000000000000602082015250565b61524081614921565b811461524b57600080fd5b50565b61525781614933565b811461526257600080fd5b50565b61526e8161493f565b811461527957600080fd5b50565b6152858161498b565b811461529057600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220c1a518f194629604a9d84c32ffaed2b1c134bac129c77ef5c044ce2b44dcfb1f64736f6c63430008020033416e696d6174656420616e64207261797472616365642076657273696f6e73206f6620746865206f726967696e616c20617274626c6f636b732e696f204f63746f2047617264656e732e697066733a2f2f6261667962656962776e7379657077356b706473357665337663367a673763616d6662646c7263667a79697a6179346a3465687135686b6b34686d2f6f63746f5f697066733a2f2f626166796265696135357a3663733374636877686a76786d616e72336333346d737a777a74327979693374626c7863633573333632326e6c726d652f6f63746f5f697066733a2f2f6261667962656961367a706b797034713266666636717572616f686f776f78626f7a336e6166636d6f6763786b7a63333773627a79777a67696c692f6f63746f5f697066733a2f2f6261667962656965696e66683462666b79777637327478347a62697432326e376e78336f6d616d717969667a63776d796763697836746b6d3765752f6f63746f5f697066733a2f2f62616679626569636c716e376f6b646e7167377276797335706e7a743635656c6f7969757834796d6a7a65726e6e33716a777974367435656e64792f6f63746f5f697066733a2f2f626166796265696833666b6568376e73793372326972787972677133353575747766746135636e62737a65786f636678376273336c72777578676d2f6f63746f5f68747470733a2f2f7777772e726963686c6f72642e636f6d2f6f63746f2d67617264656e23697066733a2f2f62616679626569633364656e6a35776a35723734726c756f6a6875656a326a37726b78756367656a65326f64336668753272336d7662796f6e62342f6f63746f5f

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102955760003560e01c80637f5fa46111610167578063ca2febbf116100ce578063ebf72a5f11610087578063ebf72a5f146107c7578063ecf4326b146107e5578063f2fde38b14610801578063f56026af1461081d578063f8c8586a1461083b578063fd4307c31461086b57610295565b8063ca2febbf14610705578063d29fb51414610723578063d4434ab014610741578063d67b06c11461075d578063e33a681614610779578063e985e9c51461079757610295565b8063b88d4fde11610120578063b88d4fde14610631578063bb90b76c1461064d578063bf64db1d1461066b578063bf8374591461069b578063c87b56dd146106b7578063c977aba1146106e757610295565b80637f5fa4611461059757806385eaae73146105b35780638da5cb5b146105cf57806395d89b41146105ed578063a22cb4651461060b578063a877a0881461062757610295565b806342842e0e1161020b5780636352211e116101c45780636352211e146104d357806364548d2e146105035780636b87d24c1461052157806370a082311461053f578063715018a61461056f578063755f047b1461057957610295565b806342842e0e1461041557806342966c681461043157806352a6c8c91461044d578063530d9801146104695780635bcabf04146104855780635f528ee8146104a357610295565b80631a2f75041161025d5780631a2f75041461035257806323a22bcb1461037057806323b872dd1461038c57806326980da2146103a85780632a55205a146103c657806342260b5d146103f757610295565b806301ffc9a71461029a57806306fdde03146102ca578063081812fc146102e8578063095ea7b31461031857806318160ddd14610334575b600080fd5b6102b460048036038101906102af91906139c7565b610889565b6040516102c19190614449565b60405180910390f35b6102d26108ea565b6040516102df9190614464565b60405180910390f35b61030260048036038101906102fd9190613bdf565b61097c565b60405161030f91906143b9565b60405180910390f35b610332600480360381019061032d919061394a565b610a01565b005b61033c610b19565b60405161034991906146e6565b60405180910390f35b61035a610b23565b6040516103679190614464565b60405180910390f35b61038a60048036038101906103859190613a19565b610bb1565b005b6103a660048036038101906103a19190613844565b610c47565b005b6103b0610ca7565b6040516103bd9190614464565b60405180910390f35b6103e060048036038101906103db9190613cdb565b610d35565b6040516103ee929190614420565b60405180910390f35b6103ff610d81565b60405161040c91906146e6565b60405180910390f35b61042f600480360381019061042a9190613844565b610d87565b005b61044b60048036038101906104469190613bdf565b610da7565b005b61046760048036038101906104629190613c5c565b610e03565b005b610483600480360381019061047e9190613ac6565b610f35565b005b61048d611043565b60405161049a9190614464565b60405180910390f35b6104bd60048036038101906104b89190613bdf565b6110d1565b6040516104ca9190614464565b60405180910390f35b6104ed60048036038101906104e89190613bdf565b611171565b6040516104fa91906143b9565b60405180910390f35b61050b611223565b6040516105189190614464565b60405180910390f35b6105296112b1565b6040516105369190614464565b60405180910390f35b610559600480360381019061055491906137df565b61133f565b60405161056691906146e6565b60405180910390f35b6105776113f7565b005b61058161147f565b60405161058e9190614464565b60405180910390f35b6105b160048036038101906105ac9190613c08565b61150d565b005b6105cd60048036038101906105c8919061394a565b6115b5565b005b6105d761167d565b6040516105e491906143b9565b60405180910390f35b6105f56116a7565b6040516106029190614464565b60405180910390f35b6106256004803603810190610620919061390e565b611739565b005b61062f6118ba565b005b61064b60048036038101906106469190613893565b611962565b005b6106556119c4565b6040516106629190614464565b60405180910390f35b61068560048036038101906106809190613bdf565b611a52565b6040516106929190614464565b60405180910390f35b6106b560048036038101906106b09190613c08565b611af2565b005b6106d160048036038101906106cc9190613bdf565b611b9a565b6040516106de9190614464565b60405180910390f35b6106ef611d05565b6040516106fc9190614464565b60405180910390f35b61070d611d93565b60405161071a9190614449565b60405180910390f35b61072b611da6565b60405161073891906143b9565b60405180910390f35b61075b60048036038101906107569190613a5a565b611dca565b005b61077760048036038101906107729190613986565b611eb5565b005b61078161200b565b60405161078e91906143b9565b60405180910390f35b6107b160048036038101906107ac9190613808565b612031565b6040516107be9190614449565b60405180910390f35b6107cf6120c5565b6040516107dc9190614464565b60405180910390f35b6107ff60048036038101906107fa9190613a5a565b612153565b005b61081b600480360381019061081691906137df565b612201565b005b6108256122f9565b6040516108329190614464565b60405180910390f35b61085560048036038101906108509190613bdf565b612387565b6040516108629190614464565b60405180910390f35b610873612427565b60405161088091906143b9565b60405180910390f35b6000632a55205a60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108e357506108e28261244d565b5b9050919050565b6060600180546108f9906149d7565b80601f0160208091040260200160405190810160405280929190818152602001828054610925906149d7565b80156109725780601f1061094757610100808354040283529160200191610972565b820191906000526020600020905b81548152906001019060200180831161095557829003601f168201915b5050505050905090565b60006109878261252f565b6109c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bd906145c6565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a0c82611171565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7490614646565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a9c61259b565b73ffffffffffffffffffffffffffffffffffffffff161480610acb5750610aca81610ac561259b565b612031565b5b610b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0190614546565b60405180910390fd5b610b1483836125a3565b505050565b6000600854905090565b60128054610b30906149d7565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5c906149d7565b8015610ba95780601f10610b7e57610100808354040283529160200191610ba9565b820191906000526020600020905b815481529060010190602001808311610b8c57829003601f168201915b505050505081565b610bb961259b565b73ffffffffffffffffffffffffffffffffffffffff16610bd761167d565b73ffffffffffffffffffffffffffffffffffffffff1614610c2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c24906145e6565b60405180910390fd5b80600f9080519060200190610c4392919061356d565b5050565b610c58610c5261259b565b8261265c565b610c97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8e90614666565b60405180910390fd5b610ca283838361273a565b505050565b600d8054610cb4906149d7565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce0906149d7565b8015610d2d5780601f10610d0257610100808354040283529160200191610d2d565b820191906000526020600020905b815481529060010190602001808311610d1057829003601f168201915b505050505081565b600080601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661271060165485610d6c9190614893565b610d769190614862565b915091509250929050565b60165481565b610da283838360405180602001604052806000815250611962565b505050565b610db8610db261259b565b8261265c565b610df7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dee906146a6565b60405180910390fd5b610e0081612996565b50565b610e0b61259b565b73ffffffffffffffffffffffffffffffffffffffff16610e2961167d565b73ffffffffffffffffffffffffffffffffffffffff161480610e855750610e4e61259b565b73ffffffffffffffffffffffffffffffffffffffff16610e6d84611171565b73ffffffffffffffffffffffffffffffffffffffff16145b610ec4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebb90614686565b60405180910390fd5b81604051610ed2919061423a565b604051809103902083610ee361259b565b73ffffffffffffffffffffffffffffffffffffffff167fad000c5a693465b4555f1044ddd1221ef0bfc49e5621ceb705b952ff97e2caac84604051610f289190614464565b60405180910390a4505050565b610f3d61259b565b73ffffffffffffffffffffffffffffffffffffffff16610f5b61167d565b73ffffffffffffffffffffffffffffffffffffffff1614610fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa8906145e6565b60405180910390fd5b8560119080519060200190610fc792919061356d565b508460129080519060200190610fde92919061356d565b5083600d9080519060200190610ff592919061356d565b5082600e908051906020019061100c92919061356d565b5081600c908051906020019061102392919061356d565b50806013908051906020019061103a92919061356d565b50505050505050565b600a8054611050906149d7565b80601f016020809104026020016040519081016040528092919081815260200182805461107c906149d7565b80156110c95780601f1061109e576101008083540402835291602001916110c9565b820191906000526020600020905b8154815290600101906020018083116110ac57829003601f168201915b505050505081565b601760205280600052604060002060009150905080546110f0906149d7565b80601f016020809104026020016040519081016040528092919081815260200182805461111c906149d7565b80156111695780601f1061113e57610100808354040283529160200191611169565b820191906000526020600020905b81548152906001019060200180831161114c57829003601f168201915b505050505081565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561121a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121190614586565b60405180910390fd5b80915050919050565b600e8054611230906149d7565b80601f016020809104026020016040519081016040528092919081815260200182805461125c906149d7565b80156112a95780601f1061127e576101008083540402835291602001916112a9565b820191906000526020600020905b81548152906001019060200180831161128c57829003601f168201915b505050505081565b601380546112be906149d7565b80601f01602080910402602001604051908101604052809291908181526020018280546112ea906149d7565b80156113375780601f1061130c57610100808354040283529160200191611337565b820191906000526020600020905b81548152906001019060200180831161131a57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a790614566565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113ff61259b565b73ffffffffffffffffffffffffffffffffffffffff1661141d61167d565b73ffffffffffffffffffffffffffffffffffffffff1614611473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146a906145e6565b60405180910390fd5b61147d6000612aa7565b565b600f805461148c906149d7565b80601f01602080910402602001604051908101604052809291908181526020018280546114b8906149d7565b80156115055780601f106114da57610100808354040283529160200191611505565b820191906000526020600020905b8154815290600101906020018083116114e857829003601f168201915b505050505081565b61151561259b565b73ffffffffffffffffffffffffffffffffffffffff1661153361167d565b73ffffffffffffffffffffffffffffffffffffffff1614611589576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611580906145e6565b60405180910390fd5b806017600084815260200190815260200160002090805190602001906115b092919061356d565b505050565b6115bd61259b565b73ffffffffffffffffffffffffffffffffffffffff166115db61167d565b73ffffffffffffffffffffffffffffffffffffffff1614611631576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611628906145e6565b60405180910390fd5b81601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806016819055505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546116b6906149d7565b80601f01602080910402602001604051908101604052809291908181526020018280546116e2906149d7565b801561172f5780601f106117045761010080835404028352916020019161172f565b820191906000526020600020905b81548152906001019060200180831161171257829003601f168201915b5050505050905090565b61174161259b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a690614506565b60405180910390fd5b80600660006117bc61259b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661186961259b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118ae9190614449565b60405180910390a35050565b6118c261259b565b73ffffffffffffffffffffffffffffffffffffffff166118e061167d565b73ffffffffffffffffffffffffffffffffffffffff1614611936576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192d906145e6565b60405180910390fd5b600960009054906101000a900460ff1615600960006101000a81548160ff021916908315150217905550565b61197361196d61259b565b8361265c565b6119b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a990614666565b60405180910390fd5b6119be84848484612b6d565b50505050565b600b80546119d1906149d7565b80601f01602080910402602001604051908101604052809291908181526020018280546119fd906149d7565b8015611a4a5780601f10611a1f57610100808354040283529160200191611a4a565b820191906000526020600020905b815481529060010190602001808311611a2d57829003601f168201915b505050505081565b60196020528060005260406000206000915090508054611a71906149d7565b80601f0160208091040260200160405190810160405280929190818152602001828054611a9d906149d7565b8015611aea5780601f10611abf57610100808354040283529160200191611aea565b820191906000526020600020905b815481529060010190602001808311611acd57829003601f168201915b505050505081565b611afa61259b565b73ffffffffffffffffffffffffffffffffffffffff16611b1861167d565b73ffffffffffffffffffffffffffffffffffffffff1614611b6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b65906145e6565b60405180910390fd5b80601860008481526020019081526020016000209080519060200190611b9592919061356d565b505050565b6060611ba58261252f565b611be4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdb90614626565b60405180910390fd5b6000611bef83612bc9565b9050600960009054906101000a900460ff1615611c3457600a81600b604051602001611c1d93929190614282565b604051602081830303815290604052915050611d00565b6000611c3f84612d76565b82600e604051602001611c5493929190614251565b60405160208183030381529060405290506000611c7085612e48565b83600d604051602001611c8593929190614251565b60405160208183030381529060405290506000611cd76011856012600f8688600c8b60138d604051602001611cc39a999897969594939291906142b3565b604051602081830303815290604052612f2d565b905080604051602001611cea9190614397565b6040516020818303038152906040529450505050505b919050565b60118054611d12906149d7565b80601f0160208091040260200160405190810160405280929190818152602001828054611d3e906149d7565b8015611d8b5780601f10611d6057610100808354040283529160200191611d8b565b820191906000526020600020905b815481529060010190602001808311611d6e57829003601f168201915b505050505081565b600960009054906101000a900460ff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611dd261259b565b73ffffffffffffffffffffffffffffffffffffffff16611df061167d565b73ffffffffffffffffffffffffffffffffffffffff1614611e46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3d906145e6565b60405180910390fd5b81604051611e54919061423a565b6040518091039020611e6461259b565b73ffffffffffffffffffffffffffffffffffffffff167f3d366eac52dec4372766dc4b15bba20b935b45d33171465a598eedabb5a5dff883604051611ea99190614464565b60405180910390a35050565b611ebd61259b565b73ffffffffffffffffffffffffffffffffffffffff16611edb61167d565b73ffffffffffffffffffffffffffffffffffffffff1614611f31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f28906145e6565b60405180910390fd5b61014d8151600854611f43919061480c565b1115611f84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7b906146c6565b60405180910390fd5b60005b815181101561200757611fdc828281518110611fcc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516008546130eb565b60086000815480929190611fef90614a3a565b91905055508080611fff90614a3a565b915050611f87565b5050565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601080546120d2906149d7565b80601f01602080910402602001604051908101604052809291908181526020018280546120fe906149d7565b801561214b5780601f106121205761010080835404028352916020019161214b565b820191906000526020600020905b81548152906001019060200180831161212e57829003601f168201915b505050505081565b61215b61259b565b73ffffffffffffffffffffffffffffffffffffffff1661217961167d565b73ffffffffffffffffffffffffffffffffffffffff16146121cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c6906145e6565b60405180910390fd5b81600a90805190602001906121e592919061356d565b5080600b90805190602001906121fc92919061356d565b505050565b61220961259b565b73ffffffffffffffffffffffffffffffffffffffff1661222761167d565b73ffffffffffffffffffffffffffffffffffffffff161461227d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612274906145e6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e4906144a6565b60405180910390fd5b6122f681612aa7565b50565b600c8054612306906149d7565b80601f0160208091040260200160405190810160405280929190818152602001828054612332906149d7565b801561237f5780601f106123545761010080835404028352916020019161237f565b820191906000526020600020905b81548152906001019060200180831161236257829003601f168201915b505050505081565b601860205280600052604060002060009150905080546123a6906149d7565b80601f01602080910402602001604051908101604052809291908181526020018280546123d2906149d7565b801561241f5780601f106123f45761010080835404028352916020019161241f565b820191906000526020600020905b81548152906001019060200180831161240257829003601f168201915b505050505081565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061251857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612528575061252782613354565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661261683611171565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006126678261252f565b6126a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269d90614526565b60405180910390fd5b60006126b183611171565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061272057508373ffffffffffffffffffffffffffffffffffffffff166127088461097c565b73ffffffffffffffffffffffffffffffffffffffff16145b8061273157506127308185612031565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661275a82611171565b73ffffffffffffffffffffffffffffffffffffffff16146127b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a790614606565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612820576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612817906144e6565b60405180910390fd5b61282b8383836133be565b6128366000826125a3565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461288691906148ed565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128dd919061480c565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006129a182611171565b90506129af816000846133be565b6129ba6000836125a3565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a0a91906148ed565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612b7884848461273a565b612b84848484846133c3565b612bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bba90614486565b60405180910390fd5b50505050565b60606000821415612c11576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d71565b600082905060005b60008214612c43578080612c2c90614a3a565b915050600a82612c3c9190614862565b9150612c19565b60008167ffffffffffffffff811115612c85577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612cb75781602001600182028036833780820191505090505b5090505b60008514612d6a57600182612cd091906148ed565b9150600a85612cdf9190614a83565b6030612ceb919061480c565b60f81b818381518110612d27577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d639190614862565b9450612cbb565b8093505050505b919050565b60606000606f831015612d8c5760009050612da4565b60de831015612d9e5760019050612da3565b600290505b5b601860008281526020019081526020016000208054612dc2906149d7565b80601f0160208091040260200160405190810160405280929190818152602001828054612dee906149d7565b8015612e3b5780601f10612e1057610100808354040283529160200191612e3b565b820191906000526020600020905b815481529060010190602001808311612e1e57829003601f168201915b5050505050915050919050565b60606000606f831015612e5e5760009050612e89565b60a2831015612e705760019050612e88565b60de831015612e825760029050612e87565b600390505b5b5b601760008281526020019081526020016000208054612ea7906149d7565b80601f0160208091040260200160405190810160405280929190818152602001828054612ed3906149d7565b8015612f205780601f10612ef557610100808354040283529160200191612f20565b820191906000526020600020905b815481529060010190602001808311612f0357829003601f168201915b5050505050915050919050565b60606000825190506000811415612f5657604051806020016040528060008152509150506130e6565b60006003600283612f67919061480c565b612f719190614862565b6004612f7d9190614893565b90506000602082612f8e919061480c565b67ffffffffffffffff811115612fcd577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612fff5781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001615294604091399050600181016020830160005b868110156130a35760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b9050808452600484019350505061302a565b5060038606600181146130bd57600281146130cd576130d8565b613d3d60f01b60028303526130d8565b603d60f81b60018303525b508484525050819450505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561315b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613152906145a6565b60405180910390fd5b6131648161252f565b156131a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319b906144c6565b60405180910390fd5b6131b0600083836133be565b8060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461327c919061480c565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b60006133e48473ffffffffffffffffffffffffffffffffffffffff1661355a565b1561354d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261340d61259b565b8786866040518563ffffffff1660e01b815260040161342f94939291906143d4565b602060405180830381600087803b15801561344957600080fd5b505af192505050801561347a57506040513d601f19601f8201168201806040525081019061347791906139f0565b60015b6134fd573d80600081146134aa576040519150601f19603f3d011682016040523d82523d6000602084013e6134af565b606091505b506000815114156134f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ec90614486565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613552565b600190505b949350505050565b600080823b905060008111915050919050565b828054613579906149d7565b90600052602060002090601f01602090048101928261359b57600085556135e2565b82601f106135b457805160ff19168380011785556135e2565b828001600101855582156135e2579182015b828111156135e15782518255916020019190600101906135c6565b5b5090506135ef91906135f3565b5090565b5b8082111561360c5760008160009055506001016135f4565b5090565b600061362361361e84614726565b614701565b9050808382526020820190508285602086028201111561364257600080fd5b60005b85811015613672578161365888826136f8565b845260208401935060208301925050600181019050613645565b5050509392505050565b600061368f61368a84614752565b614701565b9050828152602081018484840111156136a757600080fd5b6136b2848285614995565b509392505050565b60006136cd6136c884614783565b614701565b9050828152602081018484840111156136e557600080fd5b6136f0848285614995565b509392505050565b60008135905061370781615237565b92915050565b600082601f83011261371e57600080fd5b813561372e848260208601613610565b91505092915050565b6000813590506137468161524e565b92915050565b60008135905061375b81615265565b92915050565b60008151905061377081615265565b92915050565b600082601f83011261378757600080fd5b813561379784826020860161367c565b91505092915050565b600082601f8301126137b157600080fd5b81356137c18482602086016136ba565b91505092915050565b6000813590506137d98161527c565b92915050565b6000602082840312156137f157600080fd5b60006137ff848285016136f8565b91505092915050565b6000806040838503121561381b57600080fd5b6000613829858286016136f8565b925050602061383a858286016136f8565b9150509250929050565b60008060006060848603121561385957600080fd5b6000613867868287016136f8565b9350506020613878868287016136f8565b9250506040613889868287016137ca565b9150509250925092565b600080600080608085870312156138a957600080fd5b60006138b7878288016136f8565b94505060206138c8878288016136f8565b93505060406138d9878288016137ca565b925050606085013567ffffffffffffffff8111156138f657600080fd5b61390287828801613776565b91505092959194509250565b6000806040838503121561392157600080fd5b600061392f858286016136f8565b925050602061394085828601613737565b9150509250929050565b6000806040838503121561395d57600080fd5b600061396b858286016136f8565b925050602061397c858286016137ca565b9150509250929050565b60006020828403121561399857600080fd5b600082013567ffffffffffffffff8111156139b257600080fd5b6139be8482850161370d565b91505092915050565b6000602082840312156139d957600080fd5b60006139e78482850161374c565b91505092915050565b600060208284031215613a0257600080fd5b6000613a1084828501613761565b91505092915050565b600060208284031215613a2b57600080fd5b600082013567ffffffffffffffff811115613a4557600080fd5b613a51848285016137a0565b91505092915050565b60008060408385031215613a6d57600080fd5b600083013567ffffffffffffffff811115613a8757600080fd5b613a93858286016137a0565b925050602083013567ffffffffffffffff811115613ab057600080fd5b613abc858286016137a0565b9150509250929050565b60008060008060008060c08789031215613adf57600080fd5b600087013567ffffffffffffffff811115613af957600080fd5b613b0589828a016137a0565b965050602087013567ffffffffffffffff811115613b2257600080fd5b613b2e89828a016137a0565b955050604087013567ffffffffffffffff811115613b4b57600080fd5b613b5789828a016137a0565b945050606087013567ffffffffffffffff811115613b7457600080fd5b613b8089828a016137a0565b935050608087013567ffffffffffffffff811115613b9d57600080fd5b613ba989828a016137a0565b92505060a087013567ffffffffffffffff811115613bc657600080fd5b613bd289828a016137a0565b9150509295509295509295565b600060208284031215613bf157600080fd5b6000613bff848285016137ca565b91505092915050565b60008060408385031215613c1b57600080fd5b6000613c29858286016137ca565b925050602083013567ffffffffffffffff811115613c4657600080fd5b613c52858286016137a0565b9150509250929050565b600080600060608486031215613c7157600080fd5b6000613c7f868287016137ca565b935050602084013567ffffffffffffffff811115613c9c57600080fd5b613ca8868287016137a0565b925050604084013567ffffffffffffffff811115613cc557600080fd5b613cd1868287016137a0565b9150509250925092565b60008060408385031215613cee57600080fd5b6000613cfc858286016137ca565b9250506020613d0d858286016137ca565b9150509250929050565b613d2081614921565b82525050565b613d2f81614933565b82525050565b6000613d40826147c9565b613d4a81856147df565b9350613d5a8185602086016149a4565b613d6381614b70565b840191505092915050565b6000613d79826147d4565b613d8381856147f0565b9350613d938185602086016149a4565b613d9c81614b70565b840191505092915050565b6000613db2826147d4565b613dbc8185614801565b9350613dcc8185602086016149a4565b80840191505092915050565b60008154613de5816149d7565b613def8186614801565b94506001821660008114613e0a5760018114613e1b57613e4e565b60ff19831686528186019350613e4e565b613e24856147b4565b60005b83811015613e4657815481890152600182019150602081019050613e27565b838801955050505b50505092915050565b6000613e64601383614801565b9150613e6f82614b81565b601382019050919050565b6000613e876032836147f0565b9150613e9282614baa565b604082019050919050565b6000613eaa6026836147f0565b9150613eb582614bf9565b604082019050919050565b6000613ecd601c836147f0565b9150613ed882614c48565b602082019050919050565b6000613ef06024836147f0565b9150613efb82614c71565b604082019050919050565b6000613f136019836147f0565b9150613f1e82614cc0565b602082019050919050565b6000613f36602c836147f0565b9150613f4182614ce9565b604082019050919050565b6000613f596038836147f0565b9150613f6482614d38565b604082019050919050565b6000613f7c602a836147f0565b9150613f8782614d87565b604082019050919050565b6000613f9f6029836147f0565b9150613faa82614dd6565b604082019050919050565b6000613fc2600283614801565b9150613fcd82614e25565b600282019050919050565b6000613fe56020836147f0565b9150613ff082614e4e565b602082019050919050565b6000614008600d83614801565b915061401382614e77565b600d82019050919050565b600061402b600f83614801565b915061403682614ea0565b600f82019050919050565b600061404e602c836147f0565b915061405982614ec9565b604082019050919050565b60006140716020836147f0565b915061407c82614f18565b602082019050919050565b60006140946029836147f0565b915061409f82614f41565b604082019050919050565b60006140b7601483614801565b91506140c282614f90565b601482019050919050565b60006140da602f836147f0565b91506140e582614fb9565b604082019050919050565b60006140fd600a83614801565b915061410882615008565b600a82019050919050565b60006141206021836147f0565b915061412b82615031565b604082019050919050565b6000614143600f83614801565b915061414e82615080565b600f82019050919050565b6000614166601d83614801565b9150614171826150a9565b601d82019050919050565b60006141896031836147f0565b9150614194826150d2565b604082019050919050565b60006141ac6030836147f0565b91506141b782615121565b604082019050919050565b60006141cf6030836147f0565b91506141da82615170565b604082019050919050565b60006141f2601583614801565b91506141fd826151bf565b601582019050919050565b6000614215602b836147f0565b9150614220826151e8565b604082019050919050565b6142348161498b565b82525050565b60006142468284613da7565b915081905092915050565b600061425d8286613da7565b91506142698285613da7565b91506142758284613dd8565b9150819050949350505050565b600061428e8286613dd8565b915061429a8285613da7565b91506142a68284613dd8565b9150819050949350505050565b60006142be826140f0565b91506142ca828d613dd8565b91506142d6828c613da7565b91506142e2828b613dd8565b91506142ed82613e57565b91506142f9828a613dd8565b915061430482613ffb565b91506143108289613da7565b915061431b826141e5565b91506143278288613da7565b9150614332826140aa565b915061433e8287613dd8565b915061434a8286613da7565b91506143558261401e565b91506143618285613dd8565b915061436c82614136565b91506143788284613da7565b915061438382613fb5565b91508190509b9a5050505050505050505050565b60006143a282614159565b91506143ae8284613da7565b915081905092915050565b60006020820190506143ce6000830184613d17565b92915050565b60006080820190506143e96000830187613d17565b6143f66020830186613d17565b614403604083018561422b565b81810360608301526144158184613d35565b905095945050505050565b60006040820190506144356000830185613d17565b614442602083018461422b565b9392505050565b600060208201905061445e6000830184613d26565b92915050565b6000602082019050818103600083015261447e8184613d6e565b905092915050565b6000602082019050818103600083015261449f81613e7a565b9050919050565b600060208201905081810360008301526144bf81613e9d565b9050919050565b600060208201905081810360008301526144df81613ec0565b9050919050565b600060208201905081810360008301526144ff81613ee3565b9050919050565b6000602082019050818103600083015261451f81613f06565b9050919050565b6000602082019050818103600083015261453f81613f29565b9050919050565b6000602082019050818103600083015261455f81613f4c565b9050919050565b6000602082019050818103600083015261457f81613f6f565b9050919050565b6000602082019050818103600083015261459f81613f92565b9050919050565b600060208201905081810360008301526145bf81613fd8565b9050919050565b600060208201905081810360008301526145df81614041565b9050919050565b600060208201905081810360008301526145ff81614064565b9050919050565b6000602082019050818103600083015261461f81614087565b9050919050565b6000602082019050818103600083015261463f816140cd565b9050919050565b6000602082019050818103600083015261465f81614113565b9050919050565b6000602082019050818103600083015261467f8161417c565b9050919050565b6000602082019050818103600083015261469f8161419f565b9050919050565b600060208201905081810360008301526146bf816141c2565b9050919050565b600060208201905081810360008301526146df81614208565b9050919050565b60006020820190506146fb600083018461422b565b92915050565b600061470b61471c565b90506147178282614a09565b919050565b6000604051905090565b600067ffffffffffffffff82111561474157614740614b41565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561476d5761476c614b41565b5b61477682614b70565b9050602081019050919050565b600067ffffffffffffffff82111561479e5761479d614b41565b5b6147a782614b70565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006148178261498b565b91506148228361498b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561485757614856614ab4565b5b828201905092915050565b600061486d8261498b565b91506148788361498b565b92508261488857614887614ae3565b5b828204905092915050565b600061489e8261498b565b91506148a98361498b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156148e2576148e1614ab4565b5b828202905092915050565b60006148f88261498b565b91506149038361498b565b92508282101561491657614915614ab4565b5b828203905092915050565b600061492c8261496b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156149c25780820151818401526020810190506149a7565b838111156149d1576000848401525b50505050565b600060028204905060018216806149ef57607f821691505b60208210811415614a0357614a02614b12565b5b50919050565b614a1282614b70565b810181811067ffffffffffffffff82111715614a3157614a30614b41565b5b80604052505050565b6000614a458261498b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614a7857614a77614ab4565b5b600182019050919050565b6000614a8e8261498b565b9150614a998361498b565b925082614aa957614aa8614ae3565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f222c20226465736372697074696f6e223a202200000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f222c2022696d616765223a202200000000000000000000000000000000000000600082015250565b7f222c20226c6963656e7365223a20220000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f222c202265787465726e616c5f75726c223a2022000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f7b226e616d65223a202200000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f222c2022746f6b656e4964223a20220000000000000000000000000000000000600082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4f6e6c792070726f6a656374206f7220746f6b656e206f776e65722063616e2060008201527f656d697420746f6b656e206576656e7400000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f222c2022616e696d6174696f6e5f75726c223a20220000000000000000000000600082015250565b7f4261746368206d696e7420776f756c64207075736820746f6b656e20636f756e60008201527f742061626f766520333333000000000000000000000000000000000000000000602082015250565b61524081614921565b811461524b57600080fd5b50565b61525781614933565b811461526257600080fd5b50565b61526e8161493f565b811461527957600080fd5b50565b6152858161498b565b811461529057600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220c1a518f194629604a9d84c32ffaed2b1c134bac129c77ef5c044ce2b44dcfb1f64736f6c63430008020033

Deployed Bytecode Sourcemap

121:6786:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6712:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24946:98:1;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26457:217;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25995:401;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2375:94:0;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;605:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5140:145;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27321:330:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;436:26:0;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6474:179;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;733:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27717:179:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36183:241;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5936:320:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5289:482;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;344:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;768:43;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24649:235:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;466:32:0;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;637:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24387:205:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22128:92;;;:::i;:::-;;502:32:0;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4584:134;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6260:210;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21496:85:1;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25108:102;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26741:290;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4877:87:0;;;:::i;:::-;;27962:320:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;369:30:0;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;866:51;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4722:150;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2775:1163;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;573:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;314:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23117:28:1;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5775:157:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2473:298;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;696:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27097:162:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;538:31:0;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4968:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22369:189:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;403:29:0;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;815:47;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;662:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6712:193;6805:4;266:10;6839:21;;6824:36;;;:11;:36;;;;:76;;;;6864:36;6888:11;6864:23;:36::i;:::-;6824:76;6817:83;;6712:193;;;:::o;24946:98:1:-;25000:13;25032:5;25025:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24946:98;:::o;26457:217::-;26533:7;26560:16;26568:7;26560;:16::i;:::-;26552:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26643:15;:24;26659:7;26643:24;;;;;;;;;;;;;;;;;;;;;26636:31;;26457:217;;;:::o;25995:401::-;26075:13;26091:23;26106:7;26091:14;:23::i;:::-;26075:39;;26138:5;26132:11;;:2;:11;;;;26124:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26229:5;26213:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26238:37;26255:5;26262:12;:10;:12::i;:::-;26238:16;:37::i;:::-;26213:62;26192:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;26368:21;26377:2;26381:7;26368:8;:21::i;:::-;25995:401;;;:::o;2375:94:0:-;2427:7;2449:15;;2442:22;;2375:94;:::o;605:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5140:145::-;21719:12:1;:10;:12::i;:::-;21708:23;;:7;:5;:7::i;:::-;:23;;;21700:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5261:19:0::1;5240:18;:40;;;;;;;;;;;;:::i;:::-;;5140:145:::0;:::o;27321:330:1:-;27510:41;27529:12;:10;:12::i;:::-;27543:7;27510:18;:41::i;:::-;27502:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27616:28;27626:4;27632:2;27636:7;27616:9;:28::i;:::-;27321:330;;;:::o;436:26:0:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6474:179::-;6556:7;6565;6588:18;;;;;;;;;;;6642:5;6621:18;;6608:10;:31;;;;:::i;:::-;:39;;;;:::i;:::-;6580:68;;;;6474:179;;;;;:::o;733:30::-;;;;:::o;27717:179:1:-;27850:39;27867:4;27873:2;27877:7;27850:39;;;;;;;;;;;;:16;:39::i;:::-;27717:179;;;:::o;36183:241::-;36299:41;36318:12;:10;:12::i;:::-;36332:7;36299:18;:41::i;:::-;36291:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;36403:14;36409:7;36403:5;:14::i;:::-;36183:241;:::o;5936:320:0:-;6066:12;:10;:12::i;:::-;6055:23;;:7;:5;:7::i;:::-;:23;;;:66;;;;6109:12;:10;:12::i;:::-;6082:39;;:23;6097:7;6082:14;:23::i;:::-;:39;;;6055:66;6040:145;;;;;;;;;;;;:::i;:::-;;;;;;;;;6230:10;6196:55;;;;;;:::i;:::-;;;;;;;;6221:7;6207:12;:10;:12::i;:::-;6196:55;;;6242:8;6196:55;;;;;;:::i;:::-;;;;;;;;5936:320;;;:::o;5289:482::-;21719:12:1;:10;:12::i;:::-;21708:23;;:7;:5;:7::i;:::-;:23;;;21700:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5569:15:0::1;5552:14;:32;;;;;;;;;;;;:::i;:::-;;5607:15;5590:14;:32;;;;;;;;;;;;:::i;:::-;;5643:13;5628:12;:28;;;;;;;;;;;;:::i;:::-;;5683:19;5662:18;:40;;;;;;;;;;;;:::i;:::-;;5726:16;5708:15;:34;;;;;;;;;;;;:::i;:::-;;5758:8;5748:7;:18;;;;;;;;;;;;:::i;:::-;;5289:482:::0;;;;;;:::o;344:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;768:43::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24649:235:1:-;24721:7;24740:13;24756:7;:16;24764:7;24756:16;;;;;;;;;;;;;;;;;;;;;24740:32;;24807:1;24790:19;;:5;:19;;;;24782:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24872:5;24865:12;;;24649:235;;;:::o;466:32:0:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;637:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24387:205:1:-;24459:7;24503:1;24486:19;;:5;:19;;;;24478:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;24569:9;:16;24579:5;24569:16;;;;;;;;;;;;;;;;24562:23;;24387:205;;;:::o;22128:92::-;21719:12;:10;:12::i;:::-;21708:23;;:7;:5;:7::i;:::-;:23;;;21700:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22192:21:::1;22210:1;22192:9;:21::i;:::-;22128:92::o:0;502:32:0:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4584:134::-;21719:12:1;:10;:12::i;:::-;21708:23;;:7;:5;:7::i;:::-;:23;;;21700:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4704:9:0::1;4678;:23;4688:12;4678:23;;;;;;;;;;;:35;;;;;;;;;;;;:::i;:::-;;4584:134:::0;;:::o;6260:210::-;21719:12:1;:10;:12::i;:::-;21708:23;;:7;:5;:7::i;:::-;:23;;;21700:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6400:19:0::1;6379:18;;:40;;;;;;;;;;;;;;;;;;6446:19;6425:18;:40;;;;6260:210:::0;;:::o;21496:85:1:-;21542:7;21568:6;;;;;;;;;;;21561:13;;21496:85;:::o;25108:102::-;25164:13;25196:7;25189:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25108:102;:::o;26741:290::-;26855:12;:10;:12::i;:::-;26843:24;;:8;:24;;;;26835:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;26953:8;26908:18;:32;26927:12;:10;:12::i;:::-;26908:32;;;;;;;;;;;;;;;:42;26941:8;26908:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;27005:8;26976:48;;26991:12;:10;:12::i;:::-;26976:48;;;27015:8;26976:48;;;;;;:::i;:::-;;;;;;;;26741:290;;:::o;4877:87:0:-;21719:12:1;:10;:12::i;:::-;21708:23;;:7;:5;:7::i;:::-;:23;;;21700:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4946:13:0::1;;;;;;;;;;;4945:14;4929:13;;:30;;;;;;;;;;;;;;;;;;4877:87::o:0;27962:320:1:-;28131:41;28150:12;:10;:12::i;:::-;28164:7;28131:18;:41::i;:::-;28123:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28236:39;28250:4;28256:2;28260:7;28269:5;28236:13;:39::i;:::-;27962:320;;;;:::o;369:30:0:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;866:51::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4722:150::-;21719:12:1;:10;:12::i;:::-;21708:23;;:7;:5;:7::i;:::-;:23;;;21700:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4854:13:0::1;4824;:27;4838:12;4824:27;;;;;;;;;;;:43;;;;;;;;;;;;:::i;:::-;;4722:150:::0;;:::o;2775:1163::-;2848:13;2877:16;2885:7;2877;:16::i;:::-;2869:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2952:25;2980:18;:7;:16;:18::i;:::-;2952:46;;3009:13;;;;;;;;;;;3005:105;;;3063:7;3072:11;3085:16;3046:56;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3032:71;;;;;3005:105;3115:29;3171:24;3187:7;3171:15;:24::i;:::-;3197:11;3210:18;3154:75;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3115:115;;3236:23;3286:20;3298:7;3286:11;:20::i;:::-;3308:11;3321:12;3269:65;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3236:99;;3342:18;3363:494;3461:14;3477:11;3490:14;3541:18;3590:9;3638:15;3691;3708:11;3752:7;3792:11;3417:416;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3363:13;:494::i;:::-;3342:515;;3927:4;3877:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;3863:70;;;;;;2775:1163;;;;:::o;573:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;314:25::-;;;;;;;;;;;;;:::o;23117:28:1:-;;;;;;;;;;;;:::o;5775:157:0:-;21719:12:1;:10;:12::i;:::-;21708:23;;:7;:5;:7::i;:::-;:23;;;21700:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5906:10:0::1;5879:48;;;;;;:::i;:::-;;;;;;;;5892:12;:10;:12::i;:::-;5879:48;;;5918:8;5879:48;;;;;;:::i;:::-;;;;;;;;5775:157:::0;;:::o;2473:298::-;21719:12:1;:10;:12::i;:::-;21708:23;;:7;:5;:7::i;:::-;:23;;;21700:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2589:3:0::1;2569:9;:16;2551:15;;:34;;;;:::i;:::-;:41;;2543:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;2652:6;2647:120;2668:9;:16;2664:1;:20;2647:120;;;2699:36;2705:9;2715:1;2705:12;;;;;;;;;;;;;;;;;;;;;;2719:15;;2699:5;:36::i;:::-;2743:15;;:17;;;;;;;;;:::i;:::-;;;;;;2686:3;;;;;:::i;:::-;;;;2647:120;;;;2473:298:::0;:::o;696:33::-;;;;;;;;;;;;;:::o;27097:162:1:-;27194:4;27217:18;:25;27236:5;27217:25;;;;;;;;;;;;;;;:35;27243:8;27217:35;;;;;;;;;;;;;;;;;;;;;;;;;27210:42;;27097:162;;;;:::o;538:31:0:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4968:168::-;21719:12:1;:10;:12::i;:::-;21708:23;;:7;:5;:7::i;:::-;:23;;;21700:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5081:8:0::1;5071:7;:18;;;;;;;;;;;;:::i;:::-;;5114:17;5095:16;:36;;;;;;;;;;;;:::i;:::-;;4968:168:::0;;:::o;22369:189:1:-;21719:12;:10;:12::i;:::-;21708:23;;:7;:5;:7::i;:::-;:23;;;21700:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22477:1:::1;22457:22;;:8;:22;;;;22449:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22532:19;22542:8;22532:9;:19::i;:::-;22369:189:::0;:::o;403:29:0:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;815:47::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;662:29::-;;;;;;;;;;;;;:::o;24028:300:1:-;24130:4;24180:25;24165:40;;;:11;:40;;;;:104;;;;24236:33;24221:48;;;:11;:48;;;;24165:104;:156;;;;24285:36;24309:11;24285:23;:36::i;:::-;24165:156;24146:175;;24028:300;;;:::o;29754:125::-;29819:4;29870:1;29842:30;;:7;:16;29850:7;29842:16;;;;;;;;;;;;;;;;;;;;;:30;;;;29835:37;;29754:125;;;:::o;15641:96::-;15694:7;15720:10;15713:17;;15641:96;:::o;33667:171::-;33768:2;33741:15;:24;33757:7;33741:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;33823:7;33819:2;33785:46;;33794:23;33809:7;33794:14;:23::i;:::-;33785:46;;;;;;;;;;;;33667:171;;:::o;30037:344::-;30130:4;30154:16;30162:7;30154;:16::i;:::-;30146:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30229:13;30245:23;30260:7;30245:14;:23::i;:::-;30229:39;;30297:5;30286:16;;:7;:16;;;:51;;;;30330:7;30306:31;;:20;30318:7;30306:11;:20::i;:::-;:31;;;30286:51;:87;;;;30341:32;30358:5;30365:7;30341:16;:32::i;:::-;30286:87;30278:96;;;30037:344;;;;:::o;32996:560::-;33150:4;33123:31;;:23;33138:7;33123:14;:23::i;:::-;:31;;;33115:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;33232:1;33218:16;;:2;:16;;;;33210:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33286:39;33307:4;33313:2;33317:7;33286:20;:39::i;:::-;33387:29;33404:1;33408:7;33387:8;:29::i;:::-;33446:1;33427:9;:15;33437:4;33427:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;33474:1;33457:9;:13;33467:2;33457:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33504:2;33485:7;:16;33493:7;33485:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33541:7;33537:2;33522:27;;33531:4;33522:27;;;;;;;;;;;;32996:560;;;:::o;32324:348::-;32383:13;32399:23;32414:7;32399:14;:23::i;:::-;32383:39;;32433:48;32454:5;32469:1;32473:7;32433:20;:48::i;:::-;32519:29;32536:1;32540:7;32519:8;:29::i;:::-;32579:1;32559:9;:16;32569:5;32559:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;32597:7;:16;32605:7;32597:16;;;;;;;;;;;;32590:23;;;;;;;;;;;32657:7;32653:1;32629:36;;32638:5;32629:36;;;;;;;;;;;;32324:348;;:::o;22564:169::-;22619:16;22638:6;;;;;;;;;;;22619:25;;22663:8;22654:6;;:17;;;;;;;;;;;;;;;;;;22717:8;22686:40;;22707:8;22686:40;;;;;;;;;;;;22564:169;;:::o;29144:307::-;29295:28;29305:4;29311:2;29315:7;29295:9;:28::i;:::-;29341:48;29364:4;29370:2;29374:7;29383:5;29341:22;:48::i;:::-;29333:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29144:307;;;;:::o;16064:703::-;16120:13;16346:1;16337:5;:10;16333:51;;;16363:10;;;;;;;;;;;;;;;;;;;;;16333:51;16393:12;16408:5;16393:20;;16423:14;16447:75;16462:1;16454:4;:9;16447:75;;16479:8;;;;;:::i;:::-;;;;16509:2;16501:10;;;;;:::i;:::-;;;16447:75;;;16531:19;16563:6;16553:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16531:39;;16580:150;16596:1;16587:5;:10;16580:150;;16623:1;16613:11;;;;;:::i;:::-;;;16689:2;16681:5;:10;;;;:::i;:::-;16668:2;:24;;;;:::i;:::-;16655:39;;16638:6;16645;16638:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;16717:2;16708:11;;;;;:::i;:::-;;;16580:150;;;16753:6;16739:21;;;;;16064:703;;;;:::o;4287:293:0:-;4348:13;4369:17;4406:3;4396:7;:13;4392:143;;;4434:1;4419:16;;4392:143;;;4462:3;4452:7;:13;4448:87;;;4490:1;4475:16;;4448:87;;;4527:1;4512:16;;4448:87;4392:143;4548:13;:27;4562:12;4548:27;;;;;;;;;;;4541:34;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4287:293;;;:::o;3942:341::-;3999:13;4020:17;4057:3;4047:7;:13;4043:199;;;4085:1;4070:16;;4043:199;;;4113:3;4103:7;:13;4099:143;;;4141:1;4126:16;;4099:143;;;4169:3;4159:7;:13;4155:87;;;4197:1;4182:16;;4155:87;;;4234:1;4219:16;;4155:87;4099:143;4043:199;4255:9;:23;4265:12;4255:23;;;;;;;;;;;4248:30;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3942:341;;;:::o;18211:1557:1:-;18269:13;18294:11;18308:4;:11;18294:25;;18340:1;18333:3;:8;18329:23;;;18343:9;;;;;;;;;;;;;;;;;18329:23;18401:18;18439:1;18434;18428:3;:7;;;;:::i;:::-;18427:13;;;;:::i;:::-;18422:1;:19;;;;:::i;:::-;18401:40;;18496:19;18541:2;18528:10;:15;;;;:::i;:::-;18518:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18496:48;;18555:18;18576:5;;;;;;;;;;;;;;;;;18555:26;;18642:1;18635:5;18631:13;18686:2;18678:6;18674:15;18734:1;18703:757;18756:3;18753:1;18750:10;18703:757;;;18808:1;18805;18801:9;18796:14;;18865:8;18860:1;18854:4;18850:12;18844:19;18840:34;18943:4;18935:5;18931:2;18927:14;18923:25;18913:8;18909:40;18903:47;18981:3;18978:1;18974:11;18967:18;;19071:4;19062;19054:5;19050:2;19046:14;19042:25;19032:8;19028:40;19022:47;19018:58;19013:3;19009:68;19002:75;;19108:3;19105:1;19101:11;19094:18;;19197:4;19188;19180:5;19177:1;19173:13;19169:24;19159:8;19155:39;19149:46;19145:57;19140:3;19136:67;19129:74;;19234:3;19231:1;19227:11;19220:18;;19315:4;19306;19299:5;19295:16;19285:8;19281:31;19275:38;19271:49;19266:3;19262:59;19255:66;;19354:3;19349;19345:13;19338:20;;19394:3;19383:9;19376:22;19444:1;19433:9;19429:17;19416:30;;18778:682;;18703:757;;;18707:42;19490:1;19485:3;19481:11;19510:1;19505:82;;;;19605:1;19600:80;;;;19474:206;;19505:82;19565:6;19560:3;19556:16;19552:1;19541:9;19537:17;19530:43;19505:82;;19600:80;19660:4;19655:3;19651:14;19647:1;19636:9;19632:17;19625:41;19474:206;;19709:10;19701:6;19694:26;18601:1129;;19754:6;19740:21;;;;;;18211:1557;;;;:::o;31673:434::-;31766:1;31752:16;;:2;:16;;;;31744:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;31824:16;31832:7;31824;:16::i;:::-;31823:17;31815:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;31884:45;31913:1;31917:2;31921:7;31884:20;:45::i;:::-;31980:7;31965:13;;;;;;;;;;31944:44;;31961:1;31944:44;;;;;;;;;;;;32016:1;31999:9;:13;32009:2;31999:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32046:2;32027:7;:16;32035:7;32027:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32092:7;32088:2;32064:36;;32073:13;;;;;;;;;;32064:36;;;;;;;;;;;;31673:434;;:::o;20452:155::-;20537:4;20575:25;20560:40;;;:11;:40;;;;20553:47;;20452:155;;;:::o;35725:122::-;;;;:::o;34391:778::-;34541:4;34561:15;:2;:13;;;:15::i;:::-;34557:606;;;34612:2;34596:36;;;34633:12;:10;:12::i;:::-;34647:4;34653:7;34662:5;34596:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34592:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34852:1;34835:6;:13;:18;34831:266;;;34877:60;;;;;;;;;;:::i;:::-;;;;;;;;34831:266;35049:6;35043:13;35034:6;35030:2;35026:15;35019:38;34592:519;34728:41;;;34718:51;;;:6;:51;;;;34711:58;;;;;34557:606;35148:4;35141:11;;34391:778;;;;;;;:::o;7462:377::-;7522:4;7725:12;7790:7;7778:20;7770:28;;7831:1;7824:4;:8;7817:15;;;7462:377;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:623:2:-;;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;274:6;267:5;260:21;300:4;293:5;289:16;282:23;;325:6;375:3;367:4;359:6;355:17;350:3;346:27;343:36;340:2;;;392:1;389;382:12;340:2;420:1;405:236;430:6;427:1;424:13;405:236;;;497:3;525:37;558:3;546:10;525:37;:::i;:::-;520:3;513:50;592:4;587:3;583:14;576:21;;626:4;621:3;617:14;610:21;;465:176;452:1;449;445:9;440:14;;405:236;;;409:14;126:521;;;;;;;:::o;653:343::-;;755:65;771:48;812:6;771:48;:::i;:::-;755:65;:::i;:::-;746:74;;843:6;836:5;829:21;881:4;874:5;870:16;919:3;910:6;905:3;901:16;898:25;895:2;;;936:1;933;926:12;895:2;949:41;983:6;978:3;973;949:41;:::i;:::-;736:260;;;;;;:::o;1002:345::-;;1105:66;1121:49;1163:6;1121:49;:::i;:::-;1105:66;:::i;:::-;1096:75;;1194:6;1187:5;1180:21;1232:4;1225:5;1221:16;1270:3;1261:6;1256:3;1252:16;1249:25;1246:2;;;1287:1;1284;1277:12;1246:2;1300:41;1334:6;1329:3;1324;1300:41;:::i;:::-;1086:261;;;;;;:::o;1353:139::-;;1437:6;1424:20;1415:29;;1453:33;1480:5;1453:33;:::i;:::-;1405:87;;;;:::o;1515:303::-;;1635:3;1628:4;1620:6;1616:17;1612:27;1602:2;;1653:1;1650;1643:12;1602:2;1693:6;1680:20;1718:94;1808:3;1800:6;1793:4;1785:6;1781:17;1718:94;:::i;:::-;1709:103;;1592:226;;;;;:::o;1824:133::-;;1905:6;1892:20;1883:29;;1921:30;1945:5;1921:30;:::i;:::-;1873:84;;;;:::o;1963:137::-;;2046:6;2033:20;2024:29;;2062:32;2088:5;2062:32;:::i;:::-;2014:86;;;;:::o;2106:141::-;;2193:6;2187:13;2178:22;;2209:32;2235:5;2209:32;:::i;:::-;2168:79;;;;:::o;2266:271::-;;2370:3;2363:4;2355:6;2351:17;2347:27;2337:2;;2388:1;2385;2378:12;2337:2;2428:6;2415:20;2453:78;2527:3;2519:6;2512:4;2504:6;2500:17;2453:78;:::i;:::-;2444:87;;2327:210;;;;;:::o;2557:273::-;;2662:3;2655:4;2647:6;2643:17;2639:27;2629:2;;2680:1;2677;2670:12;2629:2;2720:6;2707:20;2745:79;2820:3;2812:6;2805:4;2797:6;2793:17;2745:79;:::i;:::-;2736:88;;2619:211;;;;;:::o;2836:139::-;;2920:6;2907:20;2898:29;;2936:33;2963:5;2936:33;:::i;:::-;2888:87;;;;:::o;2981:262::-;;3089:2;3077:9;3068:7;3064:23;3060:32;3057:2;;;3105:1;3102;3095:12;3057:2;3148:1;3173:53;3218:7;3209:6;3198:9;3194:22;3173:53;:::i;:::-;3163:63;;3119:117;3047:196;;;;:::o;3249:407::-;;;3374:2;3362:9;3353:7;3349:23;3345:32;3342:2;;;3390:1;3387;3380:12;3342:2;3433:1;3458:53;3503:7;3494:6;3483:9;3479:22;3458:53;:::i;:::-;3448:63;;3404:117;3560:2;3586:53;3631:7;3622:6;3611:9;3607:22;3586:53;:::i;:::-;3576:63;;3531:118;3332:324;;;;;:::o;3662:552::-;;;;3804:2;3792:9;3783:7;3779:23;3775:32;3772:2;;;3820:1;3817;3810:12;3772:2;3863:1;3888:53;3933:7;3924:6;3913:9;3909:22;3888:53;:::i;:::-;3878:63;;3834:117;3990:2;4016:53;4061:7;4052:6;4041:9;4037:22;4016:53;:::i;:::-;4006:63;;3961:118;4118:2;4144:53;4189:7;4180:6;4169:9;4165:22;4144:53;:::i;:::-;4134:63;;4089:118;3762:452;;;;;:::o;4220:809::-;;;;;4388:3;4376:9;4367:7;4363:23;4359:33;4356:2;;;4405:1;4402;4395:12;4356:2;4448:1;4473:53;4518:7;4509:6;4498:9;4494:22;4473:53;:::i;:::-;4463:63;;4419:117;4575:2;4601:53;4646:7;4637:6;4626:9;4622:22;4601:53;:::i;:::-;4591:63;;4546:118;4703:2;4729:53;4774:7;4765:6;4754:9;4750:22;4729:53;:::i;:::-;4719:63;;4674:118;4859:2;4848:9;4844:18;4831:32;4890:18;4882:6;4879:30;4876:2;;;4922:1;4919;4912:12;4876:2;4950:62;5004:7;4995:6;4984:9;4980:22;4950:62;:::i;:::-;4940:72;;4802:220;4346:683;;;;;;;:::o;5035:401::-;;;5157:2;5145:9;5136:7;5132:23;5128:32;5125:2;;;5173:1;5170;5163:12;5125:2;5216:1;5241:53;5286:7;5277:6;5266:9;5262:22;5241:53;:::i;:::-;5231:63;;5187:117;5343:2;5369:50;5411:7;5402:6;5391:9;5387:22;5369:50;:::i;:::-;5359:60;;5314:115;5115:321;;;;;:::o;5442:407::-;;;5567:2;5555:9;5546:7;5542:23;5538:32;5535:2;;;5583:1;5580;5573:12;5535:2;5626:1;5651:53;5696:7;5687:6;5676:9;5672:22;5651:53;:::i;:::-;5641:63;;5597:117;5753:2;5779:53;5824:7;5815:6;5804:9;5800:22;5779:53;:::i;:::-;5769:63;;5724:118;5525:324;;;;;:::o;5855:405::-;;5988:2;5976:9;5967:7;5963:23;5959:32;5956:2;;;6004:1;6001;5994:12;5956:2;6075:1;6064:9;6060:17;6047:31;6105:18;6097:6;6094:30;6091:2;;;6137:1;6134;6127:12;6091:2;6165:78;6235:7;6226:6;6215:9;6211:22;6165:78;:::i;:::-;6155:88;;6018:235;5946:314;;;;:::o;6266:260::-;;6373:2;6361:9;6352:7;6348:23;6344:32;6341:2;;;6389:1;6386;6379:12;6341:2;6432:1;6457:52;6501:7;6492:6;6481:9;6477:22;6457:52;:::i;:::-;6447:62;;6403:116;6331:195;;;;:::o;6532:282::-;;6650:2;6638:9;6629:7;6625:23;6621:32;6618:2;;;6666:1;6663;6656:12;6618:2;6709:1;6734:63;6789:7;6780:6;6769:9;6765:22;6734:63;:::i;:::-;6724:73;;6680:127;6608:206;;;;:::o;6820:375::-;;6938:2;6926:9;6917:7;6913:23;6909:32;6906:2;;;6954:1;6951;6944:12;6906:2;7025:1;7014:9;7010:17;6997:31;7055:18;7047:6;7044:30;7041:2;;;7087:1;7084;7077:12;7041:2;7115:63;7170:7;7161:6;7150:9;7146:22;7115:63;:::i;:::-;7105:73;;6968:220;6896:299;;;;:::o;7201:633::-;;;7346:2;7334:9;7325:7;7321:23;7317:32;7314:2;;;7362:1;7359;7352:12;7314:2;7433:1;7422:9;7418:17;7405:31;7463:18;7455:6;7452:30;7449:2;;;7495:1;7492;7485:12;7449:2;7523:63;7578:7;7569:6;7558:9;7554:22;7523:63;:::i;:::-;7513:73;;7376:220;7663:2;7652:9;7648:18;7635:32;7694:18;7686:6;7683:30;7680:2;;;7726:1;7723;7716:12;7680:2;7754:63;7809:7;7800:6;7789:9;7785:22;7754:63;:::i;:::-;7744:73;;7606:221;7304:530;;;;;:::o;7840:1668::-;;;;;;;8093:3;8081:9;8072:7;8068:23;8064:33;8061:2;;;8110:1;8107;8100:12;8061:2;8181:1;8170:9;8166:17;8153:31;8211:18;8203:6;8200:30;8197:2;;;8243:1;8240;8233:12;8197:2;8271:63;8326:7;8317:6;8306:9;8302:22;8271:63;:::i;:::-;8261:73;;8124:220;8411:2;8400:9;8396:18;8383:32;8442:18;8434:6;8431:30;8428:2;;;8474:1;8471;8464:12;8428:2;8502:63;8557:7;8548:6;8537:9;8533:22;8502:63;:::i;:::-;8492:73;;8354:221;8642:2;8631:9;8627:18;8614:32;8673:18;8665:6;8662:30;8659:2;;;8705:1;8702;8695:12;8659:2;8733:63;8788:7;8779:6;8768:9;8764:22;8733:63;:::i;:::-;8723:73;;8585:221;8873:2;8862:9;8858:18;8845:32;8904:18;8896:6;8893:30;8890:2;;;8936:1;8933;8926:12;8890:2;8964:63;9019:7;9010:6;8999:9;8995:22;8964:63;:::i;:::-;8954:73;;8816:221;9104:3;9093:9;9089:19;9076:33;9136:18;9128:6;9125:30;9122:2;;;9168:1;9165;9158:12;9122:2;9196:63;9251:7;9242:6;9231:9;9227:22;9196:63;:::i;:::-;9186:73;;9047:222;9336:3;9325:9;9321:19;9308:33;9368:18;9360:6;9357:30;9354:2;;;9400:1;9397;9390:12;9354:2;9428:63;9483:7;9474:6;9463:9;9459:22;9428:63;:::i;:::-;9418:73;;9279:222;8051:1457;;;;;;;;:::o;9514:262::-;;9622:2;9610:9;9601:7;9597:23;9593:32;9590:2;;;9638:1;9635;9628:12;9590:2;9681:1;9706:53;9751:7;9742:6;9731:9;9727:22;9706:53;:::i;:::-;9696:63;;9652:117;9580:196;;;;:::o;9782:520::-;;;9917:2;9905:9;9896:7;9892:23;9888:32;9885:2;;;9933:1;9930;9923:12;9885:2;9976:1;10001:53;10046:7;10037:6;10026:9;10022:22;10001:53;:::i;:::-;9991:63;;9947:117;10131:2;10120:9;10116:18;10103:32;10162:18;10154:6;10151:30;10148:2;;;10194:1;10191;10184:12;10148:2;10222:63;10277:7;10268:6;10257:9;10253:22;10222:63;:::i;:::-;10212:73;;10074:221;9875:427;;;;;:::o;10308:778::-;;;;10470:2;10458:9;10449:7;10445:23;10441:32;10438:2;;;10486:1;10483;10476:12;10438:2;10529:1;10554:53;10599:7;10590:6;10579:9;10575:22;10554:53;:::i;:::-;10544:63;;10500:117;10684:2;10673:9;10669:18;10656:32;10715:18;10707:6;10704:30;10701:2;;;10747:1;10744;10737:12;10701:2;10775:63;10830:7;10821:6;10810:9;10806:22;10775:63;:::i;:::-;10765:73;;10627:221;10915:2;10904:9;10900:18;10887:32;10946:18;10938:6;10935:30;10932:2;;;10978:1;10975;10968:12;10932:2;11006:63;11061:7;11052:6;11041:9;11037:22;11006:63;:::i;:::-;10996:73;;10858:221;10428:658;;;;;:::o;11092:407::-;;;11217:2;11205:9;11196:7;11192:23;11188:32;11185:2;;;11233:1;11230;11223:12;11185:2;11276:1;11301:53;11346:7;11337:6;11326:9;11322:22;11301:53;:::i;:::-;11291:63;;11247:117;11403:2;11429:53;11474:7;11465:6;11454:9;11450:22;11429:53;:::i;:::-;11419:63;;11374:118;11175:324;;;;;:::o;11505:118::-;11592:24;11610:5;11592:24;:::i;:::-;11587:3;11580:37;11570:53;;:::o;11629:109::-;11710:21;11725:5;11710:21;:::i;:::-;11705:3;11698:34;11688:50;;:::o;11744:360::-;;11858:38;11890:5;11858:38;:::i;:::-;11912:70;11975:6;11970:3;11912:70;:::i;:::-;11905:77;;11991:52;12036:6;12031:3;12024:4;12017:5;12013:16;11991:52;:::i;:::-;12068:29;12090:6;12068:29;:::i;:::-;12063:3;12059:39;12052:46;;11834:270;;;;;:::o;12110:364::-;;12226:39;12259:5;12226:39;:::i;:::-;12281:71;12345:6;12340:3;12281:71;:::i;:::-;12274:78;;12361:52;12406:6;12401:3;12394:4;12387:5;12383:16;12361:52;:::i;:::-;12438:29;12460:6;12438:29;:::i;:::-;12433:3;12429:39;12422:46;;12202:272;;;;;:::o;12480:377::-;;12614:39;12647:5;12614:39;:::i;:::-;12669:89;12751:6;12746:3;12669:89;:::i;:::-;12662:96;;12767:52;12812:6;12807:3;12800:4;12793:5;12789:16;12767:52;:::i;:::-;12844:6;12839:3;12835:16;12828:23;;12590:267;;;;;:::o;12887:845::-;;13027:5;13021:12;13056:36;13082:9;13056:36;:::i;:::-;13108:89;13190:6;13185:3;13108:89;:::i;:::-;13101:96;;13228:1;13217:9;13213:17;13244:1;13239:137;;;;13390:1;13385:341;;;;13206:520;;13239:137;13323:4;13319:9;13308;13304:25;13299:3;13292:38;13359:6;13354:3;13350:16;13343:23;;13239:137;;13385:341;13452:38;13484:5;13452:38;:::i;:::-;13512:1;13526:154;13540:6;13537:1;13534:13;13526:154;;;13614:7;13608:14;13604:1;13599:3;13595:11;13588:35;13664:1;13655:7;13651:15;13640:26;;13562:4;13559:1;13555:12;13550:17;;13526:154;;;13709:6;13704:3;13700:16;13693:23;;13392:334;;13206:520;;12994:738;;;;;;:::o;13738:402::-;;13919:85;14001:2;13996:3;13919:85;:::i;:::-;13912:92;;14013:93;14102:3;14013:93;:::i;:::-;14131:2;14126:3;14122:12;14115:19;;13902:238;;;:::o;14146:366::-;;14309:67;14373:2;14368:3;14309:67;:::i;:::-;14302:74;;14385:93;14474:3;14385:93;:::i;:::-;14503:2;14498:3;14494:12;14487:19;;14292:220;;;:::o;14518:366::-;;14681:67;14745:2;14740:3;14681:67;:::i;:::-;14674:74;;14757:93;14846:3;14757:93;:::i;:::-;14875:2;14870:3;14866:12;14859:19;;14664:220;;;:::o;14890:366::-;;15053:67;15117:2;15112:3;15053:67;:::i;:::-;15046:74;;15129:93;15218:3;15129:93;:::i;:::-;15247:2;15242:3;15238:12;15231:19;;15036:220;;;:::o;15262:366::-;;15425:67;15489:2;15484:3;15425:67;:::i;:::-;15418:74;;15501:93;15590:3;15501:93;:::i;:::-;15619:2;15614:3;15610:12;15603:19;;15408:220;;;:::o;15634:366::-;;15797:67;15861:2;15856:3;15797:67;:::i;:::-;15790:74;;15873:93;15962:3;15873:93;:::i;:::-;15991:2;15986:3;15982:12;15975:19;;15780:220;;;:::o;16006:366::-;;16169:67;16233:2;16228:3;16169:67;:::i;:::-;16162:74;;16245:93;16334:3;16245:93;:::i;:::-;16363:2;16358:3;16354:12;16347:19;;16152:220;;;:::o;16378:366::-;;16541:67;16605:2;16600:3;16541:67;:::i;:::-;16534:74;;16617:93;16706:3;16617:93;:::i;:::-;16735:2;16730:3;16726:12;16719:19;;16524:220;;;:::o;16750:366::-;;16913:67;16977:2;16972:3;16913:67;:::i;:::-;16906:74;;16989:93;17078:3;16989:93;:::i;:::-;17107:2;17102:3;17098:12;17091:19;;16896:220;;;:::o;17122:366::-;;17285:67;17349:2;17344:3;17285:67;:::i;:::-;17278:74;;17361:93;17450:3;17361:93;:::i;:::-;17479:2;17474:3;17470:12;17463:19;;17268:220;;;:::o;17494:400::-;;17675:84;17757:1;17752:3;17675:84;:::i;:::-;17668:91;;17768:93;17857:3;17768:93;:::i;:::-;17886:1;17881:3;17877:11;17870:18;;17658:236;;;:::o;17900:366::-;;18063:67;18127:2;18122:3;18063:67;:::i;:::-;18056:74;;18139:93;18228:3;18139:93;:::i;:::-;18257:2;18252:3;18248:12;18241:19;;18046:220;;;:::o;18272:402::-;;18453:85;18535:2;18530:3;18453:85;:::i;:::-;18446:92;;18547:93;18636:3;18547:93;:::i;:::-;18665:2;18660:3;18656:12;18649:19;;18436:238;;;:::o;18680:402::-;;18861:85;18943:2;18938:3;18861:85;:::i;:::-;18854:92;;18955:93;19044:3;18955:93;:::i;:::-;19073:2;19068:3;19064:12;19057:19;;18844:238;;;:::o;19088:366::-;;19251:67;19315:2;19310:3;19251:67;:::i;:::-;19244:74;;19327:93;19416:3;19327:93;:::i;:::-;19445:2;19440:3;19436:12;19429:19;;19234:220;;;:::o;19460:366::-;;19623:67;19687:2;19682:3;19623:67;:::i;:::-;19616:74;;19699:93;19788:3;19699:93;:::i;:::-;19817:2;19812:3;19808:12;19801:19;;19606:220;;;:::o;19832:366::-;;19995:67;20059:2;20054:3;19995:67;:::i;:::-;19988:74;;20071:93;20160:3;20071:93;:::i;:::-;20189:2;20184:3;20180:12;20173:19;;19978:220;;;:::o;20204:402::-;;20385:85;20467:2;20462:3;20385:85;:::i;:::-;20378:92;;20479:93;20568:3;20479:93;:::i;:::-;20597:2;20592:3;20588:12;20581:19;;20368:238;;;:::o;20612:366::-;;20775:67;20839:2;20834:3;20775:67;:::i;:::-;20768:74;;20851:93;20940:3;20851:93;:::i;:::-;20969:2;20964:3;20960:12;20953:19;;20758:220;;;:::o;20984:402::-;;21165:85;21247:2;21242:3;21165:85;:::i;:::-;21158:92;;21259:93;21348:3;21259:93;:::i;:::-;21377:2;21372:3;21368:12;21361:19;;21148:238;;;:::o;21392:366::-;;21555:67;21619:2;21614:3;21555:67;:::i;:::-;21548:74;;21631:93;21720:3;21631:93;:::i;:::-;21749:2;21744:3;21740:12;21733:19;;21538:220;;;:::o;21764:402::-;;21945:85;22027:2;22022:3;21945:85;:::i;:::-;21938:92;;22039:93;22128:3;22039:93;:::i;:::-;22157:2;22152:3;22148:12;22141:19;;21928:238;;;:::o;22172:402::-;;22353:85;22435:2;22430:3;22353:85;:::i;:::-;22346:92;;22447:93;22536:3;22447:93;:::i;:::-;22565:2;22560:3;22556:12;22549:19;;22336:238;;;:::o;22580:366::-;;22743:67;22807:2;22802:3;22743:67;:::i;:::-;22736:74;;22819:93;22908:3;22819:93;:::i;:::-;22937:2;22932:3;22928:12;22921:19;;22726:220;;;:::o;22952:366::-;;23115:67;23179:2;23174:3;23115:67;:::i;:::-;23108:74;;23191:93;23280:3;23191:93;:::i;:::-;23309:2;23304:3;23300:12;23293:19;;23098:220;;;:::o;23324:366::-;;23487:67;23551:2;23546:3;23487:67;:::i;:::-;23480:74;;23563:93;23652:3;23563:93;:::i;:::-;23681:2;23676:3;23672:12;23665:19;;23470:220;;;:::o;23696:402::-;;23877:85;23959:2;23954:3;23877:85;:::i;:::-;23870:92;;23971:93;24060:3;23971:93;:::i;:::-;24089:2;24084:3;24080:12;24073:19;;23860:238;;;:::o;24104:366::-;;24267:67;24331:2;24326:3;24267:67;:::i;:::-;24260:74;;24343:93;24432:3;24343:93;:::i;:::-;24461:2;24456:3;24452:12;24445:19;;24250:220;;;:::o;24476:118::-;24563:24;24581:5;24563:24;:::i;:::-;24558:3;24551:37;24541:53;;:::o;24600:275::-;;24754:95;24845:3;24836:6;24754:95;:::i;:::-;24747:102;;24866:3;24859:10;;24736:139;;;;:::o;24881:589::-;;25128:95;25219:3;25210:6;25128:95;:::i;:::-;25121:102;;25240:95;25331:3;25322:6;25240:95;:::i;:::-;25233:102;;25352:92;25440:3;25431:6;25352:92;:::i;:::-;25345:99;;25461:3;25454:10;;25110:360;;;;;;:::o;25476:583::-;;25720:92;25808:3;25799:6;25720:92;:::i;:::-;25713:99;;25829:95;25920:3;25911:6;25829:95;:::i;:::-;25822:102;;25941:92;26029:3;26020:6;25941:92;:::i;:::-;25934:99;;26050:3;26043:10;;25702:357;;;;;;:::o;26065:3813::-;;27444:148;27588:3;27444:148;:::i;:::-;27437:155;;27609:92;27697:3;27688:6;27609:92;:::i;:::-;27602:99;;27718:95;27809:3;27800:6;27718:95;:::i;:::-;27711:102;;27830:92;27918:3;27909:6;27830:92;:::i;:::-;27823:99;;27939:148;28083:3;27939:148;:::i;:::-;27932:155;;28104:92;28192:3;28183:6;28104:92;:::i;:::-;28097:99;;28213:148;28357:3;28213:148;:::i;:::-;28206:155;;28378:95;28469:3;28460:6;28378:95;:::i;:::-;28371:102;;28490:148;28634:3;28490:148;:::i;:::-;28483:155;;28655:95;28746:3;28737:6;28655:95;:::i;:::-;28648:102;;28767:148;28911:3;28767:148;:::i;:::-;28760:155;;28932:92;29020:3;29011:6;28932:92;:::i;:::-;28925:99;;29041:95;29132:3;29123:6;29041:95;:::i;:::-;29034:102;;29153:148;29297:3;29153:148;:::i;:::-;29146:155;;29318:92;29406:3;29397:6;29318:92;:::i;:::-;29311:99;;29427:148;29571:3;29427:148;:::i;:::-;29420:155;;29592:95;29683:3;29674:6;29592:95;:::i;:::-;29585:102;;29704:148;29848:3;29704:148;:::i;:::-;29697:155;;29869:3;29862:10;;27426:2452;;;;;;;;;;;;;:::o;29884:541::-;;30139:148;30283:3;30139:148;:::i;:::-;30132:155;;30304:95;30395:3;30386:6;30304:95;:::i;:::-;30297:102;;30416:3;30409:10;;30121:304;;;;:::o;30431:222::-;;30562:2;30551:9;30547:18;30539:26;;30575:71;30643:1;30632:9;30628:17;30619:6;30575:71;:::i;:::-;30529:124;;;;:::o;30659:640::-;;30892:3;30881:9;30877:19;30869:27;;30906:71;30974:1;30963:9;30959:17;30950:6;30906:71;:::i;:::-;30987:72;31055:2;31044:9;31040:18;31031:6;30987:72;:::i;:::-;31069;31137:2;31126:9;31122:18;31113:6;31069:72;:::i;:::-;31188:9;31182:4;31178:20;31173:2;31162:9;31158:18;31151:48;31216:76;31287:4;31278:6;31216:76;:::i;:::-;31208:84;;30859:440;;;;;;;:::o;31305:332::-;;31464:2;31453:9;31449:18;31441:26;;31477:71;31545:1;31534:9;31530:17;31521:6;31477:71;:::i;:::-;31558:72;31626:2;31615:9;31611:18;31602:6;31558:72;:::i;:::-;31431:206;;;;;:::o;31643:210::-;;31768:2;31757:9;31753:18;31745:26;;31781:65;31843:1;31832:9;31828:17;31819:6;31781:65;:::i;:::-;31735:118;;;;:::o;31859:313::-;;32010:2;31999:9;31995:18;31987:26;;32059:9;32053:4;32049:20;32045:1;32034:9;32030:17;32023:47;32087:78;32160:4;32151:6;32087:78;:::i;:::-;32079:86;;31977:195;;;;:::o;32178:419::-;;32382:2;32371:9;32367:18;32359:26;;32431:9;32425:4;32421:20;32417:1;32406:9;32402:17;32395:47;32459:131;32585:4;32459:131;:::i;:::-;32451:139;;32349:248;;;:::o;32603:419::-;;32807:2;32796:9;32792:18;32784:26;;32856:9;32850:4;32846:20;32842:1;32831:9;32827:17;32820:47;32884:131;33010:4;32884:131;:::i;:::-;32876:139;;32774:248;;;:::o;33028:419::-;;33232:2;33221:9;33217:18;33209:26;;33281:9;33275:4;33271:20;33267:1;33256:9;33252:17;33245:47;33309:131;33435:4;33309:131;:::i;:::-;33301:139;;33199:248;;;:::o;33453:419::-;;33657:2;33646:9;33642:18;33634:26;;33706:9;33700:4;33696:20;33692:1;33681:9;33677:17;33670:47;33734:131;33860:4;33734:131;:::i;:::-;33726:139;;33624:248;;;:::o;33878:419::-;;34082:2;34071:9;34067:18;34059:26;;34131:9;34125:4;34121:20;34117:1;34106:9;34102:17;34095:47;34159:131;34285:4;34159:131;:::i;:::-;34151:139;;34049:248;;;:::o;34303:419::-;;34507:2;34496:9;34492:18;34484:26;;34556:9;34550:4;34546:20;34542:1;34531:9;34527:17;34520:47;34584:131;34710:4;34584:131;:::i;:::-;34576:139;;34474:248;;;:::o;34728:419::-;;34932:2;34921:9;34917:18;34909:26;;34981:9;34975:4;34971:20;34967:1;34956:9;34952:17;34945:47;35009:131;35135:4;35009:131;:::i;:::-;35001:139;;34899:248;;;:::o;35153:419::-;;35357:2;35346:9;35342:18;35334:26;;35406:9;35400:4;35396:20;35392:1;35381:9;35377:17;35370:47;35434:131;35560:4;35434:131;:::i;:::-;35426:139;;35324:248;;;:::o;35578:419::-;;35782:2;35771:9;35767:18;35759:26;;35831:9;35825:4;35821:20;35817:1;35806:9;35802:17;35795:47;35859:131;35985:4;35859:131;:::i;:::-;35851:139;;35749:248;;;:::o;36003:419::-;;36207:2;36196:9;36192:18;36184:26;;36256:9;36250:4;36246:20;36242:1;36231:9;36227:17;36220:47;36284:131;36410:4;36284:131;:::i;:::-;36276:139;;36174:248;;;:::o;36428:419::-;;36632:2;36621:9;36617:18;36609:26;;36681:9;36675:4;36671:20;36667:1;36656:9;36652:17;36645:47;36709:131;36835:4;36709:131;:::i;:::-;36701:139;;36599:248;;;:::o;36853:419::-;;37057:2;37046:9;37042:18;37034:26;;37106:9;37100:4;37096:20;37092:1;37081:9;37077:17;37070:47;37134:131;37260:4;37134:131;:::i;:::-;37126:139;;37024:248;;;:::o;37278:419::-;;37482:2;37471:9;37467:18;37459:26;;37531:9;37525:4;37521:20;37517:1;37506:9;37502:17;37495:47;37559:131;37685:4;37559:131;:::i;:::-;37551:139;;37449:248;;;:::o;37703:419::-;;37907:2;37896:9;37892:18;37884:26;;37956:9;37950:4;37946:20;37942:1;37931:9;37927:17;37920:47;37984:131;38110:4;37984:131;:::i;:::-;37976:139;;37874:248;;;:::o;38128:419::-;;38332:2;38321:9;38317:18;38309:26;;38381:9;38375:4;38371:20;38367:1;38356:9;38352:17;38345:47;38409:131;38535:4;38409:131;:::i;:::-;38401:139;;38299:248;;;:::o;38553:419::-;;38757:2;38746:9;38742:18;38734:26;;38806:9;38800:4;38796:20;38792:1;38781:9;38777:17;38770:47;38834:131;38960:4;38834:131;:::i;:::-;38826:139;;38724:248;;;:::o;38978:419::-;;39182:2;39171:9;39167:18;39159:26;;39231:9;39225:4;39221:20;39217:1;39206:9;39202:17;39195:47;39259:131;39385:4;39259:131;:::i;:::-;39251:139;;39149:248;;;:::o;39403:419::-;;39607:2;39596:9;39592:18;39584:26;;39656:9;39650:4;39646:20;39642:1;39631:9;39627:17;39620:47;39684:131;39810:4;39684:131;:::i;:::-;39676:139;;39574:248;;;:::o;39828:419::-;;40032:2;40021:9;40017:18;40009:26;;40081:9;40075:4;40071:20;40067:1;40056:9;40052:17;40045:47;40109:131;40235:4;40109:131;:::i;:::-;40101:139;;39999:248;;;:::o;40253:222::-;;40384:2;40373:9;40369:18;40361:26;;40397:71;40465:1;40454:9;40450:17;40441:6;40397:71;:::i;:::-;40351:124;;;;:::o;40481:129::-;;40542:20;;:::i;:::-;40532:30;;40571:33;40599:4;40591:6;40571:33;:::i;:::-;40522:88;;;:::o;40616:75::-;;40682:2;40676:9;40666:19;;40656:35;:::o;40697:311::-;;40864:18;40856:6;40853:30;40850:2;;;40886:18;;:::i;:::-;40850:2;40936:4;40928:6;40924:17;40916:25;;40996:4;40990;40986:15;40978:23;;40779:229;;;:::o;41014:307::-;;41165:18;41157:6;41154:30;41151:2;;;41187:18;;:::i;:::-;41151:2;41225:29;41247:6;41225:29;:::i;:::-;41217:37;;41309:4;41303;41299:15;41291:23;;41080:241;;;:::o;41327:308::-;;41479:18;41471:6;41468:30;41465:2;;;41501:18;;:::i;:::-;41465:2;41539:29;41561:6;41539:29;:::i;:::-;41531:37;;41623:4;41617;41613:15;41605:23;;41394:241;;;:::o;41641:141::-;;41713:3;41705:11;;41736:3;41733:1;41726:14;41770:4;41767:1;41757:18;41749:26;;41695:87;;;:::o;41788:98::-;;41873:5;41867:12;41857:22;;41846:40;;;:::o;41892:99::-;;41978:5;41972:12;41962:22;;41951:40;;;:::o;41997:168::-;;42114:6;42109:3;42102:19;42154:4;42149:3;42145:14;42130:29;;42092:73;;;;:::o;42171:169::-;;42289:6;42284:3;42277:19;42329:4;42324:3;42320:14;42305:29;;42267:73;;;;:::o;42346:148::-;;42485:3;42470:18;;42460:34;;;;:::o;42500:305::-;;42559:20;42577:1;42559:20;:::i;:::-;42554:25;;42593:20;42611:1;42593:20;:::i;:::-;42588:25;;42747:1;42679:66;42675:74;42672:1;42669:81;42666:2;;;42753:18;;:::i;:::-;42666:2;42797:1;42794;42790:9;42783:16;;42544:261;;;;:::o;42811:185::-;;42868:20;42886:1;42868:20;:::i;:::-;42863:25;;42902:20;42920:1;42902:20;:::i;:::-;42897:25;;42941:1;42931:2;;42946:18;;:::i;:::-;42931:2;42988:1;42985;42981:9;42976:14;;42853:143;;;;:::o;43002:348::-;;43065:20;43083:1;43065:20;:::i;:::-;43060:25;;43099:20;43117:1;43099:20;:::i;:::-;43094:25;;43287:1;43219:66;43215:74;43212:1;43209:81;43204:1;43197:9;43190:17;43186:105;43183:2;;;43294:18;;:::i;:::-;43183:2;43342:1;43339;43335:9;43324:20;;43050:300;;;;:::o;43356:191::-;;43416:20;43434:1;43416:20;:::i;:::-;43411:25;;43450:20;43468:1;43450:20;:::i;:::-;43445:25;;43489:1;43486;43483:8;43480:2;;;43494:18;;:::i;:::-;43480:2;43539:1;43536;43532:9;43524:17;;43401:146;;;;:::o;43553:96::-;;43619:24;43637:5;43619:24;:::i;:::-;43608:35;;43598:51;;;:::o;43655:90::-;;43732:5;43725:13;43718:21;43707:32;;43697:48;;;:::o;43751:149::-;;43827:66;43820:5;43816:78;43805:89;;43795:105;;;:::o;43906:126::-;;43983:42;43976:5;43972:54;43961:65;;43951:81;;;:::o;44038:77::-;;44104:5;44093:16;;44083:32;;;:::o;44121:154::-;44205:6;44200:3;44195;44182:30;44267:1;44258:6;44253:3;44249:16;44242:27;44172:103;;;:::o;44281:307::-;44349:1;44359:113;44373:6;44370:1;44367:13;44359:113;;;44458:1;44453:3;44449:11;44443:18;44439:1;44434:3;44430:11;44423:39;44395:2;44392:1;44388:10;44383:15;;44359:113;;;44490:6;44487:1;44484:13;44481:2;;;44570:1;44561:6;44556:3;44552:16;44545:27;44481:2;44330:258;;;;:::o;44594:320::-;;44675:1;44669:4;44665:12;44655:22;;44722:1;44716:4;44712:12;44743:18;44733:2;;44799:4;44791:6;44787:17;44777:27;;44733:2;44861;44853:6;44850:14;44830:18;44827:38;44824:2;;;44880:18;;:::i;:::-;44824:2;44645:269;;;;:::o;44920:281::-;45003:27;45025:4;45003:27;:::i;:::-;44995:6;44991:40;45133:6;45121:10;45118:22;45097:18;45085:10;45082:34;45079:62;45076:2;;;45144:18;;:::i;:::-;45076:2;45184:10;45180:2;45173:22;44963:238;;;:::o;45207:233::-;;45269:24;45287:5;45269:24;:::i;:::-;45260:33;;45315:66;45308:5;45305:77;45302:2;;;45385:18;;:::i;:::-;45302:2;45432:1;45425:5;45421:13;45414:20;;45250:190;;;:::o;45446:176::-;;45495:20;45513:1;45495:20;:::i;:::-;45490:25;;45529:20;45547:1;45529:20;:::i;:::-;45524:25;;45568:1;45558:2;;45573:18;;:::i;:::-;45558:2;45614:1;45611;45607:9;45602:14;;45480:142;;;;:::o;45628:180::-;45676:77;45673:1;45666:88;45773:4;45770:1;45763:15;45797:4;45794:1;45787:15;45814:180;45862:77;45859:1;45852:88;45959:4;45956:1;45949:15;45983:4;45980:1;45973:15;46000:180;46048:77;46045:1;46038:88;46145:4;46142:1;46135:15;46169:4;46166:1;46159:15;46186:180;46234:77;46231:1;46224:88;46331:4;46328:1;46321:15;46355:4;46352:1;46345:15;46372:102;;46464:2;46460:7;46455:2;46448:5;46444:14;46440:28;46430:38;;46420:54;;;:::o;46480:214::-;46620:66;46616:1;46608:6;46604:14;46597:90;46586:108;:::o;46700:237::-;46840:34;46836:1;46828:6;46824:14;46817:58;46909:20;46904:2;46896:6;46892:15;46885:45;46806:131;:::o;46943:225::-;47083:34;47079:1;47071:6;47067:14;47060:58;47152:8;47147:2;47139:6;47135:15;47128:33;47049:119;:::o;47174:178::-;47314:30;47310:1;47302:6;47298:14;47291:54;47280:72;:::o;47358:223::-;47498:34;47494:1;47486:6;47482:14;47475:58;47567:6;47562:2;47554:6;47550:15;47543:31;47464:117;:::o;47587:175::-;47727:27;47723:1;47715:6;47711:14;47704:51;47693:69;:::o;47768:231::-;47908:34;47904:1;47896:6;47892:14;47885:58;47977:14;47972:2;47964:6;47960:15;47953:39;47874:125;:::o;48005:243::-;48145:34;48141:1;48133:6;48129:14;48122:58;48214:26;48209:2;48201:6;48197:15;48190:51;48111:137;:::o;48254:229::-;48394:34;48390:1;48382:6;48378:14;48371:58;48463:12;48458:2;48450:6;48446:15;48439:37;48360:123;:::o;48489:228::-;48629:34;48625:1;48617:6;48613:14;48606:58;48698:11;48693:2;48685:6;48681:15;48674:36;48595:122;:::o;48723:214::-;48863:66;48859:1;48851:6;48847:14;48840:90;48829:108;:::o;48943:182::-;49083:34;49079:1;49071:6;49067:14;49060:58;49049:76;:::o;49131:214::-;49271:66;49267:1;49259:6;49255:14;49248:90;49237:108;:::o;49351:214::-;49491:66;49487:1;49479:6;49475:14;49468:90;49457:108;:::o;49571:231::-;49711:34;49707:1;49699:6;49695:14;49688:58;49780:14;49775:2;49767:6;49763:15;49756:39;49677:125;:::o;49808:182::-;49948:34;49944:1;49936:6;49932:14;49925:58;49914:76;:::o;49996:228::-;50136:34;50132:1;50124:6;50120:14;50113:58;50205:11;50200:2;50192:6;50188:15;50181:36;50102:122;:::o;50230:214::-;50370:66;50366:1;50358:6;50354:14;50347:90;50336:108;:::o;50450:234::-;50590:34;50586:1;50578:6;50574:14;50567:58;50659:17;50654:2;50646:6;50642:15;50635:42;50556:128;:::o;50690:214::-;50830:66;50826:1;50818:6;50814:14;50807:90;50796:108;:::o;50910:220::-;51050:34;51046:1;51038:6;51034:14;51027:58;51119:3;51114:2;51106:6;51102:15;51095:28;51016:114;:::o;51136:214::-;51276:66;51272:1;51264:6;51260:14;51253:90;51242:108;:::o;51356:179::-;51496:31;51492:1;51484:6;51480:14;51473:55;51462:73;:::o;51541:236::-;51681:34;51677:1;51669:6;51665:14;51658:58;51750:19;51745:2;51737:6;51733:15;51726:44;51647:130;:::o;51783:235::-;51923:34;51919:1;51911:6;51907:14;51900:58;51992:18;51987:2;51979:6;51975:15;51968:43;51889:129;:::o;52024:235::-;52164:34;52160:1;52152:6;52148:14;52141:58;52233:18;52228:2;52220:6;52216:15;52209:43;52130:129;:::o;52265:214::-;52405:66;52401:1;52393:6;52389:14;52382:90;52371:108;:::o;52485:230::-;52625:34;52621:1;52613:6;52609:14;52602:58;52694:13;52689:2;52681:6;52677:15;52670:38;52591:124;:::o;52721:122::-;52794:24;52812:5;52794:24;:::i;:::-;52787:5;52784:35;52774:2;;52833:1;52830;52823:12;52774:2;52764:79;:::o;52849:116::-;52919:21;52934:5;52919:21;:::i;:::-;52912:5;52909:32;52899:2;;52955:1;52952;52945:12;52899:2;52889:76;:::o;52971:120::-;53043:23;53060:5;53043:23;:::i;:::-;53036:5;53033:34;53023:2;;53081:1;53078;53071:12;53023:2;53013:78;:::o;53097:122::-;53170:24;53188:5;53170:24;:::i;:::-;53163:5;53160:35;53150:2;;53209:1;53206;53199:12;53150:2;53140:79;:::o

Swarm Source

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