Token SPANKERSNFT

 

Overview ERC-721

Total Supply:
420 SPANKERSNFT

Holders:
75 addresses

Transfers:
-

Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
SPANKERSNFT

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-04-13
*/

//SPDX-License-Identifier: MIT
  // File @openzeppelin/contracts/utils/introspection/[email protected]

  pragma solidity ^0.8.0;

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

  // File @openzeppelin/contracts/token/ERC721/[email protected]

  pragma solidity ^0.8.0;

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

  pragma solidity ^0.8.7;
  /**
  * @title ClampedRandomizer, MIT License
  * @author Potluck Protocol
  * @dev See https://github.com/PotluckProtocol/LabsAcceptor/blob/ee0ff16b4ec2ade16f1b5f1de7398ca960f036dd/ClampedRandomizer
  */
  contract ClampedRandomizer {
      uint256 private _scopeIndex = 0; //Clamping cache for random TokenID generation in the anti-sniping algo
      uint256 private immutable _scopeCap; //Size of initial randomized number pool & max generated value (zero indexed)
      mapping(uint256 => uint256) _swappedIDs; //TokenID cache for random TokenID generation in the anti-sniping algo

      constructor(uint256 scopeCap) {
          _scopeCap = scopeCap;
      }

      function _genClampedNonce() internal virtual returns(uint256) {
          uint256 scope = _scopeCap-_scopeIndex;
          uint256 swap;
          uint256 result;

          uint256 i = randomNumber() % scope;

          //Setup the value to swap in for the selected number
          if (_swappedIDs[scope-1] == 0){
              swap = scope-1;
          } else {
              swap = _swappedIDs[scope-1];
          }

          //Select a random number, swap it out with an unselected one then shorten the selection range by 1
          if (_swappedIDs[i] == 0){
              result = i;
              _swappedIDs[i] = swap;
          } else {
              result = _swappedIDs[i];
              _swappedIDs[i] = swap;
          }
          _scopeIndex++;
          return result;
      }

      function randomNumber() internal view returns(uint256){
          return uint256(keccak256(abi.encodePacked(block.difficulty, block.timestamp)));
      }
  }

  // File @openzeppelin/contracts/token/ERC721/[email protected]

  pragma solidity ^0.8.0;

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

  // File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

  pragma solidity ^0.8.0;

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

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

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

  // File @openzeppelin/contracts/utils/[email protected]

  pragma solidity ^0.8.0;

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

          uint256 size;
          // solhint-disable-next-line no-inline-assembly
          assembly {
              size := extcodesize(account)
          }
          return size > 0;
      }

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

          // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
          (bool success, ) = recipient.call{value: amount}("");
          require(
              success,
              "Address: unable to send value, recipient may have reverted"
          );
      }

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

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

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

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

          // solhint-disable-next-line avoid-low-level-calls
          (bool success, bytes memory returndata) = target.call{value: value}(
              data
          );
          return _verifyCallResult(success, returndata, errorMessage);
      }

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

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

          // solhint-disable-next-line avoid-low-level-calls
          (bool success, bytes memory returndata) = target.staticcall(data);
          return _verifyCallResult(success, returndata, errorMessage);
      }

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

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

          // solhint-disable-next-line avoid-low-level-calls
          (bool success, bytes memory returndata) = target.delegatecall(data);
          return _verifyCallResult(success, returndata, errorMessage);
      }

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

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

  // File @openzeppelin/contracts/utils/[email protected]

  pragma solidity ^0.8.0;

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

      function _msgData() internal view virtual returns (bytes calldata) {
          this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
          return msg.data;
      }
  }

  // File @openzeppelin/contracts/utils/[email protected]

  pragma solidity ^0.8.0;

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

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

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

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

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

  // File @openzeppelin/contracts/utils/introspection/[email protected]

  pragma solidity ^0.8.0;

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

  // File @openzeppelin/contracts/token/ERC721/[email protected]

  pragma solidity ^0.8.0;

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

      // Token name
      string private _name;

      // Token symbol
      string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

      /**
      * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
      * in child contracts.
      */
      function _baseURI() internal view virtual returns (string memory) {
          return "";
      }

      function _baseExtension() internal view virtual returns (string memory) {
          return "";
      }

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

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

          _approve(to, tokenId);
      }

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

          return _tokenApprovals[tokenId];
      }

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

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

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

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

          _transfer(from, to, tokenId);
      }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

          _beforeTokenTransfer(from, to, tokenId);

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

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

          emit Transfer(from, to, tokenId);
      }

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

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

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

  // File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

  pragma solidity ^0.8.0;

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

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

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

  // File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

  pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  // File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

  pragma solidity ^0.8.0;

  /**
  * @dev ERC721 token with storage based token URI management.
  */
  abstract contract ERC721URIStorage is ERC721 {
      using Strings for uint256;

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

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

          string memory base = _baseURI();
          string memory ext = _baseExtension();

          
          
        return string(abi.encodePacked(base, (tokenId).toString(), ext));

      }

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

      /**
      * @dev 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 override {
          super._burn(tokenId);

          if (bytes(_tokenURIs[tokenId]).length != 0) {
              delete _tokenURIs[tokenId];
          }
      }
  }

  // File @openzeppelin/contracts/security/[email protected]

  pragma solidity ^0.8.0;

  /**
  * @dev Contract module which allows children to implement an emergency stop
  * mechanism that can be triggered by an authorized account.
  *
  * This module is used through inheritance. It will make available the
  * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
  * the functions of your contract. Note that they will not be pausable by
  * simply including this module, only once the modifiers are put in place.
  */
  abstract contract Pausable is Context {
      /**
      * @dev Emitted when the pause is triggered by `account`.
      */
      event Paused(address account);

      /**
      * @dev Emitted when the pause is lifted by `account`.
      */
      event Unpaused(address account);

      bool private _paused;

      /**
      * @dev Initializes the contract in unpaused state.
      */
      constructor() {
          _paused = false;
      }

      /**
      * @dev Returns true if the contract is paused, and false otherwise.
      */
      function paused() public view virtual returns (bool) {
          return _paused;
      }

      /**
      * @dev Modifier to make a function callable only when the contract is not paused.
      *
      * Requirements:
      *
      * - The contract must not be paused.
      */
      modifier whenNotPaused() {
          require(!paused(), "Pausable: paused");
          _;
      }

      /**
      * @dev Modifier to make a function callable only when the contract is paused.
      *
      * Requirements:
      *
      * - The contract must be paused.
      */
      modifier whenPaused() {
          require(paused(), "Pausable: not paused");
          _;
      }

      /**
      * @dev Triggers stopped state.
      *
      * Requirements:
      *
      * - The contract must not be paused.
      */
      function _pause() internal virtual whenNotPaused {
          _paused = true;
          emit Paused(_msgSender());
      }

      /**
      * @dev Returns to normal state.
      *
      * Requirements:
      *
      * - The contract must be paused.
      */
      function _unpause() internal virtual whenPaused {
          _paused = false;
          emit Unpaused(_msgSender());
      }
  }

  // File @openzeppelin/contracts/access/[email protected]

  pragma solidity ^0.8.0;

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

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

      /**
      * @dev Initializes the contract setting the deployer as the initial owner.
      */
      constructor() {
          address msgSender = _msgSender();
          _owner = msgSender;
          emit OwnershipTransferred(address(0), msgSender);
      }

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

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

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

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

  // File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

  pragma solidity ^0.8.0;

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

  // File @openzeppelin/contracts/utils/[email protected]

  pragma solidity ^0.8.0;

  /**
  * @title Counters
  * @author Matt Condon (@shrugs)
  * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number
  * of elements in a mapping, issuing ERC721 ids, or counting request ids.
  *
  * Include with `using Counters for Counters.Counter;`
  */
  library Counters {
      struct Counter {
          // This variable should never be directly accessed by users of the library: interactions must be restricted to
          // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
          // this feature: see https://github.com/ethereum/solidity/issues/4637
          uint256 _value; // default: 0
      }

      function current(Counter storage counter) internal view returns (uint256) {
          return counter._value;
      }

      function increment(Counter storage counter) internal {
          unchecked {
              counter._value += 1;
          }
      }

      function decrement(Counter storage counter) internal {
          uint256 value = counter._value;
          require(value > 0, "Counter: decrement overflow");
          unchecked {
              counter._value = value - 1;
          }
      }
  }

  pragma solidity ^0.8.7;

  /**
  * @dev Interface for the NFT Royalty Standard
  */
  interface IERC2981 is IERC165 {
      /**
      * @dev Called with the sale price to determine how much royalty is owed and to whom.
      * @param tokenId - the NFT asset queried for royalty information
      * @param salePrice - the sale price of the NFT asset specified by `tokenId`
      * @return receiver - address of who should be sent the royalty payment
      * @return royaltyAmount - the royalty payment amount for `salePrice`
      */
      function royaltyInfo(uint256 tokenId, uint256 salePrice)
          external
          view
          returns (address receiver, uint256 royaltyAmount);
  }

  interface IERC20 {
      function totalSupply() external view returns (uint256);
      function balanceOf(address account) external view returns (uint256);
      function transfer(address recipient, uint256 amount) external returns (bool);
      function allowance(address owner, address spender) external view returns (uint256);
      function approve(address spender, uint256 amount) external returns (bool);
      function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
      event Transfer(address indexed from, address indexed to, uint256 value);
      event Approval(address indexed owner, address indexed spender, uint256 value);
  }


  library SafeMath {

      function add(uint256 a, uint256 b) internal pure returns (uint256) {
          uint256 c = a + b;
          require(c >= a, "SafeMath: addition overflow");

          return c;
      }

      function sub(uint256 a, uint256 b) internal pure returns (uint256) {
          return sub(a, b, "SafeMath: subtraction overflow");
      }

      function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
          require(b <= a, errorMessage);
          uint256 c = a - b;

          return c;
      }

      function mul(uint256 a, uint256 b) internal pure returns (uint256) {
          if (a == 0) {
              return 0;
          }

          uint256 c = a * b;
          require(c / a == b, "SafeMath: multiplication overflow");

          return c;
      }


      function div(uint256 a, uint256 b) internal pure returns (uint256) {
          return div(a, b, "SafeMath: division by zero");
      }

      function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
          require(b > 0, errorMessage);
          uint256 c = a / b;
          // assert(a == b * c + a % b); // There is no case in which this doesn't hold

          return c;
      }

      function mod(uint256 a, uint256 b) internal pure returns (uint256) {
          return mod(a, b, "SafeMath: modulo by zero");
      }

      function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
          require(b != 0, errorMessage);
          return a % b;
      }
  }

  // File: contracts/SPANKERSNFT.sol

  /**
  * By interacting with this contract, you acknowledge that you understand
  * and agree to all of the functions and its capabilities;
  * if you do not understand and agree, please do not interact with this contract.
  */

  /**
  * A celebration of the epic community spirit and fearless experimentation
  * happening on the Fantom network. Get ready to unleash your inner adventurer
  * and join the fun with SPANKERS NFTs!
  */

  pragma solidity ^0.8.0;

  /**
  * @title SPANKERSNFT
  * artist: by Koofraa in collaboration with Spank_FTM
  */

  contract SPANKERSNFT is
      ERC721, ERC721Enumerable, ERC721URIStorage, ERC721Burnable,
      IERC2981, Pausable, Ownable, ClampedRandomizer {

      using Counters for Counters.Counter   ;
      using SafeMath for uint256            ;
      using Address  for address            ;
    
  constructor()
      ERC721("SPANKERSNFT", "SPANKERSNFT") ClampedRandomizer(maxSupply) {     
      _pause();
  }
      
  // MINTING
      uint256 public maxDevMint     = 20        ;
      uint256 public maxPerTx       = 20        ;
      uint256 public maxSupply      = 420       ;
      uint256 public price          = 20 ether  ;

      struct DevMintData {
        uint256 minted;
      }

      mapping(address => DevMintData) private devMintData;

      function devMint(uint256 amount) public onlyOwner {
          uint256 supply = totalSupply();
          require(supply + amount - 1 < maxSupply, "Max supply limit");
          require(amount > 0 && amount <= maxPerTx,"Max per tx limit");
          require(devMintData[msg.sender].minted + amount <= maxDevMint,  "Max dev mint reached");

          for (uint256 i = 0; i < amount; i++) {
              _internalMint(msg.sender);
              devMintData[msg.sender].minted += 1;
          }
      }
      
      function _internalMint(address to) internal {
          uint256 tokenId = _genClampedNonce() + 1;
          _safeMint(to, tokenId);
      }

      function mint(uint256 amount) public payable whenNotPaused {
          uint256 supply = totalSupply();
          require(supply + amount - 1 < maxSupply, "Max supply limit");
          require(amount > 0 && amount <= maxPerTx,"Max per tx limit");
          require(msg.value >= price * amount, "Invalid price");
          
          for (uint256 i = 0; i < amount; i++) {
              _internalMint(msg.sender);
          }
      }

  // ROYALTIES AND PAYOUT
      uint256 public royalty                = 500                                           ;
      address public royaltyAddress         = 0x494b4eb62F36cd05C43Fcb96197f1E1103C252b6    ;
      address public paymentSplitterAddress = 0x9ae2423Af7d80C974CeaF90AFb25D0e1b4e8CE00    ;

      function royaltyInfo(uint256, uint256 _salePrice) external view override
          returns (address receiver, uint256 royaltyAmount) {
          return (royaltyAddress, (_salePrice * royalty) / 10000);
      }

      function setRoyalty(uint16 _royalty) external onlyOwner {
          require(_royalty >=   0, "Royalty must be greater than or equal to 0%"   );
          require(_royalty <= 750, "Royalty must be greater than or equal to 7,5%" );
          royalty = _royalty;
      }
      
      function setRoyaltyAddress(address _royaltyAddress) external onlyOwner {
          royaltyAddress = _royaltyAddress;
      }

      function supportsInterface(bytes4 interfaceId) public view
          override(ERC721, ERC721Enumerable, IERC165) returns (bool) {
          return
              interfaceId == type(IERC2981).interfaceId ||
              super.supportsInterface(interfaceId);
      }

    function setPaymentSplitterAddress(address _paymentSplitterAddress) external onlyOwner {
        paymentSplitterAddress = _paymentSplitterAddress;
    }

      function withdraw() public {
        (bool hs, ) = payable(paymentSplitterAddress).call{value: address(this).balance * 100 / 100}("");
        require(hs);
          (bool os, ) = payable(owner()).call{value: address(this).balance}("");
          require(os);
      }

  // TOKEN INFORMATION AND MANAGEMENT
      function _beforeTokenTransfer(
          address from,
          address to,
          uint256 tokenId
      )   
          internal override(ERC721, ERC721Enumerable) whenNotPaused {
          super._beforeTokenTransfer(from, to, tokenId);
      }

      function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
          super._burn(tokenId);
      }
 
      function owned(address _owner) external view returns (uint256[] memory) {
          uint256 tokenCount = balanceOf(_owner);
          if (tokenCount == 0) {
              return new uint256[](0);
          } else {
              uint256[] memory result = new uint256[](tokenCount);
              uint256 index;
              for (index = 0; index < tokenCount; index++) {
                  result[index] = tokenOfOwnerByIndex(_owner, index);
              }
              return result;
            }
      }

      function tokenExists(uint256 _id) external view returns (bool) {
          return (_exists(_id));
      }

      function withdrawNFT(address _tokenContract, uint256[] memory _id) external onlyOwner {
          IERC721 tokenContract = IERC721(_tokenContract);
          for (uint i = 0; i < _id.length; i++) {
              tokenContract.safeTransferFrom(address(this), owner(), _id[i]);
          }
      }
      
      function withdrawTokens(address _tokenContract) external onlyOwner {
          IERC20 tokenContract = IERC20(_tokenContract);
          uint256 _amount = tokenContract.balanceOf(address(this));
          tokenContract.transfer(owner(), _amount);
      }

  // URI HANDLING
      string public baseURI         = "https://nftstorage.link/ipfs/bafybeihddtaao2vb7zg2ga4mgoowo4leejdk5qmubcwjqki32iao6w3h54/" ;
      string public baseExtension   = ".json"                   ;

      function _baseExtension() internal view override returns (string memory) {
          return baseExtension;
      }
    
      function _baseURI() internal view override returns (string memory) {
          return baseURI;
      }

      function postSetTokenURI(uint256 tokenId, string memory uri) external onlyOwner {
          _setTokenURI(tokenId, uri);
      }

      function setBaseURI(string memory newBaseURI) external onlyOwner {
          baseURI = newBaseURI;
      }

      function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage)
          returns (string memory) {
          return super.tokenURI(tokenId);
      }

  // VARIABLE MANAGEMENT
      function setMaxPerTx(uint256 newMaxPerTx) external onlyOwner {
          maxPerTx = newMaxPerTx;
      }

      function setPrice(uint256 newPrice) external onlyOwner {
          price = newPrice;
      }
      
      function updatePausedStatus() external onlyOwner {
          paused() ?  _unpause() : _pause();
      }
  }

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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"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":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxDevMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"owned","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymentSplitterAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"postSetTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxPerTx","type":"uint256"}],"name":"setMaxPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_paymentSplitterAddress","type":"address"}],"name":"setPaymentSplitterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_royalty","type":"uint16"}],"name":"setRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royaltyAddress","type":"address"}],"name":"setRoyaltyAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"tokenExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updatePausedStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256[]","name":"_id","type":"uint256[]"}],"name":"withdrawNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040526000600c556014600e556014600f556101a46010556801158e460913d000006011556101f460135573494b4eb62f36cd05c43fcb96197f1e1103c252b6601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550739ae2423af7d80c974ceaf90afb25d0e1b4e8ce00601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180608001604052806059815260200162006614605991396016908162000100919062000627565b506040518060400160405280600581526020017f2e6a736f6e0000000000000000000000000000000000000000000000000000008152506017908162000147919062000627565b503480156200015557600080fd5b506010546040518060400160405280600b81526020017f5350414e4b4552534e46540000000000000000000000000000000000000000008152506040518060400160405280600b81526020017f5350414e4b4552534e46540000000000000000000000000000000000000000008152508160009081620001d6919062000627565b508060019081620001e8919062000627565b5050506000600b60006101000a81548160ff021916908315150217905550600062000218620002d660201b60201c565b905080600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350806080818152505050620002d0620002de60201b60201c565b620007f3565b600033905090565b620002ee6200039660201b60201c565b1562000331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000328906200076f565b60405180910390fd5b6001600b60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586200037d620002d660201b60201c565b6040516200038c9190620007d6565b60405180910390a1565b6000600b60009054906101000a900460ff16905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200042f57607f821691505b602082108103620004455762000444620003e7565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004af7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000470565b620004bb868362000470565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200050862000502620004fc84620004d3565b620004dd565b620004d3565b9050919050565b6000819050919050565b6200052483620004e7565b6200053c62000533826200050f565b8484546200047d565b825550505050565b600090565b6200055362000544565b6200056081848462000519565b505050565b5b8181101562000588576200057c60008262000549565b60018101905062000566565b5050565b601f821115620005d757620005a1816200044b565b620005ac8462000460565b81016020851015620005bc578190505b620005d4620005cb8562000460565b83018262000565565b50505b505050565b600082821c905092915050565b6000620005fc60001984600802620005dc565b1980831691505092915050565b6000620006178383620005e9565b9150826002028217905092915050565b6200063282620003ad565b67ffffffffffffffff8111156200064e576200064d620003b8565b5b6200065a825462000416565b620006678282856200058c565b600060209050601f8311600181146200069f57600084156200068a578287015190505b62000696858262000609565b86555062000706565b601f198416620006af866200044b565b60005b82811015620006d957848901518255600182019150602085019450602081019050620006b2565b86831015620006f95784890151620006f5601f891682620005e9565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000620007576010836200070e565b915062000764826200071f565b602082019050919050565b600060208201905081810360008301526200078a8162000748565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620007be8262000791565b9050919050565b620007d081620007b1565b82525050565b6000602082019050620007ed6000830184620007c5565b92915050565b608051615e056200080f6000396000612fe50152615e056000f3fe60806040526004361061027c5760003560e01c80636c0360eb1161014f578063a0712d68116100c1578063c6f6f2161161007a578063c6f6f21614610973578063c87b56dd1461099c578063d5abeb01146109d9578063e985e9c514610a04578063f2fde38b14610a41578063f968adbe14610a6a5761027c565b8063a0712d6814610872578063a22cb4651461088e578063ad2f852a146108b7578063b1ab9317146108e2578063b88d4fde1461091f578063c6682862146109485761027c565b80638da5cb5b116101135780638da5cb5b1461077457806391b7f5ed1461079f57806395d89b41146107c85780639a7110fe146107f35780639bdedea51461081e578063a035b1fe146108475761027c565b80636c0360eb146106a15780636c4f0698146106cc57806370a08231146106f5578063715018a6146107325780637f1bc13c146107495761027c565b806336e79a5a116101f35780634f6ccce7116101ac5780634f6ccce71461059357806355f804b3146105d057806357997081146105f95780635c975abb146106225780636352211e1461064d57806367dded4d1461068a5761027c565b806336e79a5a146104af578063375a069a146104d85780633ccfd60b1461050157806342842e0e1461051857806342966c681461054157806349df728c1461056a5761027c565b8063095ea7b311610245578063095ea7b31461038c57806318160ddd146103b557806323b872dd146103e057806329ee566c146104095780632a55205a146104345780632f745c59146104725761027c565b8062923f9e1461028157806301ffc9a7146102be57806306d254da146102fb57806306fdde0314610324578063081812fc1461034f575b600080fd5b34801561028d57600080fd5b506102a860048036038101906102a39190613e3d565b610a95565b6040516102b59190613e85565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e09190613ef8565b610aa7565b6040516102f29190613e85565b60405180910390f35b34801561030757600080fd5b50610322600480360381019061031d9190613f83565b610b21565b005b34801561033057600080fd5b50610339610be1565b6040516103469190614040565b60405180910390f35b34801561035b57600080fd5b5061037660048036038101906103719190613e3d565b610c73565b6040516103839190614071565b60405180910390f35b34801561039857600080fd5b506103b360048036038101906103ae919061408c565b610cf8565b005b3480156103c157600080fd5b506103ca610e0f565b6040516103d791906140db565b60405180910390f35b3480156103ec57600080fd5b50610407600480360381019061040291906140f6565b610e1c565b005b34801561041557600080fd5b5061041e610e7c565b60405161042b91906140db565b60405180910390f35b34801561044057600080fd5b5061045b60048036038101906104569190614149565b610e82565b604051610469929190614189565b60405180910390f35b34801561047e57600080fd5b506104996004803603810190610494919061408c565b610ece565b6040516104a691906140db565b60405180910390f35b3480156104bb57600080fd5b506104d660048036038101906104d191906141ec565b610f73565b005b3480156104e457600080fd5b506104ff60048036038101906104fa9190613e3d565b61108e565b005b34801561050d57600080fd5b506105166112da565b005b34801561052457600080fd5b5061053f600480360381019061053a91906140f6565b61140a565b005b34801561054d57600080fd5b5061056860048036038101906105639190613e3d565b61142a565b005b34801561057657600080fd5b50610591600480360381019061058c9190613f83565b611486565b005b34801561059f57600080fd5b506105ba60048036038101906105b59190613e3d565b611610565b6040516105c791906140db565b60405180910390f35b3480156105dc57600080fd5b506105f760048036038101906105f2919061434e565b611681565b005b34801561060557600080fd5b50610620600480360381019061061b9190614397565b611710565b005b34801561062e57600080fd5b5061063761179a565b6040516106449190613e85565b60405180910390f35b34801561065957600080fd5b50610674600480360381019061066f9190613e3d565b6117b1565b6040516106819190614071565b60405180910390f35b34801561069657600080fd5b5061069f611862565b005b3480156106ad57600080fd5b506106b6611902565b6040516106c39190614040565b60405180910390f35b3480156106d857600080fd5b506106f360048036038101906106ee9190613f83565b611990565b005b34801561070157600080fd5b5061071c60048036038101906107179190613f83565b611a50565b60405161072991906140db565b60405180910390f35b34801561073e57600080fd5b50610747611b07565b005b34801561075557600080fd5b5061075e611c44565b60405161076b91906140db565b60405180910390f35b34801561078057600080fd5b50610789611c4a565b6040516107969190614071565b60405180910390f35b3480156107ab57600080fd5b506107c660048036038101906107c19190613e3d565b611c74565b005b3480156107d457600080fd5b506107dd611cfa565b6040516107ea9190614040565b60405180910390f35b3480156107ff57600080fd5b50610808611d8c565b6040516108159190614071565b60405180910390f35b34801561082a57600080fd5b50610845600480360381019061084091906144bb565b611db2565b005b34801561085357600080fd5b5061085c611ee8565b60405161086991906140db565b60405180910390f35b61088c60048036038101906108879190613e3d565b611eee565b005b34801561089a57600080fd5b506108b560048036038101906108b09190614543565b61206a565b005b3480156108c357600080fd5b506108cc6121ea565b6040516108d99190614071565b60405180910390f35b3480156108ee57600080fd5b5061090960048036038101906109049190613f83565b612210565b6040516109169190614641565b60405180910390f35b34801561092b57600080fd5b5061094660048036038101906109419190614704565b612319565b005b34801561095457600080fd5b5061095d61237b565b60405161096a9190614040565b60405180910390f35b34801561097f57600080fd5b5061099a60048036038101906109959190613e3d565b612409565b005b3480156109a857600080fd5b506109c360048036038101906109be9190613e3d565b61248f565b6040516109d09190614040565b60405180910390f35b3480156109e557600080fd5b506109ee6124a1565b6040516109fb91906140db565b60405180910390f35b348015610a1057600080fd5b50610a2b6004803603810190610a269190614787565b6124a7565b604051610a389190613e85565b60405180910390f35b348015610a4d57600080fd5b50610a686004803603810190610a639190613f83565b61253b565b005b348015610a7657600080fd5b50610a7f6126e6565b604051610a8c91906140db565b60405180910390f35b6000610aa0826126ec565b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b1a5750610b1982612758565b5b9050919050565b610b296127d2565b73ffffffffffffffffffffffffffffffffffffffff16610b47611c4a565b73ffffffffffffffffffffffffffffffffffffffff1614610b9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9490614813565b60405180910390fd5b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060008054610bf090614862565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1c90614862565b8015610c695780601f10610c3e57610100808354040283529160200191610c69565b820191906000526020600020905b815481529060010190602001808311610c4c57829003601f168201915b5050505050905090565b6000610c7e826126ec565b610cbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb490614905565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d03826117b1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610d73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6a90614997565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d926127d2565b73ffffffffffffffffffffffffffffffffffffffff161480610dc15750610dc081610dbb6127d2565b6124a7565b5b610e00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df790614a29565b60405180910390fd5b610e0a83836127da565b505050565b6000600880549050905090565b610e2d610e276127d2565b82612893565b610e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6390614abb565b60405180910390fd5b610e77838383612971565b505050565b60135481565b600080601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661271060135485610eb99190614b0a565b610ec39190614b7b565b915091509250929050565b6000610ed983611a50565b8210610f1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1190614c1e565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610f7b6127d2565b73ffffffffffffffffffffffffffffffffffffffff16610f99611c4a565b73ffffffffffffffffffffffffffffffffffffffff1614610fef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe690614813565b60405180910390fd5b60008161ffff161015611037576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102e90614cb0565b60405180910390fd5b6102ee8161ffff161115611080576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107790614d42565b60405180910390fd5b8061ffff1660138190555050565b6110966127d2565b73ffffffffffffffffffffffffffffffffffffffff166110b4611c4a565b73ffffffffffffffffffffffffffffffffffffffff161461110a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110190614813565b60405180910390fd5b6000611114610e0f565b9050601054600183836111279190614d62565b6111319190614d96565b10611171576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116890614e16565b60405180910390fd5b6000821180156111835750600f548211155b6111c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b990614e82565b60405180910390fd5b600e5482601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546112139190614d62565b1115611254576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124b90614eee565b60405180910390fd5b60005b828110156112d55761126833612bcc565b6001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282546112bb9190614d62565b9250508190555080806112cd90614f0e565b915050611257565b505050565b6000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16606480476113239190614b0a565b61132d9190614b7b565b60405161133990614f87565b60006040518083038185875af1925050503d8060008114611376576040519150601f19603f3d011682016040523d82523d6000602084013e61137b565b606091505b505090508061138957600080fd5b6000611393611c4a565b73ffffffffffffffffffffffffffffffffffffffff16476040516113b690614f87565b60006040518083038185875af1925050503d80600081146113f3576040519150601f19603f3d011682016040523d82523d6000602084013e6113f8565b606091505b505090508061140657600080fd5b5050565b61142583838360405180602001604052806000815250612319565b505050565b61143b6114356127d2565b82612893565b61147a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114719061500e565b60405180910390fd5b61148381612bf2565b50565b61148e6127d2565b73ffffffffffffffffffffffffffffffffffffffff166114ac611c4a565b73ffffffffffffffffffffffffffffffffffffffff1614611502576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f990614813565b60405180910390fd5b600081905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016115429190614071565b602060405180830381865afa15801561155f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115839190615043565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6115a9611c4a565b836040518363ffffffff1660e01b81526004016115c7929190614189565b6020604051808303816000875af11580156115e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160a9190615085565b50505050565b600061161a610e0f565b821061165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165290615124565b60405180910390fd5b6008828154811061166f5761166e615144565b5b90600052602060002001549050919050565b6116896127d2565b73ffffffffffffffffffffffffffffffffffffffff166116a7611c4a565b73ffffffffffffffffffffffffffffffffffffffff16146116fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f490614813565b60405180910390fd5b806016908161170c919061531f565b5050565b6117186127d2565b73ffffffffffffffffffffffffffffffffffffffff16611736611c4a565b73ffffffffffffffffffffffffffffffffffffffff161461178c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178390614813565b60405180910390fd5b6117968282612bfe565b5050565b6000600b60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611859576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185090615463565b60405180910390fd5b80915050919050565b61186a6127d2565b73ffffffffffffffffffffffffffffffffffffffff16611888611c4a565b73ffffffffffffffffffffffffffffffffffffffff16146118de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d590614813565b60405180910390fd5b6118e661179a565b6118f7576118f2612c6b565b611900565b6118ff612d0e565b5b565b6016805461190f90614862565b80601f016020809104026020016040519081016040528092919081815260200182805461193b90614862565b80156119885780601f1061195d57610100808354040283529160200191611988565b820191906000526020600020905b81548152906001019060200180831161196b57829003601f168201915b505050505081565b6119986127d2565b73ffffffffffffffffffffffffffffffffffffffff166119b6611c4a565b73ffffffffffffffffffffffffffffffffffffffff1614611a0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0390614813565b60405180910390fd5b80601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab7906154f5565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611b0f6127d2565b73ffffffffffffffffffffffffffffffffffffffff16611b2d611c4a565b73ffffffffffffffffffffffffffffffffffffffff1614611b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7a90614813565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600e5481565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611c7c6127d2565b73ffffffffffffffffffffffffffffffffffffffff16611c9a611c4a565b73ffffffffffffffffffffffffffffffffffffffff1614611cf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce790614813565b60405180910390fd5b8060118190555050565b606060018054611d0990614862565b80601f0160208091040260200160405190810160405280929190818152602001828054611d3590614862565b8015611d825780601f10611d5757610100808354040283529160200191611d82565b820191906000526020600020905b815481529060010190602001808311611d6557829003601f168201915b5050505050905090565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611dba6127d2565b73ffffffffffffffffffffffffffffffffffffffff16611dd8611c4a565b73ffffffffffffffffffffffffffffffffffffffff1614611e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2590614813565b60405180910390fd5b600082905060005b8251811015611ee2578173ffffffffffffffffffffffffffffffffffffffff166342842e0e30611e64611c4a565b868581518110611e7757611e76615144565b5b60200260200101516040518463ffffffff1660e01b8152600401611e9d93929190615515565b600060405180830381600087803b158015611eb757600080fd5b505af1158015611ecb573d6000803e3d6000fd5b505050508080611eda90614f0e565b915050611e36565b50505050565b60115481565b611ef661179a565b15611f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2d90615598565b60405180910390fd5b6000611f40610e0f565b905060105460018383611f539190614d62565b611f5d9190614d96565b10611f9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9490614e16565b60405180910390fd5b600082118015611faf5750600f548211155b611fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe590614e82565b60405180910390fd5b81601154611ffc9190614b0a565b34101561203e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203590615604565b60405180910390fd5b60005b828110156120655761205233612bcc565b808061205d90614f0e565b915050612041565b505050565b6120726127d2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036120df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d690615670565b60405180910390fd5b80600560006120ec6127d2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166121996127d2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121de9190613e85565b60405180910390a35050565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600061221d83611a50565b90506000810361227957600067ffffffffffffffff81111561224257612241614223565b5b6040519080825280602002602001820160405280156122705781602001602082028036833780820191505090505b50915050612314565b60008167ffffffffffffffff81111561229557612294614223565b5b6040519080825280602002602001820160405280156122c35781602001602082028036833780820191505090505b50905060005b8281101561230d576122db8582610ece565b8282815181106122ee576122ed615144565b5b602002602001018181525050808061230590614f0e565b9150506122c9565b8193505050505b919050565b61232a6123246127d2565b83612893565b612369576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236090614abb565b60405180910390fd5b61237584848484612db0565b50505050565b6017805461238890614862565b80601f01602080910402602001604051908101604052809291908181526020018280546123b490614862565b80156124015780601f106123d657610100808354040283529160200191612401565b820191906000526020600020905b8154815290600101906020018083116123e457829003601f168201915b505050505081565b6124116127d2565b73ffffffffffffffffffffffffffffffffffffffff1661242f611c4a565b73ffffffffffffffffffffffffffffffffffffffff1614612485576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247c90614813565b60405180910390fd5b80600f8190555050565b606061249a82612e0c565b9050919050565b60105481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6125436127d2565b73ffffffffffffffffffffffffffffffffffffffff16612561611c4a565b73ffffffffffffffffffffffffffffffffffffffff16146125b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ae90614813565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612626576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261d90615702565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f5481565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806127cb57506127ca82612ea3565b5b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661284d836117b1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061289e826126ec565b6128dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d490615794565b60405180910390fd5b60006128e8836117b1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061295757508373ffffffffffffffffffffffffffffffffffffffff1661293f84610c73565b73ffffffffffffffffffffffffffffffffffffffff16145b80612968575061296781856124a7565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612991826117b1565b73ffffffffffffffffffffffffffffffffffffffff16146129e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129de90615826565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4d906158b8565b60405180910390fd5b612a61838383612f85565b612a6c6000826127da565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612abc9190614d96565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b139190614d62565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006001612bd8612fdd565b612be29190614d62565b9050612bee8282613114565b5050565b612bfb81613132565b50565b612c07826126ec565b612c46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3d9061594a565b60405180910390fd5b80600a60008481526020019081526020016000209081612c66919061531f565b505050565b612c7361179a565b15612cb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612caa90615598565b60405180910390fd5b6001600b60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612cf76127d2565b604051612d049190614071565b60405180910390a1565b612d1661179a565b612d55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4c906159b6565b60405180910390fd5b6000600b60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612d996127d2565b604051612da69190614071565b60405180910390a1565b612dbb848484612971565b612dc784848484613185565b612e06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dfd90615a48565b60405180910390fd5b50505050565b6060612e17826126ec565b612e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4d90615ada565b60405180910390fd5b6000612e6061330c565b90506000612e6c61339e565b905081612e7885613430565b82604051602001612e8b93929190615b36565b60405160208183030381529060405292505050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612f6e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612f7e5750612f7d82613590565b5b9050919050565b612f8d61179a565b15612fcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fc490615598565b60405180910390fd5b612fd88383836135fa565b505050565b600080600c547f000000000000000000000000000000000000000000000000000000000000000061300e9190614d96565b905060008060008361301e61370c565b6130289190615b67565b90506000600d600060018761303d9190614d96565b815260200190815260200160002054036130655760018461305e9190614d96565b9250613088565b600d60006001866130769190614d96565b81526020019081526020016000205492505b6000600d600083815260200190815260200160002054036130c35780915082600d6000838152602001908152602001600020819055506130f2565b600d600082815260200190815260200160002054915082600d6000838152602001908152602001600020819055505b600c600081548092919061310590614f0e565b91905055508194505050505090565b61312e82826040518060200160405280600081525061373f565b5050565b61313b8161379a565b6000600a6000838152602001908152602001600020805461315b90614862565b90501461318257600a600082815260200190815260200160002060006131819190613d96565b5b50565b60006131a68473ffffffffffffffffffffffffffffffffffffffff166138ab565b156132ff578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026131cf6127d2565b8786866040518563ffffffff1660e01b81526004016131f19493929190615bed565b6020604051808303816000875af192505050801561322d57506040513d601f19601f8201168201806040525081019061322a9190615c4e565b60015b6132af573d806000811461325d576040519150601f19603f3d011682016040523d82523d6000602084013e613262565b606091505b5060008151036132a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329e90615a48565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613304565b600190505b949350505050565b60606016805461331b90614862565b80601f016020809104026020016040519081016040528092919081815260200182805461334790614862565b80156133945780601f1061336957610100808354040283529160200191613394565b820191906000526020600020905b81548152906001019060200180831161337757829003601f168201915b5050505050905090565b6060601780546133ad90614862565b80601f01602080910402602001604051908101604052809291908181526020018280546133d990614862565b80156134265780601f106133fb57610100808354040283529160200191613426565b820191906000526020600020905b81548152906001019060200180831161340957829003601f168201915b5050505050905090565b606060008203613477576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061358b565b600082905060005b600082146134a957808061349290614f0e565b915050600a826134a29190614b7b565b915061347f565b60008167ffffffffffffffff8111156134c5576134c4614223565b5b6040519080825280601f01601f1916602001820160405280156134f75781602001600182028036833780820191505090505b5090505b60008514613584576001826135109190614d96565b9150600a8561351f9190615b67565b603061352b9190614d62565b60f81b81838151811061354157613540615144565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561357d9190614b7b565b94506134fb565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6136058383836138be565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361364757613642816138c3565b613686565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461368557613684838261390c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036136c8576136c381613a79565b613707565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613706576137058282613b4a565b5b5b505050565b60004442604051602001613721929190615c9c565b6040516020818303038152906040528051906020012060001c905090565b6137498383613bc9565b6137566000848484613185565b613795576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161378c90615a48565b60405180910390fd5b505050565b60006137a5826117b1565b90506137b381600084612f85565b6137be6000836127da565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461380e9190614d96565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161391984611a50565b6139239190614d96565b9050600060076000848152602001908152602001600020549050818114613a08576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613a8d9190614d96565b9050600060096000848152602001908152602001600020549050600060088381548110613abd57613abc615144565b5b906000526020600020015490508060088381548110613adf57613ade615144565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613b2e57613b2d615cc8565b5b6001900381819060005260206000200160009055905550505050565b6000613b5583611a50565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613c38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c2f90615d43565b60405180910390fd5b613c41816126ec565b15613c81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c7890615daf565b60405180910390fd5b613c8d60008383612f85565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613cdd9190614d62565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b508054613da290614862565b6000825580601f10613db45750613dd3565b601f016020900490600052602060002090810190613dd29190613dd6565b5b50565b5b80821115613def576000816000905550600101613dd7565b5090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b613e1a81613e07565b8114613e2557600080fd5b50565b600081359050613e3781613e11565b92915050565b600060208284031215613e5357613e52613dfd565b5b6000613e6184828501613e28565b91505092915050565b60008115159050919050565b613e7f81613e6a565b82525050565b6000602082019050613e9a6000830184613e76565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613ed581613ea0565b8114613ee057600080fd5b50565b600081359050613ef281613ecc565b92915050565b600060208284031215613f0e57613f0d613dfd565b5b6000613f1c84828501613ee3565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613f5082613f25565b9050919050565b613f6081613f45565b8114613f6b57600080fd5b50565b600081359050613f7d81613f57565b92915050565b600060208284031215613f9957613f98613dfd565b5b6000613fa784828501613f6e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613fea578082015181840152602081019050613fcf565b60008484015250505050565b6000601f19601f8301169050919050565b600061401282613fb0565b61401c8185613fbb565b935061402c818560208601613fcc565b61403581613ff6565b840191505092915050565b6000602082019050818103600083015261405a8184614007565b905092915050565b61406b81613f45565b82525050565b60006020820190506140866000830184614062565b92915050565b600080604083850312156140a3576140a2613dfd565b5b60006140b185828601613f6e565b92505060206140c285828601613e28565b9150509250929050565b6140d581613e07565b82525050565b60006020820190506140f060008301846140cc565b92915050565b60008060006060848603121561410f5761410e613dfd565b5b600061411d86828701613f6e565b935050602061412e86828701613f6e565b925050604061413f86828701613e28565b9150509250925092565b600080604083850312156141605761415f613dfd565b5b600061416e85828601613e28565b925050602061417f85828601613e28565b9150509250929050565b600060408201905061419e6000830185614062565b6141ab60208301846140cc565b9392505050565b600061ffff82169050919050565b6141c9816141b2565b81146141d457600080fd5b50565b6000813590506141e6816141c0565b92915050565b60006020828403121561420257614201613dfd565b5b6000614210848285016141d7565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61425b82613ff6565b810181811067ffffffffffffffff8211171561427a57614279614223565b5b80604052505050565b600061428d613df3565b90506142998282614252565b919050565b600067ffffffffffffffff8211156142b9576142b8614223565b5b6142c282613ff6565b9050602081019050919050565b82818337600083830152505050565b60006142f16142ec8461429e565b614283565b90508281526020810184848401111561430d5761430c61421e565b5b6143188482856142cf565b509392505050565b600082601f83011261433557614334614219565b5b81356143458482602086016142de565b91505092915050565b60006020828403121561436457614363613dfd565b5b600082013567ffffffffffffffff81111561438257614381613e02565b5b61438e84828501614320565b91505092915050565b600080604083850312156143ae576143ad613dfd565b5b60006143bc85828601613e28565b925050602083013567ffffffffffffffff8111156143dd576143dc613e02565b5b6143e985828601614320565b9150509250929050565b600067ffffffffffffffff82111561440e5761440d614223565b5b602082029050602081019050919050565b600080fd5b6000614437614432846143f3565b614283565b9050808382526020820190506020840283018581111561445a5761445961441f565b5b835b81811015614483578061446f8882613e28565b84526020840193505060208101905061445c565b5050509392505050565b600082601f8301126144a2576144a1614219565b5b81356144b2848260208601614424565b91505092915050565b600080604083850312156144d2576144d1613dfd565b5b60006144e085828601613f6e565b925050602083013567ffffffffffffffff81111561450157614500613e02565b5b61450d8582860161448d565b9150509250929050565b61452081613e6a565b811461452b57600080fd5b50565b60008135905061453d81614517565b92915050565b6000806040838503121561455a57614559613dfd565b5b600061456885828601613f6e565b92505060206145798582860161452e565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6145b881613e07565b82525050565b60006145ca83836145af565b60208301905092915050565b6000602082019050919050565b60006145ee82614583565b6145f8818561458e565b93506146038361459f565b8060005b8381101561463457815161461b88826145be565b9750614626836145d6565b925050600181019050614607565b5085935050505092915050565b6000602082019050818103600083015261465b81846145e3565b905092915050565b600067ffffffffffffffff82111561467e5761467d614223565b5b61468782613ff6565b9050602081019050919050565b60006146a76146a284614663565b614283565b9050828152602081018484840111156146c3576146c261421e565b5b6146ce8482856142cf565b509392505050565b600082601f8301126146eb576146ea614219565b5b81356146fb848260208601614694565b91505092915050565b6000806000806080858703121561471e5761471d613dfd565b5b600061472c87828801613f6e565b945050602061473d87828801613f6e565b935050604061474e87828801613e28565b925050606085013567ffffffffffffffff81111561476f5761476e613e02565b5b61477b878288016146d6565b91505092959194509250565b6000806040838503121561479e5761479d613dfd565b5b60006147ac85828601613f6e565b92505060206147bd85828601613f6e565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006147fd602083613fbb565b9150614808826147c7565b602082019050919050565b6000602082019050818103600083015261482c816147f0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061487a57607f821691505b60208210810361488d5761488c614833565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006148ef602c83613fbb565b91506148fa82614893565b604082019050919050565b6000602082019050818103600083015261491e816148e2565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614981602183613fbb565b915061498c82614925565b604082019050919050565b600060208201905081810360008301526149b081614974565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000614a13603883613fbb565b9150614a1e826149b7565b604082019050919050565b60006020820190508181036000830152614a4281614a06565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000614aa5603183613fbb565b9150614ab082614a49565b604082019050919050565b60006020820190508181036000830152614ad481614a98565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614b1582613e07565b9150614b2083613e07565b9250828202614b2e81613e07565b91508282048414831517614b4557614b44614adb565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614b8682613e07565b9150614b9183613e07565b925082614ba157614ba0614b4c565b5b828204905092915050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614c08602b83613fbb565b9150614c1382614bac565b604082019050919050565b60006020820190508181036000830152614c3781614bfb565b9050919050565b7f526f79616c7479206d7573742062652067726561746572207468616e206f722060008201527f657175616c20746f203025000000000000000000000000000000000000000000602082015250565b6000614c9a602b83613fbb565b9150614ca582614c3e565b604082019050919050565b60006020820190508181036000830152614cc981614c8d565b9050919050565b7f526f79616c7479206d7573742062652067726561746572207468616e206f722060008201527f657175616c20746f20372c352500000000000000000000000000000000000000602082015250565b6000614d2c602d83613fbb565b9150614d3782614cd0565b604082019050919050565b60006020820190508181036000830152614d5b81614d1f565b9050919050565b6000614d6d82613e07565b9150614d7883613e07565b9250828201905080821115614d9057614d8f614adb565b5b92915050565b6000614da182613e07565b9150614dac83613e07565b9250828203905081811115614dc457614dc3614adb565b5b92915050565b7f4d617820737570706c79206c696d697400000000000000000000000000000000600082015250565b6000614e00601083613fbb565b9150614e0b82614dca565b602082019050919050565b60006020820190508181036000830152614e2f81614df3565b9050919050565b7f4d617820706572207478206c696d697400000000000000000000000000000000600082015250565b6000614e6c601083613fbb565b9150614e7782614e36565b602082019050919050565b60006020820190508181036000830152614e9b81614e5f565b9050919050565b7f4d617820646576206d696e742072656163686564000000000000000000000000600082015250565b6000614ed8601483613fbb565b9150614ee382614ea2565b602082019050919050565b60006020820190508181036000830152614f0781614ecb565b9050919050565b6000614f1982613e07565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614f4b57614f4a614adb565b5b600182019050919050565b600081905092915050565b50565b6000614f71600083614f56565b9150614f7c82614f61565b600082019050919050565b6000614f9282614f64565b9150819050919050565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b6000614ff8603083613fbb565b915061500382614f9c565b604082019050919050565b6000602082019050818103600083015261502781614feb565b9050919050565b60008151905061503d81613e11565b92915050565b60006020828403121561505957615058613dfd565b5b60006150678482850161502e565b91505092915050565b60008151905061507f81614517565b92915050565b60006020828403121561509b5761509a613dfd565b5b60006150a984828501615070565b91505092915050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b600061510e602c83613fbb565b9150615119826150b2565b604082019050919050565b6000602082019050818103600083015261513d81615101565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026151d57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82615198565b6151df8683615198565b95508019841693508086168417925050509392505050565b6000819050919050565b600061521c61521761521284613e07565b6151f7565b613e07565b9050919050565b6000819050919050565b61523683615201565b61524a61524282615223565b8484546151a5565b825550505050565b600090565b61525f615252565b61526a81848461522d565b505050565b5b8181101561528e57615283600082615257565b600181019050615270565b5050565b601f8211156152d3576152a481615173565b6152ad84615188565b810160208510156152bc578190505b6152d06152c885615188565b83018261526f565b50505b505050565b600082821c905092915050565b60006152f6600019846008026152d8565b1980831691505092915050565b600061530f83836152e5565b9150826002028217905092915050565b61532882613fb0565b67ffffffffffffffff81111561534157615340614223565b5b61534b8254614862565b615356828285615292565b600060209050601f8311600181146153895760008415615377578287015190505b6153818582615303565b8655506153e9565b601f19841661539786615173565b60005b828110156153bf5784890151825560018201915060208501945060208101905061539a565b868310156153dc57848901516153d8601f8916826152e5565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061544d602983613fbb565b9150615458826153f1565b604082019050919050565b6000602082019050818103600083015261547c81615440565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006154df602a83613fbb565b91506154ea82615483565b604082019050919050565b6000602082019050818103600083015261550e816154d2565b9050919050565b600060608201905061552a6000830186614062565b6155376020830185614062565b61554460408301846140cc565b949350505050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000615582601083613fbb565b915061558d8261554c565b602082019050919050565b600060208201905081810360008301526155b181615575565b9050919050565b7f496e76616c696420707269636500000000000000000000000000000000000000600082015250565b60006155ee600d83613fbb565b91506155f9826155b8565b602082019050919050565b6000602082019050818103600083015261561d816155e1565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061565a601983613fbb565b915061566582615624565b602082019050919050565b600060208201905081810360008301526156898161564d565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006156ec602683613fbb565b91506156f782615690565b604082019050919050565b6000602082019050818103600083015261571b816156df565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061577e602c83613fbb565b915061578982615722565b604082019050919050565b600060208201905081810360008301526157ad81615771565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000615810602983613fbb565b915061581b826157b4565b604082019050919050565b6000602082019050818103600083015261583f81615803565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006158a2602483613fbb565b91506158ad82615846565b604082019050919050565b600060208201905081810360008301526158d181615895565b9050919050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b6000615934602e83613fbb565b915061593f826158d8565b604082019050919050565b6000602082019050818103600083015261596381615927565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006159a0601483613fbb565b91506159ab8261596a565b602082019050919050565b600060208201905081810360008301526159cf81615993565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615a32603283613fbb565b9150615a3d826159d6565b604082019050919050565b60006020820190508181036000830152615a6181615a25565b9050919050565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b6000615ac4603183613fbb565b9150615acf82615a68565b604082019050919050565b60006020820190508181036000830152615af381615ab7565b9050919050565b600081905092915050565b6000615b1082613fb0565b615b1a8185615afa565b9350615b2a818560208601613fcc565b80840191505092915050565b6000615b428286615b05565b9150615b4e8285615b05565b9150615b5a8284615b05565b9150819050949350505050565b6000615b7282613e07565b9150615b7d83613e07565b925082615b8d57615b8c614b4c565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000615bbf82615b98565b615bc98185615ba3565b9350615bd9818560208601613fcc565b615be281613ff6565b840191505092915050565b6000608082019050615c026000830187614062565b615c0f6020830186614062565b615c1c60408301856140cc565b8181036060830152615c2e8184615bb4565b905095945050505050565b600081519050615c4881613ecc565b92915050565b600060208284031215615c6457615c63613dfd565b5b6000615c7284828501615c39565b91505092915050565b6000819050919050565b615c96615c9182613e07565b615c7b565b82525050565b6000615ca88285615c85565b602082019150615cb88284615c85565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615d2d602083613fbb565b9150615d3882615cf7565b602082019050919050565b60006020820190508181036000830152615d5c81615d20565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615d99601c83613fbb565b9150615da482615d63565b602082019050919050565b60006020820190508181036000830152615dc881615d8c565b905091905056fea2646970667358221220138b425c5cab36b90e90a46a08d3bb89674cb0e71b568381ede12f4c161a79b864736f6c6343000811003368747470733a2f2f6e667473746f726167652e6c696e6b2f697066732f626166796265696864647461616f327662377a67326761346d676f6f776f346c65656a646b35716d756263776a716b69333269616f3677336835342f

Deployed ByteCode Sourcemap

59416:6513:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63966:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62278:270;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62142:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25569:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27356:332;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26857:427;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41074:117;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28489:398;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61346:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61633:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;40625:367;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61855:271;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60192:508;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62720:272;;;;;;;;;;;;;:::i;:::-;;28964:197;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54067:296;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64398:257;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41274:344;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65269:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65130:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49869:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25144:352;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65819:105;;;;;;;;;;;;;:::i;:::-;;64684:123;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62556:154;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24757:319;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52971:154;;;;;;;;;;;;;:::i;:::-;;59860:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52294:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65709:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25748:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61536:82;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64083:299;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60013:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60868:441;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27766:343;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61441:82;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63436:520;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29238:387;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64817:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65593:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65387:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59962:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28186:230;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53287:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59911:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63966:107;64023:4;64050:12;64058:3;64050:7;:12::i;:::-;64042:21;;63966:107;;;:::o;62278:270::-;62401:4;62457:26;62442:41;;;:11;:41;;;;:96;;;;62502:36;62526:11;62502:23;:36::i;:::-;62442:96;62420:118;;62278:270;;;:::o;62142:126::-;52537:12;:10;:12::i;:::-;52526:23;;:7;:5;:7::i;:::-;:23;;;52518:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62243:15:::1;62226:14;;:32;;;;;;;;;;;;;;;;;;62142:126:::0;:::o;25569:104::-;25623:13;25658:5;25651:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25569:104;:::o;27356:332::-;27487:7;27540:16;27548:7;27540;:16::i;:::-;27516:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;27654:15;:24;27670:7;27654:24;;;;;;;;;;;;;;;;;;;;;27647:31;;27356:332;;;:::o;26857:427::-;26940:13;26956:23;26971:7;26956:14;:23::i;:::-;26940:39;;27006:5;27000:11;;:2;:11;;;26992:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27104:5;27088:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27113:37;27130:5;27137:12;:10;:12::i;:::-;27113:16;:37::i;:::-;27088:62;27064:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;27253:21;27262:2;27266:7;27253:8;:21::i;:::-;26927:357;26857:427;;:::o;41074:117::-;41135:7;41164:10;:17;;;;41157:24;;41074:117;:::o;28489:398::-;28712:41;28731:12;:10;:12::i;:::-;28745:7;28712:18;:41::i;:::-;28688:146;;;;;;;;;;;;:::i;:::-;;;;;;;;;28849:28;28859:4;28865:2;28869:7;28849:9;:28::i;:::-;28489:398;;;:::o;61346:43::-;;;;:::o;61633:212::-;61726:16;61744:21;61788:14;;;;;;;;;;;61829:5;61818:7;;61805:10;:20;;;;:::i;:::-;61804:30;;;;:::i;:::-;61780:55;;;;61633:212;;;;;:::o;40625:367::-;40777:7;40838:23;40855:5;40838:16;:23::i;:::-;40830:5;:31;40806:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;40956:12;:19;40969:5;40956:19;;;;;;;;;;;;;;;:26;40976:5;40956:26;;;;;;;;;;;;40949:33;;40625:367;;;;:::o;61855:271::-;52537:12;:10;:12::i;:::-;52526:23;;:7;:5;:7::i;:::-;:23;;;52518:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61946:1:::1;61932:8;:15;;;;61924:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;62031:3;62019:8;:15;;;;62011:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;62108:8;62098:18;;:7;:18;;;;61855:271:::0;:::o;60192:508::-;52537:12;:10;:12::i;:::-;52526:23;;:7;:5;:7::i;:::-;:23;;;52518:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60255:14:::1;60272:13;:11;:13::i;:::-;60255:30;;60328:9;;60324:1;60315:6;60306;:15;;;;:::i;:::-;:19;;;;:::i;:::-;:31;60298:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;60388:1;60379:6;:10;:32;;;;;60403:8;;60393:6;:18;;60379:32;60371:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;60495:10;;60485:6;60452:11;:23;60464:10;60452:23;;;;;;;;;;;;;;;:30;;;:39;;;;:::i;:::-;:53;;60444:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;60551:9;60546:145;60570:6;60566:1;:10;60546:145;;;60600:25;60614:10;60600:13;:25::i;:::-;60676:1;60642:11;:23;60654:10;60642:23;;;;;;;;;;;;;;;:30;;;:35;;;;;;;:::i;:::-;;;;;;;;60578:3;;;;;:::i;:::-;;;;60546:145;;;;60242:458;60192:508:::0;:::o;62720:272::-;62759:7;62780:22;;;;;;;;;;;62772:36;;62846:3;62840;62816:21;:27;;;;:::i;:::-;:33;;;;:::i;:::-;62772:82;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62758:96;;;62873:2;62865:11;;;;;;62890:7;62911;:5;:7::i;:::-;62903:21;;62932;62903:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62889:69;;;62979:2;62971:11;;;;;;62747:245;;62720:272::o;28964:197::-;29112:39;29129:4;29135:2;29139:7;29112:39;;;;;;;;;;;;:16;:39::i;:::-;28964:197;;;:::o;54067:296::-;54205:41;54224:12;:10;:12::i;:::-;54238:7;54205:18;:41::i;:::-;54181:145;;;;;;;;;;;;:::i;:::-;;;;;;;;;54339:14;54345:7;54339:5;:14::i;:::-;54067:296;:::o;64398:257::-;52537:12;:10;:12::i;:::-;52526:23;;:7;:5;:7::i;:::-;:23;;;52518:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64478:20:::1;64508:14;64478:45;;64536:15;64554:13;:23;;;64586:4;64554:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64536:56;;64605:13;:22;;;64628:7;:5;:7::i;:::-;64637;64605:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;64465:190;;64398:257:::0;:::o;41274:344::-;41404:7;41465:30;:28;:30::i;:::-;41457:5;:38;41433:138;;;;;;;;;;;;:::i;:::-;;;;;;;;;41591:10;41602:5;41591:17;;;;;;;;:::i;:::-;;;;;;;;;;41584:24;;41274:344;;;:::o;65269:108::-;52537:12;:10;:12::i;:::-;52526:23;;:7;:5;:7::i;:::-;:23;;;52518:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65357:10:::1;65347:7;:20;;;;;;:::i;:::-;;65269:108:::0;:::o;65130:129::-;52537:12;:10;:12::i;:::-;52526:23;;:7;:5;:7::i;:::-;:23;;;52518:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65223:26:::1;65236:7;65245:3;65223:12;:26::i;:::-;65130:129:::0;;:::o;49869:90::-;49916:4;49942:7;;;;;;;;;;;49935:14;;49869:90;:::o;25144:352::-;25271:7;25300:13;25316:7;:16;25324:7;25316:16;;;;;;;;;;;;;;;;;;;;;25300:32;;25386:1;25369:19;;:5;:19;;;25345:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;25481:5;25474:12;;;25144:352;;;:::o;65819:105::-;52537:12;:10;:12::i;:::-;52526:23;;:7;:5;:7::i;:::-;:23;;;52518:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65881:8:::1;:6;:8::i;:::-;:33;;65906:8;:6;:8::i;:::-;65881:33;;;65893:10;:8;:10::i;:::-;65881:33;65819:105::o:0;64684:123::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;62556:154::-;52537:12;:10;:12::i;:::-;52526:23;;:7;:5;:7::i;:::-;:23;;;52518:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62679:23:::1;62654:22;;:48;;;;;;;;;;;;;;;;;;62556:154:::0;:::o;24757:319::-;24884:7;24954:1;24937:19;;:5;:19;;;24913:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;25050:9;:16;25060:5;25050:16;;;;;;;;;;;;;;;;25043:23;;24757:319;;;:::o;52971:154::-;52537:12;:10;:12::i;:::-;52526:23;;:7;:5;:7::i;:::-;:23;;;52518:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53080:1:::1;53043:40;;53064:6;;;;;;;;;;;53043:40;;;;;;;;;;;;53113:1;53096:6;;:19;;;;;;;;;;;;;;;;;;52971:154::o:0;59860:34::-;;;;:::o;52294:91::-;52340:7;52369:6;;;;;;;;;;;52362:13;;52294:91;:::o;65709:94::-;52537:12;:10;:12::i;:::-;52526:23;;:7;:5;:7::i;:::-;:23;;;52518:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65785:8:::1;65777:5;:16;;;;65709:94:::0;:::o;25748:108::-;25804:13;25839:7;25832:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25748:108;:::o;61536:82::-;;;;;;;;;;;;;:::o;64083:299::-;52537:12;:10;:12::i;:::-;52526:23;;:7;:5;:7::i;:::-;:23;;;52518:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64182:21:::1;64214:14;64182:47;;64247:6;64242:131;64263:3;:10;64259:1;:14;64242:131;;;64297:13;:30;;;64336:4;64343:7;:5;:7::i;:::-;64352:3;64356:1;64352:6;;;;;;;;:::i;:::-;;;;;;;;64297:62;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;64275:3;;;;;:::i;:::-;;;;64242:131;;;;64169:213;64083:299:::0;;:::o;60013:40::-;;;;:::o;60868:441::-;50211:8;:6;:8::i;:::-;50210:9;50202:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;60940:14:::1;60957:13;:11;:13::i;:::-;60940:30;;61013:9;;61009:1;61000:6;60991;:15;;;;:::i;:::-;:19;;;;:::i;:::-;:31;60983:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;61073:1;61064:6;:10;:32;;;;;61088:8;;61078:6;:18;;61064:32;61056:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;61158:6;61150:5;;:14;;;;:::i;:::-;61137:9;:27;;61129:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;61212:9;61207:93;61231:6;61227:1;:10;61207:93;;;61261:25;61275:10;61261:13;:25::i;:::-;61239:3;;;;;:::i;:::-;;;;61207:93;;;;60927:382;60868:441:::0;:::o;27766:343::-;27923:12;:10;:12::i;:::-;27911:24;;:8;:24;;;27903:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;28025:8;27980:18;:32;27999:12;:10;:12::i;:::-;27980:32;;;;;;;;;;;;;;;:42;28013:8;27980:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;28080:8;28051:48;;28066:12;:10;:12::i;:::-;28051:48;;;28090:8;28051:48;;;;;;:::i;:::-;;;;;;;;27766:343;;:::o;61441:82::-;;;;;;;;;;;;;:::o;63436:520::-;63490:16;63521:18;63542:17;63552:6;63542:9;:17::i;:::-;63521:38;;63590:1;63576:10;:15;63572:375;;63631:1;63617:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63610:23;;;;;63572:375;63670:23;63710:10;63696:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63670:51;;63738:13;63768:134;63792:10;63784:5;:18;63768:134;;;63850:34;63870:6;63878:5;63850:19;:34::i;:::-;63834:6;63841:5;63834:13;;;;;;;;:::i;:::-;;;;;;;:50;;;;;63804:7;;;;;:::i;:::-;;;;63768:134;;;63925:6;63918:13;;;;;63436:520;;;;:::o;29238:387::-;29441:41;29460:12;:10;:12::i;:::-;29474:7;29441:18;:41::i;:::-;29417:146;;;;;;;;;;;;:::i;:::-;;;;;;;;;29576:39;29590:4;29596:2;29600:7;29609:5;29576:13;:39::i;:::-;29238:387;;;;:::o;64817:39::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;65593:106::-;52537:12;:10;:12::i;:::-;52526:23;;:7;:5;:7::i;:::-;:23;;;52518:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65678:11:::1;65667:8;:22;;;;65593:106:::0;:::o;65387:170::-;65489:13;65524:23;65539:7;65524:14;:23::i;:::-;65517:30;;65387:170;;;:::o;59962:35::-;;;;:::o;28186:230::-;28338:4;28371:18;:25;28390:5;28371:25;;;;;;;;;;;;;;;:35;28397:8;28371:35;;;;;;;;;;;;;;;;;;;;;;;;;28364:42;;28186:230;;;;:::o;53287:295::-;52537:12;:10;:12::i;:::-;52526:23;;:7;:5;:7::i;:::-;:23;;;52518:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53414:1:::1;53394:22;;:8;:22;;::::0;53370:116:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;53533:8;53504:38;;53525:6;;;;;;;;;;;53504:38;;;;;;;;;;;;53564:8;53555:6;;:17;;;;;;;;;;;;;;;;;;53287:295:::0;:::o;59911:34::-;;;;:::o;31226:131::-;31291:4;31345:1;31317:30;;:7;:16;31325:7;31317:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31310:37;;31226:131;;;:::o;40215:320::-;40372:4;40435:35;40420:50;;;:11;:50;;;;:105;;;;40489:36;40513:11;40489:23;:36::i;:::-;40420:105;40398:127;;40215:320;;;:::o;19297:102::-;19350:7;19379:10;19372:17;;19297:102;:::o;35549:180::-;35653:2;35626:15;:24;35642:7;35626:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35711:7;35707:2;35673:46;;35682:23;35697:7;35682:14;:23::i;:::-;35673:46;;;;;;;;;;;;35549:180;;:::o;31534:480::-;31671:4;31721:16;31729:7;31721;:16::i;:::-;31697:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;31826:13;31842:23;31857:7;31842:14;:23::i;:::-;31826:39;;31897:5;31886:16;;:7;:16;;;:66;;;;31945:7;31921:31;;:20;31933:7;31921:11;:20::i;:::-;:31;;;31886:66;:117;;;;31971:32;31988:5;31995:7;31971:16;:32::i;:::-;31886:117;31878:126;;;31534:480;;;;:::o;34774:649::-;34959:4;34932:31;;:23;34947:7;34932:14;:23::i;:::-;:31;;;34908:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;35071:1;35057:16;;:2;:16;;;35049:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;35129:39;35150:4;35156:2;35160:7;35129:20;:39::i;:::-;35237:29;35254:1;35258:7;35237:8;:29::i;:::-;35300:1;35281:9;:15;35291:4;35281:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;35331:1;35314:9;:13;35324:2;35314:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35364:2;35345:7;:16;35353:7;35345:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35405:7;35401:2;35386:27;;35395:4;35386:27;;;;;;;;;;;;34774:649;;;:::o;60716:142::-;60773:15;60812:1;60791:18;:16;:18::i;:::-;:22;;;;:::i;:::-;60773:40;;60826:22;60836:2;60840:7;60826:9;:22::i;:::-;60760:98;60716:142;:::o;63306:119::-;63395:20;63407:7;63395:11;:20::i;:::-;63306:119;:::o;47987:295::-;48134:16;48142:7;48134;:16::i;:::-;48110:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;48263:9;48241:10;:19;48252:7;48241:19;;;;;;;;;;;:31;;;;;;:::i;:::-;;47987:295;;:::o;50715:124::-;50211:8;:6;:8::i;:::-;50210:9;50202:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;50787:4:::1;50777:7;;:14;;;;;;;;;;;;;;;;;;50809:20;50816:12;:10;:12::i;:::-;50809:20;;;;;;:::i;:::-;;;;;;;;50715:124::o:0;50990:126::-;50504:8;:6;:8::i;:::-;50496:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;51061:5:::1;51051:7;;:15;;;;;;;;;;;;;;;;;;51084:22;51093:12;:10;:12::i;:::-;51084:22;;;;;;:::i;:::-;;;;;;;;50990:126::o:0;30528:374::-;30697:28;30707:4;30713:2;30717:7;30697:9;:28::i;:::-;30762:48;30785:4;30791:2;30795:7;30804:5;30762:22;:48::i;:::-;30738:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;30528:374;;;;:::o;47329:492::-;47457:13;47516:16;47524:7;47516;:16::i;:::-;47492:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;47628:18;47649:10;:8;:10::i;:::-;47628:31;;47672:17;47692:16;:14;:16::i;:::-;47672:36;;47776:4;47782:20;47783:7;47782:18;:20::i;:::-;47804:3;47759:49;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47745:64;;;;47329:492;;;:::o;24310:377::-;24467:4;24530:25;24515:40;;;:11;:40;;;;:107;;;;24589:33;24574:48;;;:11;:48;;;;24515:107;:162;;;;24641:36;24665:11;24641:23;:36::i;:::-;24515:162;24493:184;;24310:377;;;:::o;63041:255::-;50211:8;:6;:8::i;:::-;50210:9;50202:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;63241:45:::1;63268:4;63274:2;63278:7;63241:26;:45::i;:::-;63041:255:::0;;;:::o;6789:817::-;6842:7;6864:13;6890:11;;6880:9;:21;;;;:::i;:::-;6864:37;;6914:12;6939:14;6968:9;6997:5;6980:14;:12;:14::i;:::-;:22;;;;:::i;:::-;6968:34;;7109:1;7085:11;:20;7103:1;7097:5;:7;;;;:::i;:::-;7085:20;;;;;;;;;;;;:25;7081:139;;7141:1;7135:5;:7;;;;:::i;:::-;7128:14;;7081:139;;;7186:11;:20;7204:1;7198:5;:7;;;;:::i;:::-;7186:20;;;;;;;;;;;;7179:27;;7081:139;7366:1;7348:11;:14;7360:1;7348:14;;;;;;;;;;;;:19;7344:201;;7394:1;7385:10;;7429:4;7412:11;:14;7424:1;7412:14;;;;;;;;;;;:21;;;;7344:201;;;7479:11;:14;7491:1;7479:14;;;;;;;;;;;;7470:23;;7527:4;7510:11;:14;7522:1;7510:14;;;;;;;;;;;:21;;;;7344:201;7557:11;;:13;;;;;;;;;:::i;:::-;;;;;;7590:6;7583:13;;;;;;6789:817;:::o;32369:114::-;32447:26;32457:2;32461:7;32447:26;;;;;;;;;;;;:9;:26::i;:::-;32369:114;;:::o;48524:216::-;48595:20;48607:7;48595:11;:20::i;:::-;48671:1;48640:10;:19;48651:7;48640:19;;;;;;;;;;;48634:33;;;;;:::i;:::-;;;:38;48630:101;;48698:10;:19;48709:7;48698:19;;;;;;;;;;;;48691:26;;;;:::i;:::-;48630:101;48524:216;:::o;36307:1115::-;36472:4;36495:15;:2;:13;;;:15::i;:::-;36491:922;;;36568:2;36552:36;;;36613:12;:10;:12::i;:::-;36650:4;36679:7;36711:5;36552:185;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36529:823;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36949:1;36932:6;:13;:18;36928:407;;36977:112;;;;;;;;;;:::i;:::-;;;;;;;;36928:407;37281:6;37275:13;37266:6;37262:2;37258:15;37251:38;36529:823;36815:45;;;36805:55;;;:6;:55;;;;36798:62;;;;;36491:922;37395:4;37388:11;;36307:1115;;;;;;;:::o;65016:104::-;65068:13;65103:7;65096:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65016:104;:::o;64886:116::-;64944:13;64979;64972:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64886:116;:::o;19986:761::-;20042:13;20278:1;20269:5;:10;20265:57;;20298:10;;;;;;;;;;;;;;;;;;;;;20265:57;20334:12;20349:5;20334:20;;20367:14;20394:84;20409:1;20401:4;:9;20394:84;;20429:8;;;;;:::i;:::-;;;;20462:2;20454:10;;;;;:::i;:::-;;;20394:84;;;20490:19;20522:6;20512:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20490:39;;20542:162;20558:1;20549:5;:10;20542:162;;20588:1;20578:11;;;;;:::i;:::-;;;20657:2;20649:5;:10;;;;:::i;:::-;20636:2;:24;;;;:::i;:::-;20623:39;;20606:6;20613;20606:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;20688:2;20679:11;;;;;:::i;:::-;;;20542:162;;;20730:6;20716:21;;;;;19986:761;;;;:::o;22700:223::-;22840:4;22888:25;22873:40;;;:11;:40;;;;22866:47;;22700:223;;;:::o;42249:621::-;42403:45;42430:4;42436:2;42440:7;42403:26;:45::i;:::-;42483:1;42467:18;;:4;:18;;;42463:195;;42504:40;42536:7;42504:31;:40::i;:::-;42463:195;;;42576:2;42568:10;;:4;:10;;;42564:94;;42597:47;42630:4;42636:7;42597:32;:47::i;:::-;42564:94;42463:195;42688:1;42674:16;;:2;:16;;;42670:191;;42709:45;42746:7;42709:36;:45::i;:::-;42670:191;;;42784:4;42778:10;;:2;:10;;;42774:87;;42807:40;42835:2;42839:7;42807:27;:40::i;:::-;42774:87;42670:191;42249:621;;;:::o;7616:155::-;7662:7;7725:16;7743:15;7708:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7698:62;;;;;;7690:71;;7683:78;;7616:155;:::o;32717:341::-;32857:18;32863:2;32867:7;32857:5;:18::i;:::-;32912:54;32943:1;32947:2;32951:7;32960:5;32912:22;:54::i;:::-;32888:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;32717:341;;;:::o;34047:376::-;34109:13;34125:23;34140:7;34125:14;:23::i;:::-;34109:39;;34163:48;34184:5;34199:1;34203:7;34163:20;:48::i;:::-;34256:29;34273:1;34277:7;34256:8;:29::i;:::-;34320:1;34300:9;:16;34310:5;34300:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;34341:7;:16;34349:7;34341:16;;;;;;;;;;;;34334:23;;;;;;;;;;;34405:7;34401:1;34377:36;;34386:5;34377:36;;;;;;;;;;;;34096:327;34047:376;:::o;10342:464::-;10402:4;10618:12;10748:7;10736:20;10728:28;;10795:1;10788:4;:8;10781:15;;;10342:464;;;:::o;38053:134::-;;;;:::o;43616:170::-;43722:10;:17;;;;43695:15;:24;43711:7;43695:24;;;;;;;;;;;:44;;;;43752:10;43768:7;43752:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43616:170;:::o;44424:1034::-;44714:22;44764:1;44739:22;44756:4;44739:16;:22::i;:::-;:26;;;;:::i;:::-;44714:51;;44778:18;44799:17;:26;44817:7;44799:26;;;;;;;;;;;;44778:47;;44950:14;44936:10;:28;44932:336;;44983:19;45005:12;:18;45018:4;45005:18;;;;;;;;;;;;;;;:34;45024:14;45005:34;;;;;;;;;;;;44983:56;;45091:11;45058:12;:18;45071:4;45058:18;;;;;;;;;;;;;;;:30;45077:10;45058:30;;;;;;;;;;;:44;;;;45210:10;45177:17;:30;45195:11;45177:30;;;;;;;;;;;:43;;;;44966:302;44932:336;45368:17;:26;45386:7;45368:26;;;;;;;;;;;45361:33;;;45414:12;:18;45427:4;45414:18;;;;;;;;;;;;;;;:34;45433:14;45414:34;;;;;;;;;;;45407:41;;;44523:935;;44424:1034;;:::o;45761:1107::-;46020:22;46065:1;46045:10;:17;;;;:21;;;;:::i;:::-;46020:46;;46079:18;46100:15;:24;46116:7;46100:24;;;;;;;;;;;;46079:45;;46459:19;46481:10;46492:14;46481:26;;;;;;;;:::i;:::-;;;;;;;;;;46459:48;;46547:11;46522:10;46533;46522:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;46660:10;46629:15;:28;46645:11;46629:28;;;;;;;;;;;:41;;;;46805:15;:24;46821:7;46805:24;;;;;;;;;;;46798:31;;;46842:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45832:1036;;;45761:1107;:::o;43179:229::-;43266:14;43283:20;43300:2;43283:16;:20::i;:::-;43266:37;;43343:7;43316:12;:16;43329:2;43316:16;;;;;;;;;;;;;;;:24;43333:6;43316:24;;;;;;;;;;;:34;;;;43392:6;43363:17;:26;43381:7;43363:26;;;;;;;;;;;:35;;;;43253:155;43179:229;;:::o;33409:396::-;33505:1;33491:16;;:2;:16;;;33483:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33566:16;33574:7;33566;:16::i;:::-;33565:17;33557:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33630:45;33659:1;33663:2;33667:7;33630:20;:45::i;:::-;33707:1;33690:9;:13;33700:2;33690:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33740:2;33721:7;:16;33729:7;33721:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33787:7;33783:2;33762:33;;33779:1;33762:33;;;;;;;;;;;;33409:396;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:329::-;749:6;798:2;786:9;777:7;773:23;769:32;766:119;;;804:79;;:::i;:::-;766:119;924:1;949:53;994:7;985:6;974:9;970:22;949:53;:::i;:::-;939:63;;895:117;690:329;;;;:::o;1025:90::-;1059:7;1102:5;1095:13;1088:21;1077:32;;1025:90;;;:::o;1121:109::-;1202:21;1217:5;1202:21;:::i;:::-;1197:3;1190:34;1121:109;;:::o;1236:210::-;1323:4;1361:2;1350:9;1346:18;1338:26;;1374:65;1436:1;1425:9;1421:17;1412:6;1374:65;:::i;:::-;1236:210;;;;:::o;1452:149::-;1488:7;1528:66;1521:5;1517:78;1506:89;;1452:149;;;:::o;1607:120::-;1679:23;1696:5;1679:23;:::i;:::-;1672:5;1669:34;1659:62;;1717:1;1714;1707:12;1659:62;1607:120;:::o;1733:137::-;1778:5;1816:6;1803:20;1794:29;;1832:32;1858:5;1832:32;:::i;:::-;1733:137;;;;:::o;1876:327::-;1934:6;1983:2;1971:9;1962:7;1958:23;1954:32;1951:119;;;1989:79;;:::i;:::-;1951:119;2109:1;2134:52;2178:7;2169:6;2158:9;2154:22;2134:52;:::i;:::-;2124:62;;2080:116;1876:327;;;;:::o;2209:126::-;2246:7;2286:42;2279:5;2275:54;2264:65;;2209:126;;;:::o;2341:96::-;2378:7;2407:24;2425:5;2407:24;:::i;:::-;2396:35;;2341:96;;;:::o;2443:122::-;2516:24;2534:5;2516:24;:::i;:::-;2509:5;2506:35;2496:63;;2555:1;2552;2545:12;2496:63;2443:122;:::o;2571:139::-;2617:5;2655:6;2642:20;2633:29;;2671:33;2698:5;2671:33;:::i;:::-;2571:139;;;;:::o;2716:329::-;2775:6;2824:2;2812:9;2803:7;2799:23;2795:32;2792:119;;;2830:79;;:::i;:::-;2792:119;2950:1;2975:53;3020:7;3011:6;3000:9;2996:22;2975:53;:::i;:::-;2965:63;;2921:117;2716:329;;;;:::o;3051:99::-;3103:6;3137:5;3131:12;3121:22;;3051:99;;;:::o;3156:169::-;3240:11;3274:6;3269:3;3262:19;3314:4;3309:3;3305:14;3290:29;;3156:169;;;;:::o;3331:246::-;3412:1;3422:113;3436:6;3433:1;3430:13;3422:113;;;3521:1;3516:3;3512:11;3506:18;3502:1;3497:3;3493:11;3486:39;3458:2;3455:1;3451:10;3446:15;;3422:113;;;3569:1;3560:6;3555:3;3551:16;3544:27;3393:184;3331:246;;;:::o;3583:102::-;3624:6;3675:2;3671:7;3666:2;3659:5;3655:14;3651:28;3641:38;;3583:102;;;:::o;3691:377::-;3779:3;3807:39;3840:5;3807:39;:::i;:::-;3862:71;3926:6;3921:3;3862:71;:::i;:::-;3855:78;;3942:65;4000:6;3995:3;3988:4;3981:5;3977:16;3942:65;:::i;:::-;4032:29;4054:6;4032:29;:::i;:::-;4027:3;4023:39;4016:46;;3783:285;3691:377;;;;:::o;4074:313::-;4187:4;4225:2;4214:9;4210:18;4202:26;;4274:9;4268:4;4264:20;4260:1;4249:9;4245:17;4238:47;4302:78;4375:4;4366:6;4302:78;:::i;:::-;4294:86;;4074:313;;;;:::o;4393:118::-;4480:24;4498:5;4480:24;:::i;:::-;4475:3;4468:37;4393:118;;:::o;4517:222::-;4610:4;4648:2;4637:9;4633:18;4625:26;;4661:71;4729:1;4718:9;4714:17;4705:6;4661:71;:::i;:::-;4517:222;;;;:::o;4745:474::-;4813:6;4821;4870:2;4858:9;4849:7;4845:23;4841:32;4838:119;;;4876:79;;:::i;:::-;4838:119;4996:1;5021:53;5066:7;5057:6;5046:9;5042:22;5021:53;:::i;:::-;5011:63;;4967:117;5123:2;5149:53;5194:7;5185:6;5174:9;5170:22;5149:53;:::i;:::-;5139:63;;5094:118;4745:474;;;;;:::o;5225:118::-;5312:24;5330:5;5312:24;:::i;:::-;5307:3;5300:37;5225:118;;:::o;5349:222::-;5442:4;5480:2;5469:9;5465:18;5457:26;;5493:71;5561:1;5550:9;5546:17;5537:6;5493:71;:::i;:::-;5349:222;;;;:::o;5577:619::-;5654:6;5662;5670;5719:2;5707:9;5698:7;5694:23;5690:32;5687:119;;;5725:79;;:::i;:::-;5687:119;5845:1;5870:53;5915:7;5906:6;5895:9;5891:22;5870:53;:::i;:::-;5860:63;;5816:117;5972:2;5998:53;6043:7;6034:6;6023:9;6019:22;5998:53;:::i;:::-;5988:63;;5943:118;6100:2;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6071:118;5577:619;;;;;:::o;6202:474::-;6270:6;6278;6327:2;6315:9;6306:7;6302:23;6298:32;6295:119;;;6333:79;;:::i;:::-;6295:119;6453:1;6478:53;6523:7;6514:6;6503:9;6499:22;6478:53;:::i;:::-;6468:63;;6424:117;6580:2;6606:53;6651:7;6642:6;6631:9;6627:22;6606:53;:::i;:::-;6596:63;;6551:118;6202:474;;;;;:::o;6682:332::-;6803:4;6841:2;6830:9;6826:18;6818:26;;6854:71;6922:1;6911:9;6907:17;6898:6;6854:71;:::i;:::-;6935:72;7003:2;6992:9;6988:18;6979:6;6935:72;:::i;:::-;6682:332;;;;;:::o;7020:89::-;7056:7;7096:6;7089:5;7085:18;7074:29;;7020:89;;;:::o;7115:120::-;7187:23;7204:5;7187:23;:::i;:::-;7180:5;7177:34;7167:62;;7225:1;7222;7215:12;7167:62;7115:120;:::o;7241:137::-;7286:5;7324:6;7311:20;7302:29;;7340:32;7366:5;7340:32;:::i;:::-;7241:137;;;;:::o;7384:327::-;7442:6;7491:2;7479:9;7470:7;7466:23;7462:32;7459:119;;;7497:79;;:::i;:::-;7459:119;7617:1;7642:52;7686:7;7677:6;7666:9;7662:22;7642:52;:::i;:::-;7632:62;;7588:116;7384:327;;;;:::o;7717:117::-;7826:1;7823;7816:12;7840:117;7949:1;7946;7939:12;7963:180;8011:77;8008:1;8001:88;8108:4;8105:1;8098:15;8132:4;8129:1;8122:15;8149:281;8232:27;8254:4;8232:27;:::i;:::-;8224:6;8220:40;8362:6;8350:10;8347:22;8326:18;8314:10;8311:34;8308:62;8305:88;;;8373:18;;:::i;:::-;8305:88;8413:10;8409:2;8402:22;8192:238;8149:281;;:::o;8436:129::-;8470:6;8497:20;;:::i;:::-;8487:30;;8526:33;8554:4;8546:6;8526:33;:::i;:::-;8436:129;;;:::o;8571:308::-;8633:4;8723:18;8715:6;8712:30;8709:56;;;8745:18;;:::i;:::-;8709:56;8783:29;8805:6;8783:29;:::i;:::-;8775:37;;8867:4;8861;8857:15;8849:23;;8571:308;;;:::o;8885:146::-;8982:6;8977:3;8972;8959:30;9023:1;9014:6;9009:3;9005:16;8998:27;8885:146;;;:::o;9037:425::-;9115:5;9140:66;9156:49;9198:6;9156:49;:::i;:::-;9140:66;:::i;:::-;9131:75;;9229:6;9222:5;9215:21;9267:4;9260:5;9256:16;9305:3;9296:6;9291:3;9287:16;9284:25;9281:112;;;9312:79;;:::i;:::-;9281:112;9402:54;9449:6;9444:3;9439;9402:54;:::i;:::-;9121:341;9037:425;;;;;:::o;9482:340::-;9538:5;9587:3;9580:4;9572:6;9568:17;9564:27;9554:122;;9595:79;;:::i;:::-;9554:122;9712:6;9699:20;9737:79;9812:3;9804:6;9797:4;9789:6;9785:17;9737:79;:::i;:::-;9728:88;;9544:278;9482:340;;;;:::o;9828:509::-;9897:6;9946:2;9934:9;9925:7;9921:23;9917:32;9914:119;;;9952:79;;:::i;:::-;9914:119;10100:1;10089:9;10085:17;10072:31;10130:18;10122:6;10119:30;10116:117;;;10152:79;;:::i;:::-;10116:117;10257:63;10312:7;10303:6;10292:9;10288:22;10257:63;:::i;:::-;10247:73;;10043:287;9828:509;;;;:::o;10343:654::-;10421:6;10429;10478:2;10466:9;10457:7;10453:23;10449:32;10446:119;;;10484:79;;:::i;:::-;10446:119;10604:1;10629:53;10674:7;10665:6;10654:9;10650:22;10629:53;:::i;:::-;10619:63;;10575:117;10759:2;10748:9;10744:18;10731:32;10790:18;10782:6;10779:30;10776:117;;;10812:79;;:::i;:::-;10776:117;10917:63;10972:7;10963:6;10952:9;10948:22;10917:63;:::i;:::-;10907:73;;10702:288;10343:654;;;;;:::o;11003:311::-;11080:4;11170:18;11162:6;11159:30;11156:56;;;11192:18;;:::i;:::-;11156:56;11242:4;11234:6;11230:17;11222:25;;11302:4;11296;11292:15;11284:23;;11003:311;;;:::o;11320:117::-;11429:1;11426;11419:12;11460:710;11556:5;11581:81;11597:64;11654:6;11597:64;:::i;:::-;11581:81;:::i;:::-;11572:90;;11682:5;11711:6;11704:5;11697:21;11745:4;11738:5;11734:16;11727:23;;11798:4;11790:6;11786:17;11778:6;11774:30;11827:3;11819:6;11816:15;11813:122;;;11846:79;;:::i;:::-;11813:122;11961:6;11944:220;11978:6;11973:3;11970:15;11944:220;;;12053:3;12082:37;12115:3;12103:10;12082:37;:::i;:::-;12077:3;12070:50;12149:4;12144:3;12140:14;12133:21;;12020:144;12004:4;11999:3;11995:14;11988:21;;11944:220;;;11948:21;11562:608;;11460:710;;;;;:::o;12193:370::-;12264:5;12313:3;12306:4;12298:6;12294:17;12290:27;12280:122;;12321:79;;:::i;:::-;12280:122;12438:6;12425:20;12463:94;12553:3;12545:6;12538:4;12530:6;12526:17;12463:94;:::i;:::-;12454:103;;12270:293;12193:370;;;;:::o;12569:684::-;12662:6;12670;12719:2;12707:9;12698:7;12694:23;12690:32;12687:119;;;12725:79;;:::i;:::-;12687:119;12845:1;12870:53;12915:7;12906:6;12895:9;12891:22;12870:53;:::i;:::-;12860:63;;12816:117;13000:2;12989:9;12985:18;12972:32;13031:18;13023:6;13020:30;13017:117;;;13053:79;;:::i;:::-;13017:117;13158:78;13228:7;13219:6;13208:9;13204:22;13158:78;:::i;:::-;13148:88;;12943:303;12569:684;;;;;:::o;13259:116::-;13329:21;13344:5;13329:21;:::i;:::-;13322:5;13319:32;13309:60;;13365:1;13362;13355:12;13309:60;13259:116;:::o;13381:133::-;13424:5;13462:6;13449:20;13440:29;;13478:30;13502:5;13478:30;:::i;:::-;13381:133;;;;:::o;13520:468::-;13585:6;13593;13642:2;13630:9;13621:7;13617:23;13613:32;13610:119;;;13648:79;;:::i;:::-;13610:119;13768:1;13793:53;13838:7;13829:6;13818:9;13814:22;13793:53;:::i;:::-;13783:63;;13739:117;13895:2;13921:50;13963:7;13954:6;13943:9;13939:22;13921:50;:::i;:::-;13911:60;;13866:115;13520:468;;;;;:::o;13994:114::-;14061:6;14095:5;14089:12;14079:22;;13994:114;;;:::o;14114:184::-;14213:11;14247:6;14242:3;14235:19;14287:4;14282:3;14278:14;14263:29;;14114:184;;;;:::o;14304:132::-;14371:4;14394:3;14386:11;;14424:4;14419:3;14415:14;14407:22;;14304:132;;;:::o;14442:108::-;14519:24;14537:5;14519:24;:::i;:::-;14514:3;14507:37;14442:108;;:::o;14556:179::-;14625:10;14646:46;14688:3;14680:6;14646:46;:::i;:::-;14724:4;14719:3;14715:14;14701:28;;14556:179;;;;:::o;14741:113::-;14811:4;14843;14838:3;14834:14;14826:22;;14741:113;;;:::o;14890:732::-;15009:3;15038:54;15086:5;15038:54;:::i;:::-;15108:86;15187:6;15182:3;15108:86;:::i;:::-;15101:93;;15218:56;15268:5;15218:56;:::i;:::-;15297:7;15328:1;15313:284;15338:6;15335:1;15332:13;15313:284;;;15414:6;15408:13;15441:63;15500:3;15485:13;15441:63;:::i;:::-;15434:70;;15527:60;15580:6;15527:60;:::i;:::-;15517:70;;15373:224;15360:1;15357;15353:9;15348:14;;15313:284;;;15317:14;15613:3;15606:10;;15014:608;;;14890:732;;;;:::o;15628:373::-;15771:4;15809:2;15798:9;15794:18;15786:26;;15858:9;15852:4;15848:20;15844:1;15833:9;15829:17;15822:47;15886:108;15989:4;15980:6;15886:108;:::i;:::-;15878:116;;15628:373;;;;:::o;16007:307::-;16068:4;16158:18;16150:6;16147:30;16144:56;;;16180:18;;:::i;:::-;16144:56;16218:29;16240:6;16218:29;:::i;:::-;16210:37;;16302:4;16296;16292:15;16284:23;;16007:307;;;:::o;16320:423::-;16397:5;16422:65;16438:48;16479:6;16438:48;:::i;:::-;16422:65;:::i;:::-;16413:74;;16510:6;16503:5;16496:21;16548:4;16541:5;16537:16;16586:3;16577:6;16572:3;16568:16;16565:25;16562:112;;;16593:79;;:::i;:::-;16562:112;16683:54;16730:6;16725:3;16720;16683:54;:::i;:::-;16403:340;16320:423;;;;;:::o;16762:338::-;16817:5;16866:3;16859:4;16851:6;16847:17;16843:27;16833:122;;16874:79;;:::i;:::-;16833:122;16991:6;16978:20;17016:78;17090:3;17082:6;17075:4;17067:6;17063:17;17016:78;:::i;:::-;17007:87;;16823:277;16762:338;;;;:::o;17106:943::-;17201:6;17209;17217;17225;17274:3;17262:9;17253:7;17249:23;17245:33;17242:120;;;17281:79;;:::i;:::-;17242:120;17401:1;17426:53;17471:7;17462:6;17451:9;17447:22;17426:53;:::i;:::-;17416:63;;17372:117;17528:2;17554:53;17599:7;17590:6;17579:9;17575:22;17554:53;:::i;:::-;17544:63;;17499:118;17656:2;17682:53;17727:7;17718:6;17707:9;17703:22;17682:53;:::i;:::-;17672:63;;17627:118;17812:2;17801:9;17797:18;17784:32;17843:18;17835:6;17832:30;17829:117;;;17865:79;;:::i;:::-;17829:117;17970:62;18024:7;18015:6;18004:9;18000:22;17970:62;:::i;:::-;17960:72;;17755:287;17106:943;;;;;;;:::o;18055:474::-;18123:6;18131;18180:2;18168:9;18159:7;18155:23;18151:32;18148:119;;;18186:79;;:::i;:::-;18148:119;18306:1;18331:53;18376:7;18367:6;18356:9;18352:22;18331:53;:::i;:::-;18321:63;;18277:117;18433:2;18459:53;18504:7;18495:6;18484:9;18480:22;18459:53;:::i;:::-;18449:63;;18404:118;18055:474;;;;;:::o;18535:182::-;18675:34;18671:1;18663:6;18659:14;18652:58;18535:182;:::o;18723:366::-;18865:3;18886:67;18950:2;18945:3;18886:67;:::i;:::-;18879:74;;18962:93;19051:3;18962:93;:::i;:::-;19080:2;19075:3;19071:12;19064:19;;18723:366;;;:::o;19095:419::-;19261:4;19299:2;19288:9;19284:18;19276:26;;19348:9;19342:4;19338:20;19334:1;19323:9;19319:17;19312:47;19376:131;19502:4;19376:131;:::i;:::-;19368:139;;19095:419;;;:::o;19520:180::-;19568:77;19565:1;19558:88;19665:4;19662:1;19655:15;19689:4;19686:1;19679:15;19706:320;19750:6;19787:1;19781:4;19777:12;19767:22;;19834:1;19828:4;19824:12;19855:18;19845:81;;19911:4;19903:6;19899:17;19889:27;;19845:81;19973:2;19965:6;19962:14;19942:18;19939:38;19936:84;;19992:18;;:::i;:::-;19936:84;19757:269;19706:320;;;:::o;20032:231::-;20172:34;20168:1;20160:6;20156:14;20149:58;20241:14;20236:2;20228:6;20224:15;20217:39;20032:231;:::o;20269:366::-;20411:3;20432:67;20496:2;20491:3;20432:67;:::i;:::-;20425:74;;20508:93;20597:3;20508:93;:::i;:::-;20626:2;20621:3;20617:12;20610:19;;20269:366;;;:::o;20641:419::-;20807:4;20845:2;20834:9;20830:18;20822:26;;20894:9;20888:4;20884:20;20880:1;20869:9;20865:17;20858:47;20922:131;21048:4;20922:131;:::i;:::-;20914:139;;20641:419;;;:::o;21066:220::-;21206:34;21202:1;21194:6;21190:14;21183:58;21275:3;21270:2;21262:6;21258:15;21251:28;21066:220;:::o;21292:366::-;21434:3;21455:67;21519:2;21514:3;21455:67;:::i;:::-;21448:74;;21531:93;21620:3;21531:93;:::i;:::-;21649:2;21644:3;21640:12;21633:19;;21292:366;;;:::o;21664:419::-;21830:4;21868:2;21857:9;21853:18;21845:26;;21917:9;21911:4;21907:20;21903:1;21892:9;21888:17;21881:47;21945:131;22071:4;21945:131;:::i;:::-;21937:139;;21664:419;;;:::o;22089:243::-;22229:34;22225:1;22217:6;22213:14;22206:58;22298:26;22293:2;22285:6;22281:15;22274:51;22089:243;:::o;22338:366::-;22480:3;22501:67;22565:2;22560:3;22501:67;:::i;:::-;22494:74;;22577:93;22666:3;22577:93;:::i;:::-;22695:2;22690:3;22686:12;22679:19;;22338:366;;;:::o;22710:419::-;22876:4;22914:2;22903:9;22899:18;22891:26;;22963:9;22957:4;22953:20;22949:1;22938:9;22934:17;22927:47;22991:131;23117:4;22991:131;:::i;:::-;22983:139;;22710:419;;;:::o;23135:236::-;23275:34;23271:1;23263:6;23259:14;23252:58;23344:19;23339:2;23331:6;23327:15;23320:44;23135:236;:::o;23377:366::-;23519:3;23540:67;23604:2;23599:3;23540:67;:::i;:::-;23533:74;;23616:93;23705:3;23616:93;:::i;:::-;23734:2;23729:3;23725:12;23718:19;;23377:366;;;:::o;23749:419::-;23915:4;23953:2;23942:9;23938:18;23930:26;;24002:9;23996:4;23992:20;23988:1;23977:9;23973:17;23966:47;24030:131;24156:4;24030:131;:::i;:::-;24022:139;;23749:419;;;:::o;24174:180::-;24222:77;24219:1;24212:88;24319:4;24316:1;24309:15;24343:4;24340:1;24333:15;24360:410;24400:7;24423:20;24441:1;24423:20;:::i;:::-;24418:25;;24457:20;24475:1;24457:20;:::i;:::-;24452:25;;24512:1;24509;24505:9;24534:30;24552:11;24534:30;:::i;:::-;24523:41;;24713:1;24704:7;24700:15;24697:1;24694:22;24674:1;24667:9;24647:83;24624:139;;24743:18;;:::i;:::-;24624:139;24408:362;24360:410;;;;:::o;24776:180::-;24824:77;24821:1;24814:88;24921:4;24918:1;24911:15;24945:4;24942:1;24935:15;24962:185;25002:1;25019:20;25037:1;25019:20;:::i;:::-;25014:25;;25053:20;25071:1;25053:20;:::i;:::-;25048:25;;25092:1;25082:35;;25097:18;;:::i;:::-;25082:35;25139:1;25136;25132:9;25127:14;;24962:185;;;;:::o;25153:230::-;25293:34;25289:1;25281:6;25277:14;25270:58;25362:13;25357:2;25349:6;25345:15;25338:38;25153:230;:::o;25389:366::-;25531:3;25552:67;25616:2;25611:3;25552:67;:::i;:::-;25545:74;;25628:93;25717:3;25628:93;:::i;:::-;25746:2;25741:3;25737:12;25730:19;;25389:366;;;:::o;25761:419::-;25927:4;25965:2;25954:9;25950:18;25942:26;;26014:9;26008:4;26004:20;26000:1;25989:9;25985:17;25978:47;26042:131;26168:4;26042:131;:::i;:::-;26034:139;;25761:419;;;:::o;26186:230::-;26326:34;26322:1;26314:6;26310:14;26303:58;26395:13;26390:2;26382:6;26378:15;26371:38;26186:230;:::o;26422:366::-;26564:3;26585:67;26649:2;26644:3;26585:67;:::i;:::-;26578:74;;26661:93;26750:3;26661:93;:::i;:::-;26779:2;26774:3;26770:12;26763:19;;26422:366;;;:::o;26794:419::-;26960:4;26998:2;26987:9;26983:18;26975:26;;27047:9;27041:4;27037:20;27033:1;27022:9;27018:17;27011:47;27075:131;27201:4;27075:131;:::i;:::-;27067:139;;26794:419;;;:::o;27219:232::-;27359:34;27355:1;27347:6;27343:14;27336:58;27428:15;27423:2;27415:6;27411:15;27404:40;27219:232;:::o;27457:366::-;27599:3;27620:67;27684:2;27679:3;27620:67;:::i;:::-;27613:74;;27696:93;27785:3;27696:93;:::i;:::-;27814:2;27809:3;27805:12;27798:19;;27457:366;;;:::o;27829:419::-;27995:4;28033:2;28022:9;28018:18;28010:26;;28082:9;28076:4;28072:20;28068:1;28057:9;28053:17;28046:47;28110:131;28236:4;28110:131;:::i;:::-;28102:139;;27829:419;;;:::o;28254:191::-;28294:3;28313:20;28331:1;28313:20;:::i;:::-;28308:25;;28347:20;28365:1;28347:20;:::i;:::-;28342:25;;28390:1;28387;28383:9;28376:16;;28411:3;28408:1;28405:10;28402:36;;;28418:18;;:::i;:::-;28402:36;28254:191;;;;:::o;28451:194::-;28491:4;28511:20;28529:1;28511:20;:::i;:::-;28506:25;;28545:20;28563:1;28545:20;:::i;:::-;28540:25;;28589:1;28586;28582:9;28574:17;;28613:1;28607:4;28604:11;28601:37;;;28618:18;;:::i;:::-;28601:37;28451:194;;;;:::o;28651:166::-;28791:18;28787:1;28779:6;28775:14;28768:42;28651:166;:::o;28823:366::-;28965:3;28986:67;29050:2;29045:3;28986:67;:::i;:::-;28979:74;;29062:93;29151:3;29062:93;:::i;:::-;29180:2;29175:3;29171:12;29164:19;;28823:366;;;:::o;29195:419::-;29361:4;29399:2;29388:9;29384:18;29376:26;;29448:9;29442:4;29438:20;29434:1;29423:9;29419:17;29412:47;29476:131;29602:4;29476:131;:::i;:::-;29468:139;;29195:419;;;:::o;29620:166::-;29760:18;29756:1;29748:6;29744:14;29737:42;29620:166;:::o;29792:366::-;29934:3;29955:67;30019:2;30014:3;29955:67;:::i;:::-;29948:74;;30031:93;30120:3;30031:93;:::i;:::-;30149:2;30144:3;30140:12;30133:19;;29792:366;;;:::o;30164:419::-;30330:4;30368:2;30357:9;30353:18;30345:26;;30417:9;30411:4;30407:20;30403:1;30392:9;30388:17;30381:47;30445:131;30571:4;30445:131;:::i;:::-;30437:139;;30164:419;;;:::o;30589:170::-;30729:22;30725:1;30717:6;30713:14;30706:46;30589:170;:::o;30765:366::-;30907:3;30928:67;30992:2;30987:3;30928:67;:::i;:::-;30921:74;;31004:93;31093:3;31004:93;:::i;:::-;31122:2;31117:3;31113:12;31106:19;;30765:366;;;:::o;31137:419::-;31303:4;31341:2;31330:9;31326:18;31318:26;;31390:9;31384:4;31380:20;31376:1;31365:9;31361:17;31354:47;31418:131;31544:4;31418:131;:::i;:::-;31410:139;;31137:419;;;:::o;31562:233::-;31601:3;31624:24;31642:5;31624:24;:::i;:::-;31615:33;;31670:66;31663:5;31660:77;31657:103;;31740:18;;:::i;:::-;31657:103;31787:1;31780:5;31776:13;31769:20;;31562:233;;;:::o;31801:147::-;31902:11;31939:3;31924:18;;31801:147;;;;:::o;31954:114::-;;:::o;32074:398::-;32233:3;32254:83;32335:1;32330:3;32254:83;:::i;:::-;32247:90;;32346:93;32435:3;32346:93;:::i;:::-;32464:1;32459:3;32455:11;32448:18;;32074:398;;;:::o;32478:379::-;32662:3;32684:147;32827:3;32684:147;:::i;:::-;32677:154;;32848:3;32841:10;;32478:379;;;:::o;32863:235::-;33003:34;32999:1;32991:6;32987:14;32980:58;33072:18;33067:2;33059:6;33055:15;33048:43;32863:235;:::o;33104:366::-;33246:3;33267:67;33331:2;33326:3;33267:67;:::i;:::-;33260:74;;33343:93;33432:3;33343:93;:::i;:::-;33461:2;33456:3;33452:12;33445:19;;33104:366;;;:::o;33476:419::-;33642:4;33680:2;33669:9;33665:18;33657:26;;33729:9;33723:4;33719:20;33715:1;33704:9;33700:17;33693:47;33757:131;33883:4;33757:131;:::i;:::-;33749:139;;33476:419;;;:::o;33901:143::-;33958:5;33989:6;33983:13;33974:22;;34005:33;34032:5;34005:33;:::i;:::-;33901:143;;;;:::o;34050:351::-;34120:6;34169:2;34157:9;34148:7;34144:23;34140:32;34137:119;;;34175:79;;:::i;:::-;34137:119;34295:1;34320:64;34376:7;34367:6;34356:9;34352:22;34320:64;:::i;:::-;34310:74;;34266:128;34050:351;;;;:::o;34407:137::-;34461:5;34492:6;34486:13;34477:22;;34508:30;34532:5;34508:30;:::i;:::-;34407:137;;;;:::o;34550:345::-;34617:6;34666:2;34654:9;34645:7;34641:23;34637:32;34634:119;;;34672:79;;:::i;:::-;34634:119;34792:1;34817:61;34870:7;34861:6;34850:9;34846:22;34817:61;:::i;:::-;34807:71;;34763:125;34550:345;;;;:::o;34901:231::-;35041:34;35037:1;35029:6;35025:14;35018:58;35110:14;35105:2;35097:6;35093:15;35086:39;34901:231;:::o;35138:366::-;35280:3;35301:67;35365:2;35360:3;35301:67;:::i;:::-;35294:74;;35377:93;35466:3;35377:93;:::i;:::-;35495:2;35490:3;35486:12;35479:19;;35138:366;;;:::o;35510:419::-;35676:4;35714:2;35703:9;35699:18;35691:26;;35763:9;35757:4;35753:20;35749:1;35738:9;35734:17;35727:47;35791:131;35917:4;35791:131;:::i;:::-;35783:139;;35510:419;;;:::o;35935:180::-;35983:77;35980:1;35973:88;36080:4;36077:1;36070:15;36104:4;36101:1;36094:15;36121:141;36170:4;36193:3;36185:11;;36216:3;36213:1;36206:14;36250:4;36247:1;36237:18;36229:26;;36121:141;;;:::o;36268:93::-;36305:6;36352:2;36347;36340:5;36336:14;36332:23;36322:33;;36268:93;;;:::o;36367:107::-;36411:8;36461:5;36455:4;36451:16;36430:37;;36367:107;;;;:::o;36480:393::-;36549:6;36599:1;36587:10;36583:18;36622:97;36652:66;36641:9;36622:97;:::i;:::-;36740:39;36770:8;36759:9;36740:39;:::i;:::-;36728:51;;36812:4;36808:9;36801:5;36797:21;36788:30;;36861:4;36851:8;36847:19;36840:5;36837:30;36827:40;;36556:317;;36480:393;;;;;:::o;36879:60::-;36907:3;36928:5;36921:12;;36879:60;;;:::o;36945:142::-;36995:9;37028:53;37046:34;37055:24;37073:5;37055:24;:::i;:::-;37046:34;:::i;:::-;37028:53;:::i;:::-;37015:66;;36945:142;;;:::o;37093:75::-;37136:3;37157:5;37150:12;;37093:75;;;:::o;37174:269::-;37284:39;37315:7;37284:39;:::i;:::-;37345:91;37394:41;37418:16;37394:41;:::i;:::-;37386:6;37379:4;37373:11;37345:91;:::i;:::-;37339:4;37332:105;37250:193;37174:269;;;:::o;37449:73::-;37494:3;37449:73;:::o;37528:189::-;37605:32;;:::i;:::-;37646:65;37704:6;37696;37690:4;37646:65;:::i;:::-;37581:136;37528:189;;:::o;37723:186::-;37783:120;37800:3;37793:5;37790:14;37783:120;;;37854:39;37891:1;37884:5;37854:39;:::i;:::-;37827:1;37820:5;37816:13;37807:22;;37783:120;;;37723:186;;:::o;37915:543::-;38016:2;38011:3;38008:11;38005:446;;;38050:38;38082:5;38050:38;:::i;:::-;38134:29;38152:10;38134:29;:::i;:::-;38124:8;38120:44;38317:2;38305:10;38302:18;38299:49;;;38338:8;38323:23;;38299:49;38361:80;38417:22;38435:3;38417:22;:::i;:::-;38407:8;38403:37;38390:11;38361:80;:::i;:::-;38020:431;;38005:446;37915:543;;;:::o;38464:117::-;38518:8;38568:5;38562:4;38558:16;38537:37;;38464:117;;;;:::o;38587:169::-;38631:6;38664:51;38712:1;38708:6;38700:5;38697:1;38693:13;38664:51;:::i;:::-;38660:56;38745:4;38739;38735:15;38725:25;;38638:118;38587:169;;;;:::o;38761:295::-;38837:4;38983:29;39008:3;39002:4;38983:29;:::i;:::-;38975:37;;39045:3;39042:1;39038:11;39032:4;39029:21;39021:29;;38761:295;;;;:::o;39061:1395::-;39178:37;39211:3;39178:37;:::i;:::-;39280:18;39272:6;39269:30;39266:56;;;39302:18;;:::i;:::-;39266:56;39346:38;39378:4;39372:11;39346:38;:::i;:::-;39431:67;39491:6;39483;39477:4;39431:67;:::i;:::-;39525:1;39549:4;39536:17;;39581:2;39573:6;39570:14;39598:1;39593:618;;;;40255:1;40272:6;40269:77;;;40321:9;40316:3;40312:19;40306:26;40297:35;;40269:77;40372:67;40432:6;40425:5;40372:67;:::i;:::-;40366:4;40359:81;40228:222;39563:887;;39593:618;39645:4;39641:9;39633:6;39629:22;39679:37;39711:4;39679:37;:::i;:::-;39738:1;39752:208;39766:7;39763:1;39760:14;39752:208;;;39845:9;39840:3;39836:19;39830:26;39822:6;39815:42;39896:1;39888:6;39884:14;39874:24;;39943:2;39932:9;39928:18;39915:31;;39789:4;39786:1;39782:12;39777:17;;39752:208;;;39988:6;39979:7;39976:19;39973:179;;;40046:9;40041:3;40037:19;40031:26;40089:48;40131:4;40123:6;40119:17;40108:9;40089:48;:::i;:::-;40081:6;40074:64;39996:156;39973:179;40198:1;40194;40186:6;40182:14;40178:22;40172:4;40165:36;39600:611;;;39563:887;;39153:1303;;;39061:1395;;:::o;40462:228::-;40602:34;40598:1;40590:6;40586:14;40579:58;40671:11;40666:2;40658:6;40654:15;40647:36;40462:228;:::o;40696:366::-;40838:3;40859:67;40923:2;40918:3;40859:67;:::i;:::-;40852:74;;40935:93;41024:3;40935:93;:::i;:::-;41053:2;41048:3;41044:12;41037:19;;40696:366;;;:::o;41068:419::-;41234:4;41272:2;41261:9;41257:18;41249:26;;41321:9;41315:4;41311:20;41307:1;41296:9;41292:17;41285:47;41349:131;41475:4;41349:131;:::i;:::-;41341:139;;41068:419;;;:::o;41493:229::-;41633:34;41629:1;41621:6;41617:14;41610:58;41702:12;41697:2;41689:6;41685:15;41678:37;41493:229;:::o;41728:366::-;41870:3;41891:67;41955:2;41950:3;41891:67;:::i;:::-;41884:74;;41967:93;42056:3;41967:93;:::i;:::-;42085:2;42080:3;42076:12;42069:19;;41728:366;;;:::o;42100:419::-;42266:4;42304:2;42293:9;42289:18;42281:26;;42353:9;42347:4;42343:20;42339:1;42328:9;42324:17;42317:47;42381:131;42507:4;42381:131;:::i;:::-;42373:139;;42100:419;;;:::o;42525:442::-;42674:4;42712:2;42701:9;42697:18;42689:26;;42725:71;42793:1;42782:9;42778:17;42769:6;42725:71;:::i;:::-;42806:72;42874:2;42863:9;42859:18;42850:6;42806:72;:::i;:::-;42888;42956:2;42945:9;42941:18;42932:6;42888:72;:::i;:::-;42525:442;;;;;;:::o;42973:166::-;43113:18;43109:1;43101:6;43097:14;43090:42;42973:166;:::o;43145:366::-;43287:3;43308:67;43372:2;43367:3;43308:67;:::i;:::-;43301:74;;43384:93;43473:3;43384:93;:::i;:::-;43502:2;43497:3;43493:12;43486:19;;43145:366;;;:::o;43517:419::-;43683:4;43721:2;43710:9;43706:18;43698:26;;43770:9;43764:4;43760:20;43756:1;43745:9;43741:17;43734:47;43798:131;43924:4;43798:131;:::i;:::-;43790:139;;43517:419;;;:::o;43942:163::-;44082:15;44078:1;44070:6;44066:14;44059:39;43942:163;:::o;44111:366::-;44253:3;44274:67;44338:2;44333:3;44274:67;:::i;:::-;44267:74;;44350:93;44439:3;44350:93;:::i;:::-;44468:2;44463:3;44459:12;44452:19;;44111:366;;;:::o;44483:419::-;44649:4;44687:2;44676:9;44672:18;44664:26;;44736:9;44730:4;44726:20;44722:1;44711:9;44707:17;44700:47;44764:131;44890:4;44764:131;:::i;:::-;44756:139;;44483:419;;;:::o;44908:175::-;45048:27;45044:1;45036:6;45032:14;45025:51;44908:175;:::o;45089:366::-;45231:3;45252:67;45316:2;45311:3;45252:67;:::i;:::-;45245:74;;45328:93;45417:3;45328:93;:::i;:::-;45446:2;45441:3;45437:12;45430:19;;45089:366;;;:::o;45461:419::-;45627:4;45665:2;45654:9;45650:18;45642:26;;45714:9;45708:4;45704:20;45700:1;45689:9;45685:17;45678:47;45742:131;45868:4;45742:131;:::i;:::-;45734:139;;45461:419;;;:::o;45886:225::-;46026:34;46022:1;46014:6;46010:14;46003:58;46095:8;46090:2;46082:6;46078:15;46071:33;45886:225;:::o;46117:366::-;46259:3;46280:67;46344:2;46339:3;46280:67;:::i;:::-;46273:74;;46356:93;46445:3;46356:93;:::i;:::-;46474:2;46469:3;46465:12;46458:19;;46117:366;;;:::o;46489:419::-;46655:4;46693:2;46682:9;46678:18;46670:26;;46742:9;46736:4;46732:20;46728:1;46717:9;46713:17;46706:47;46770:131;46896:4;46770:131;:::i;:::-;46762:139;;46489:419;;;:::o;46914:231::-;47054:34;47050:1;47042:6;47038:14;47031:58;47123:14;47118:2;47110:6;47106:15;47099:39;46914:231;:::o;47151:366::-;47293:3;47314:67;47378:2;47373:3;47314:67;:::i;:::-;47307:74;;47390:93;47479:3;47390:93;:::i;:::-;47508:2;47503:3;47499:12;47492:19;;47151:366;;;:::o;47523:419::-;47689:4;47727:2;47716:9;47712:18;47704:26;;47776:9;47770:4;47766:20;47762:1;47751:9;47747:17;47740:47;47804:131;47930:4;47804:131;:::i;:::-;47796:139;;47523:419;;;:::o;47948:228::-;48088:34;48084:1;48076:6;48072:14;48065:58;48157:11;48152:2;48144:6;48140:15;48133:36;47948:228;:::o;48182:366::-;48324:3;48345:67;48409:2;48404:3;48345:67;:::i;:::-;48338:74;;48421:93;48510:3;48421:93;:::i;:::-;48539:2;48534:3;48530:12;48523:19;;48182:366;;;:::o;48554:419::-;48720:4;48758:2;48747:9;48743:18;48735:26;;48807:9;48801:4;48797:20;48793:1;48782:9;48778:17;48771:47;48835:131;48961:4;48835:131;:::i;:::-;48827:139;;48554:419;;;:::o;48979:223::-;49119:34;49115:1;49107:6;49103:14;49096:58;49188:6;49183:2;49175:6;49171:15;49164:31;48979:223;:::o;49208:366::-;49350:3;49371:67;49435:2;49430:3;49371:67;:::i;:::-;49364:74;;49447:93;49536:3;49447:93;:::i;:::-;49565:2;49560:3;49556:12;49549:19;;49208:366;;;:::o;49580:419::-;49746:4;49784:2;49773:9;49769:18;49761:26;;49833:9;49827:4;49823:20;49819:1;49808:9;49804:17;49797:47;49861:131;49987:4;49861:131;:::i;:::-;49853:139;;49580:419;;;:::o;50005:233::-;50145:34;50141:1;50133:6;50129:14;50122:58;50214:16;50209:2;50201:6;50197:15;50190:41;50005:233;:::o;50244:366::-;50386:3;50407:67;50471:2;50466:3;50407:67;:::i;:::-;50400:74;;50483:93;50572:3;50483:93;:::i;:::-;50601:2;50596:3;50592:12;50585:19;;50244:366;;;:::o;50616:419::-;50782:4;50820:2;50809:9;50805:18;50797:26;;50869:9;50863:4;50859:20;50855:1;50844:9;50840:17;50833:47;50897:131;51023:4;50897:131;:::i;:::-;50889:139;;50616:419;;;:::o;51041:170::-;51181:22;51177:1;51169:6;51165:14;51158:46;51041:170;:::o;51217:366::-;51359:3;51380:67;51444:2;51439:3;51380:67;:::i;:::-;51373:74;;51456:93;51545:3;51456:93;:::i;:::-;51574:2;51569:3;51565:12;51558:19;;51217:366;;;:::o;51589:419::-;51755:4;51793:2;51782:9;51778:18;51770:26;;51842:9;51836:4;51832:20;51828:1;51817:9;51813:17;51806:47;51870:131;51996:4;51870:131;:::i;:::-;51862:139;;51589:419;;;:::o;52014:237::-;52154:34;52150:1;52142:6;52138:14;52131:58;52223:20;52218:2;52210:6;52206:15;52199:45;52014:237;:::o;52257:366::-;52399:3;52420:67;52484:2;52479:3;52420:67;:::i;:::-;52413:74;;52496:93;52585:3;52496:93;:::i;:::-;52614:2;52609:3;52605:12;52598:19;;52257:366;;;:::o;52629:419::-;52795:4;52833:2;52822:9;52818:18;52810:26;;52882:9;52876:4;52872:20;52868:1;52857:9;52853:17;52846:47;52910:131;53036:4;52910:131;:::i;:::-;52902:139;;52629:419;;;:::o;53054:236::-;53194:34;53190:1;53182:6;53178:14;53171:58;53263:19;53258:2;53250:6;53246:15;53239:44;53054:236;:::o;53296:366::-;53438:3;53459:67;53523:2;53518:3;53459:67;:::i;:::-;53452:74;;53535:93;53624:3;53535:93;:::i;:::-;53653:2;53648:3;53644:12;53637:19;;53296:366;;;:::o;53668:419::-;53834:4;53872:2;53861:9;53857:18;53849:26;;53921:9;53915:4;53911:20;53907:1;53896:9;53892:17;53885:47;53949:131;54075:4;53949:131;:::i;:::-;53941:139;;53668:419;;;:::o;54093:148::-;54195:11;54232:3;54217:18;;54093:148;;;;:::o;54247:390::-;54353:3;54381:39;54414:5;54381:39;:::i;:::-;54436:89;54518:6;54513:3;54436:89;:::i;:::-;54429:96;;54534:65;54592:6;54587:3;54580:4;54573:5;54569:16;54534:65;:::i;:::-;54624:6;54619:3;54615:16;54608:23;;54357:280;54247:390;;;;:::o;54643:595::-;54871:3;54893:95;54984:3;54975:6;54893:95;:::i;:::-;54886:102;;55005:95;55096:3;55087:6;55005:95;:::i;:::-;54998:102;;55117:95;55208:3;55199:6;55117:95;:::i;:::-;55110:102;;55229:3;55222:10;;54643:595;;;;;;:::o;55244:176::-;55276:1;55293:20;55311:1;55293:20;:::i;:::-;55288:25;;55327:20;55345:1;55327:20;:::i;:::-;55322:25;;55366:1;55356:35;;55371:18;;:::i;:::-;55356:35;55412:1;55409;55405:9;55400:14;;55244:176;;;;:::o;55426:98::-;55477:6;55511:5;55505:12;55495:22;;55426:98;;;:::o;55530:168::-;55613:11;55647:6;55642:3;55635:19;55687:4;55682:3;55678:14;55663:29;;55530:168;;;;:::o;55704:373::-;55790:3;55818:38;55850:5;55818:38;:::i;:::-;55872:70;55935:6;55930:3;55872:70;:::i;:::-;55865:77;;55951:65;56009:6;56004:3;55997:4;55990:5;55986:16;55951:65;:::i;:::-;56041:29;56063:6;56041:29;:::i;:::-;56036:3;56032:39;56025:46;;55794:283;55704:373;;;;:::o;56083:640::-;56278:4;56316:3;56305:9;56301:19;56293:27;;56330:71;56398:1;56387:9;56383:17;56374:6;56330:71;:::i;:::-;56411:72;56479:2;56468:9;56464:18;56455:6;56411:72;:::i;:::-;56493;56561:2;56550:9;56546:18;56537:6;56493:72;:::i;:::-;56612:9;56606:4;56602:20;56597:2;56586:9;56582:18;56575:48;56640:76;56711:4;56702:6;56640:76;:::i;:::-;56632:84;;56083:640;;;;;;;:::o;56729:141::-;56785:5;56816:6;56810:13;56801:22;;56832:32;56858:5;56832:32;:::i;:::-;56729:141;;;;:::o;56876:349::-;56945:6;56994:2;56982:9;56973:7;56969:23;56965:32;56962:119;;;57000:79;;:::i;:::-;56962:119;57120:1;57145:63;57200:7;57191:6;57180:9;57176:22;57145:63;:::i;:::-;57135:73;;57091:127;56876:349;;;;:::o;57231:79::-;57270:7;57299:5;57288:16;;57231:79;;;:::o;57316:157::-;57421:45;57441:24;57459:5;57441:24;:::i;:::-;57421:45;:::i;:::-;57416:3;57409:58;57316:157;;:::o;57479:397::-;57619:3;57634:75;57705:3;57696:6;57634:75;:::i;:::-;57734:2;57729:3;57725:12;57718:19;;57747:75;57818:3;57809:6;57747:75;:::i;:::-;57847:2;57842:3;57838:12;57831:19;;57867:3;57860:10;;57479:397;;;;;:::o;57882:180::-;57930:77;57927:1;57920:88;58027:4;58024:1;58017:15;58051:4;58048:1;58041:15;58068:182;58208:34;58204:1;58196:6;58192:14;58185:58;58068:182;:::o;58256:366::-;58398:3;58419:67;58483:2;58478:3;58419:67;:::i;:::-;58412:74;;58495:93;58584:3;58495:93;:::i;:::-;58613:2;58608:3;58604:12;58597:19;;58256:366;;;:::o;58628:419::-;58794:4;58832:2;58821:9;58817:18;58809:26;;58881:9;58875:4;58871:20;58867:1;58856:9;58852:17;58845:47;58909:131;59035:4;58909:131;:::i;:::-;58901:139;;58628:419;;;:::o;59053:178::-;59193:30;59189:1;59181:6;59177:14;59170:54;59053:178;:::o;59237:366::-;59379:3;59400:67;59464:2;59459:3;59400:67;:::i;:::-;59393:74;;59476:93;59565:3;59476:93;:::i;:::-;59594:2;59589:3;59585:12;59578:19;;59237:366;;;:::o;59609:419::-;59775:4;59813:2;59802:9;59798:18;59790:26;;59862:9;59856:4;59852:20;59848:1;59837:9;59833:17;59826:47;59890:131;60016:4;59890:131;:::i;:::-;59882:139;;59609:419;;;:::o

Swarm Source

ipfs://138b425c5cab36b90e90a46a08d3bb89674cb0e71b568381ede12f4c161a79b8
Loading