Contract Overview
[ Download CSV Export ]
Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x8a84c51d9a9eaaeba7517be3db12b9167c64baed
Contract Name:
ArkaneERC1155
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2021-07-23 */ /** `:+osssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssso+:` /oss+::````````````````````````````````````````````````````````````````````````````::+sso/ /ss+` `+ss/ .sso oss. .ss- -ss. .ss. .ss. .ss. .ss. .ss. .. .ss. .ss. :oooo: .ss. .ss. `/ssssss/` .ss. .ss. `osssssssso` .ss. .ss. -osssssssssso- .ss. .ss. -ssssssssssssss- .ss. .ss. /ssssssssssssssss/ .ss. .ss. `/ssssssssssssssssss/` .ss. .ss. .+ssssssssssssssssssss+. .ss. .ss. .sssssssssso++ossssssssss. .ss. .ss. :osssssssss/` `/ssssssssso: .ss. .ss. :ssssssssss: `:ssssssssss: .ss. .ss. `/ssssssssss. .ssssssssss/` .ss. .ss. .+ssssssssso. .osssssssss+. .ss. .ss. `osssssssss+` `````````` `+ssssssssso` .ss. .ss. -ssssssssss/`.+ssssssssss+.`/ssssssssss- .ss. .ss. -ssssssssss/ osssssssssssso /ssssssssss- .ss. .ss. /ssssssssss- .+ssssssssss+. -ssssssssss/ .ss. .ss. `+ssssssssso` `````````` `osssssssss+` .ss. .ss. `+sssssssss+. .+sssssssss+` .ss. .ss. .ssssssssss/` `/ssssssssss. .ss. .ss. -osssssssss: :ssssssssss: .ss. .ss. /ssssssssso: :osssssssss/ .ss. .ss. `/sssssssss+. .+sssssssss/` .ss. .ss. `osssssssss+` `+ssssssssso` .ss. .ss. -osssssssss/` `/ssssssssso- .ss. .ss. :ssssssssss/ /ssssssssss: .ss. .ss. /ssssssssss- -ssssssssss/ .ss. .ss. `+ssssssssso- -osssssssss+` .ss. .ss. .ossssssssso` `ossssssssso. .ss. .ss. -osssssssss/` `/ssssssssso- .ss. .ss. -oooooooooo: :oooooooooo- .ss. .ss. `.........` `.........` .ss. .ss. .ss. .ss. .ss. .ss- -ss. .sso oss. /ss+` `+ss/ /oss+::............................................................................::+sso/ `:+osssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssso+:` * Copyright (C) 2020 Arkane BV (https://kbopub.economie.fgov.be/kbopub/toonondernemingps.html?lang=en&ondernemingsnummer=704738355) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * SPDX-License-Identifier: Apache-2.0 * */ pragma solidity ^0.8.4; library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return payable(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; } } 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); } abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } interface IAccessControl { function hasRole(bytes32 role, address account) external view returns (bool); function getRoleAdmin(bytes32 role) external view returns (bytes32); function grantRole(bytes32 role, address account) external; function revokeRole(bytes32 role, address account) external; function renounceRole(bytes32 role, address account) external; } abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping (address => bool) members; bytes32 adminRole; } mapping (bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override { require(hasRole(getRoleAdmin(role), _msgSender()), "AccessControl: sender must be an admin to grant"); _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override { require(hasRole(getRoleAdmin(role), _msgSender()), "AccessControl: sender must be an admin to revoke"); _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { emit RoleAdminChanged(role, getRoleAdmin(role), adminRole); _roles[role].adminRole = adminRole; } function _grantRole(bytes32 role, address account) private { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } contract AccessControlMixin is AccessControl { string private _revertMsg; function _setupContractId(string memory contractId) internal { _revertMsg = string(abi.encodePacked(contractId, ": INSUFFICIENT_PERMISSIONS")); } modifier only(bytes32 role) { require( hasRole(role, _msgSender()), _revertMsg ); _; } } contract Initializable { bool inited = false; modifier initializer() { require(!inited, "already inited"); _; inited = true; } } contract EIP712Base is Initializable { struct EIP712Domain { string name; string version; address verifyingContract; bytes32 salt; } string constant public ERC712_VERSION = "1"; bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256( bytes( "EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)" ) ); bytes32 internal domainSeperator; // supposed to be called once while initializing. // one of the contractsa that inherits this contract follows proxy pattern // so it is not possible to do this in a constructor function _initializeEIP712( string memory name ) internal initializer { _setDomainSeperator(name); } function _setDomainSeperator(string memory name) internal { domainSeperator = keccak256( abi.encode( EIP712_DOMAIN_TYPEHASH, keccak256(bytes(name)), keccak256(bytes(ERC712_VERSION)), address(this), bytes32(getChainId()) ) ); } function getDomainSeperator() public view returns (bytes32) { return domainSeperator; } function getChainId() public view returns (uint256) { uint256 id; assembly { id := chainid() } return id; } /** * Accept message hash and returns hash message in EIP712 compatible form * So that it can be used to recover signer from signature signed using EIP712 formatted data * https://eips.ethereum.org/EIPS/eip-712 * "\\x19" makes the encoding deterministic * "\\x01" is the version byte to make it compatible to EIP-191 */ function toTypedMessageHash(bytes32 messageHash) internal view returns (bytes32) { return keccak256( abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash) ); } } contract NativeMetaTransaction is EIP712Base { using SafeMath for uint256; bytes32 private constant META_TRANSACTION_TYPEHASH = keccak256( bytes( "MetaTransaction(uint256 nonce,address from,bytes functionSignature)" ) ); event MetaTransactionExecuted( address userAddress, address payable relayerAddress, bytes functionSignature ); mapping(address => uint256) nonces; /* * Meta transaction structure. * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas * He should call the desired function directly in that case. */ struct MetaTransaction { uint256 nonce; address from; bytes functionSignature; } function executeMetaTransaction( address userAddress, bytes memory functionSignature, bytes32 sigR, bytes32 sigS, uint8 sigV ) public payable returns (bytes memory) { MetaTransaction memory metaTx = MetaTransaction({ nonce: nonces[userAddress], from: userAddress, functionSignature: functionSignature }); require( verify(userAddress, metaTx, sigR, sigS, sigV), "Signer and signature do not match" ); // increase nonce for user (to avoid re-use) nonces[userAddress] = nonces[userAddress].add(1); emit MetaTransactionExecuted( userAddress, payable(msg.sender), functionSignature ); // Append userAddress and relayer address at the end to extract it from calling context (bool success, bytes memory returnData) = address(this).call( abi.encodePacked(functionSignature, userAddress) ); require(success, "Function call not successful"); return returnData; } function hashMetaTransaction(MetaTransaction memory metaTx) internal pure returns (bytes32) { return keccak256( abi.encode( META_TRANSACTION_TYPEHASH, metaTx.nonce, metaTx.from, keccak256(metaTx.functionSignature) ) ); } function getNonce(address user) public view returns (uint256 nonce) { nonce = nonces[user]; } function verify( address signer, MetaTransaction memory metaTx, bytes32 sigR, bytes32 sigS, uint8 sigV ) internal view returns (bool) { require(signer != address(0), "NativeMetaTransaction: INVALID_SIGNER"); return signer == ecrecover( toTypedMessageHash(hashMetaTransaction(metaTx)), sigV, sigR, sigS ); } } /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) external; } interface IERC1155Receiver is IERC165 { /** @dev Handles the receipt of a single ERC1155 token type. This function is called at the end of a `safeTransferFrom` after the balance has been updated. To accept the transfer, this must return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` (i.e. 0xf23a6e61, or its own function selector). @param operator The address which initiated the transfer (i.e. msg.sender) @param from The address which previously owned the token @param id The ID of the token being transferred @param value The amount of tokens being transferred @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns(bytes4); /** @dev Handles the receipt of a multiple ERC1155 token types. This function is called at the end of a `safeBatchTransferFrom` after the balances have been updated. To accept the transfer(s), this must return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` (i.e. 0xbc197c81, or its own function selector). @param operator The address which initiated the batch transfer (i.e. msg.sender) @param from The address which previously owned the token @param ids An array containing ids of each token being transferred (order and length must match values array) @param values An array containing amounts of each token being transferred (order and length must match ids array) @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns(bytes4); } 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); } } } } interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); } contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping (uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping (address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor (string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId; } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) external view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: balance query for the zero address"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch( address[] memory accounts, uint256[] memory ids ) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(_msgSender() != operator, "ERC1155: setting approval status for self"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require(to != address(0), "ERC1155: transfer to the zero address"); require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not owner nor approved" ); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); _balances[id][from] = fromBalance - amount; _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: transfer caller is not owner nor approved" ); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); _balances[id][from] = fromBalance - amount; _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `account`. * * Emits a {TransferSingle} event. * * Requirements: * * - `account` cannot be the zero address. * - If `account` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint(address account, uint256 id, uint256 amount, bytes memory data) internal virtual { require(account != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data); _balances[id][account] += amount; emit TransferSingle(operator, address(0), account, id, amount); _doSafeTransferAcceptanceCheck(operator, address(0), account, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `account` * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens of token type `id`. */ function _burn(address account, uint256 id, uint256 amount) internal virtual { require(account != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, account, address(0), _asSingletonArray(id), _asSingletonArray(amount), ""); uint256 accountBalance = _balances[id][account]; require(accountBalance >= amount, "ERC1155: burn amount exceeds balance"); _balances[id][account] = accountBalance - amount; emit TransferSingle(operator, account, address(0), id, amount); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch(address account, uint256[] memory ids, uint256[] memory amounts) internal virtual { require(account != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, account, address(0), ids, amounts, ""); for (uint i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 accountBalance = _balances[id][account]; require(accountBalance >= amount, "ERC1155: burn amount exceeds balance"); _balances[id][account] = accountBalance - amount; } emit TransferBatch(operator, account, address(0), ids, amounts); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { } function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver(to).onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (bytes4 response) { if (response != IERC1155Receiver(to).onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } } interface IChildToken { function deposit(address user, bytes calldata depositData) external; } abstract contract ContextMixin { function msgSender() internal view returns (address payable sender) { if (msg.sender == address(this)) { bytes memory array = msg.data; uint256 index = msg.data.length; assembly { // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those. sender := and( mload(add(array, index)), 0xffffffffffffffffffffffffffffffffffffffff ) } } else { sender = payable(msg.sender); } return sender; } } contract ChildMintableERC1155 is ERC1155, IChildToken, AccessControlMixin, NativeMetaTransaction, ContextMixin { bytes32 public constant DEPOSITOR_ROLE = keccak256("DEPOSITOR_ROLE"); constructor(string memory name, string memory uri_, address childChainManager) ERC1155(uri_) { _setupContractId("ChildMintableERC1155"); _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(DEPOSITOR_ROLE, childChainManager); _initializeEIP712(name); } function supportsInterface(bytes4 interfaceId) override(AccessControl, ERC1155) virtual public pure returns (bool) { return interfaceId == type(IAccessControl).interfaceId || interfaceId == type(IERC165).interfaceId || interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId; } // This is to support Native meta transactions // never use msg.sender directly, use _msgSender() instead function _msgSender() internal override view returns (address payable sender) { return ContextMixin.msgSender(); } /** * @notice called when tokens are deposited on root chain * @dev Should be callable only by ChildChainManager * Should handle deposit by minting the required tokens for user * Make sure minting is done only by this function * @param user user address for whom deposit is being done * @param depositData abi encoded ids array and amounts array */ function deposit(address user, bytes calldata depositData) external override only(DEPOSITOR_ROLE) { ( uint256[] memory ids, uint256[] memory amounts, bytes memory data ) = abi.decode(depositData, (uint256[], uint256[], bytes)); require( user != address(0), "ChildMintableERC1155: INVALID_DEPOSIT_USER" ); _mintBatch(user, ids, amounts, data); } /** * @notice called when user wants to withdraw single token back to root chain * @dev Should burn user's tokens. This transaction will be verified when exiting on root chain * @param id id to withdraw * @param amount amount to withdraw */ function withdrawSingle(uint256 id, uint256 amount) external { _burn(_msgSender(), id, amount); } /** * @notice called when user wants to batch withdraw tokens back to root chain * @dev Should burn user's tokens. This transaction will be verified when exiting on root chain * @param ids ids to withdraw * @param amounts amounts to withdraw */ function withdrawBatch(uint256[] calldata ids, uint256[] calldata amounts) external { _burnBatch(_msgSender(), ids, amounts); } } /** * Interface for marking support for sequence based minting * Interface id: 0xf79f20b5 */ interface SequencedMinting { /** * @dev return the mint number of the given id */ function mintNumber(uint256 id) external view returns (uint256); } /** * * @dev Implementation that adds type definations to token ids * Each token will be associtated with a token type, on this token type * extra restrictions can be provided (ex. fungible, burnable, max amount). * Tokens are logically grouped together based on their * */ abstract contract TypedERC1155 is ChildMintableERC1155, SequencedMinting { using SafeMath for uint256; mapping (uint256 => uint256) public maxSupplyForType; mapping (uint256 => uint256) public noTokensForType; mapping (uint256 => uint256) public typeForToken; mapping (uint256 => bool) public typeIsBurnable; mapping (uint256 => bool) public typeIsFungible; mapping (uint256 => bool) public usedIds; mapping (uint256 => uint256) private mintNumbers; /** * @dev Emitted when tokens are burned */ event TypeCreation(uint256 typeId, uint256 maxSupply, bool fungible, bool burnable); event NonFungibleMinted(uint256 typeId, uint256 id, address account); event NonFungibleBatchMinted(uint256 typeId, uint256[] ids, address[] accounts); event FungibleMinted(uint256 typeId, address account, uint256 amount); event FungibleBatchMinted(uint256 typeId, address[] accounts, uint256[] amounts); constructor(string memory name, string memory _uri, address childChainManager) ChildMintableERC1155(name, _uri,childChainManager) {} function createType(uint256 typeId, uint256 maxSupply, bool fungible, bool burnable) public only(DEFAULT_ADMIN_ROLE) { require(usedIds[typeId] == false, "Supplied typeId is already used"); require(maxSupply > 0, "max supply must be > 0"); maxSupplyForType[typeId] = maxSupply; typeIsFungible[typeId] = fungible; typeIsBurnable[typeId] = burnable; usedIds[typeId] = true; if(fungible) { typeForToken[typeId] = typeId; } emit TypeCreation(typeId, maxSupply, fungible, burnable); } function _mintNonFungible(uint256 typeId, uint256 id, address account) internal only(DEFAULT_ADMIN_ROLE) { require(id > 0); require(noTokensForType[typeId].add(1) <= maxSupplyForType[typeId], "Minting would exceed the max number of items for given type"); require(usedIds[id] == false, "Supplied id is already used"); require(typeIsFungible[typeId] == false, "Given type is fungible"); _mint(account, id, 1, new bytes(0)); usedIds[id] = true; noTokensForType[typeId] = noTokensForType[typeId].add(1); typeForToken[id] = typeId; mintNumbers[id] = noTokensForType[typeId]; } function mintNonFungible(uint256 typeId, uint256 id, address account) public only(DEFAULT_ADMIN_ROLE) { _mintNonFungible(typeId, id, account); emit NonFungibleMinted(typeId, id, account); } function _mintFungible(uint256 typeId, address account, uint256 amount) internal only(DEFAULT_ADMIN_ROLE) { require(typeId > 0); require(amount > 0, "Amount should be > 0"); require(noTokensForType[typeId].add(amount) <= maxSupplyForType[typeId], "Minting would exceed the max number of items for given type"); require(typeIsFungible[typeId] == true, "typeId is not fungible."); _mint(account, typeId, amount, new bytes(0)); noTokensForType[typeId] = noTokensForType[typeId].add(amount); } function mintFungible(uint256 typeId, address account, uint256 amount) public only(DEFAULT_ADMIN_ROLE) { _mintFungible(typeId, account, amount); emit FungibleMinted(typeId, account, amount); } function mintNonFungibleBatch(uint256 typeId, uint256[] calldata ids, address[] calldata accounts) public only(DEFAULT_ADMIN_ROLE) { require(ids.length == accounts.length, "number of ids must equal number of accounts"); for (uint256 i = 0; i < ids.length; ++i) { _mintNonFungible(typeId, ids[i], accounts[i]); } emit NonFungibleBatchMinted(typeId, ids, accounts); } function mintFungibleBatch(uint256 typeId, address[] calldata accounts, uint256[] calldata amounts) public only(DEFAULT_ADMIN_ROLE) { require(accounts.length == amounts.length, "number of accounts must equal number of amounts"); for (uint256 i = 0; i < accounts.length; ++i) { _mintFungible(typeId, accounts[i], amounts[i]); } emit FungibleBatchMinted(typeId, accounts, amounts); } function mintNumber(uint256 id) override public view returns (uint256) { return mintNumbers[id]; } /** * @dev Destroys `amount` tokens of token type `id` from `account` * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens of token type `id`. * - `type` of token with `id` must be burnable */ function burn(uint256 id, address account, uint256 amount) public { require(typeIsBurnable[typeForToken[id]] == true, "Type of token must be burnable"); require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "Caller is not owner nor approved" ); _burn(account, id, amount); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function burnBatch(uint256[] memory ids, address account, uint256[] memory amounts) public { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "Caller is not owner nor approved" ); for (uint256 i = 0; i < ids.length; ++i) { require(typeIsBurnable[typeForToken[ids[i]]] == true, "Type of token must be burnable"); } _burnBatch(account, ids, amounts); } } contract ArkaneERC1155 is TypedERC1155 { string public name; string public symbol; string public uriPrefix; string public uriSuffix; string internal cUri; constructor(string memory name_, string memory symbol_, string memory contractURI_, string memory uriPrefix_, string memory uriSuffix_, address childChainManager) TypedERC1155(name_, uriPrefix_, childChainManager) { name = name_; symbol = symbol_; cUri = contractURI_; uriPrefix = uriPrefix_; uriSuffix = uriSuffix_; } function setUriPrefix(string memory uriPrefix_) public only(DEFAULT_ADMIN_ROLE) { uriPrefix = uriPrefix_; } function setUriSuffix(string memory uriSuffix_) public only(DEFAULT_ADMIN_ROLE) { uriSuffix = uriSuffix_; } function supportsInterface(bytes4 interfaceId) override(ChildMintableERC1155) public pure returns (bool) { return interfaceId == type(IAccessControl).interfaceId || interfaceId == type(IERC165).interfaceId || interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || interfaceId == type(SequencedMinting).interfaceId; } function setContractURI(string memory _contractURI) public only(DEFAULT_ADMIN_ROLE) { cUri = _contractURI; } function contractURI() public view returns (string memory) { return cUri; } /** * @dev See {IERC1155MetadataURI-uri}. * */ function uri(uint256 tokenId) public view override returns (string memory) { return string(abi.encodePacked(uriPrefix, uint2str(tokenId), uriSuffix)); } function uint2str(uint _i) internal pure returns (string memory _uintAsString) { if (_i == 0) { return "0"; } uint j = _i; uint len; while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint k = len; while (_i != 0) { k = k-1; uint8 temp = (48 + uint8(_i - _i / 10 * 10)); bytes1 b1 = bytes1(temp); bstr[k] = b1; _i /= 10; } return string(bstr); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"contractURI_","type":"string"},{"internalType":"string","name":"uriPrefix_","type":"string"},{"internalType":"string","name":"uriSuffix_","type":"string"},{"internalType":"address","name":"childChainManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"typeId","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"FungibleBatchMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"typeId","type":"uint256"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FungibleMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"typeId","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"NonFungibleBatchMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"typeId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"NonFungibleMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"typeId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxSupply","type":"uint256"},{"indexed":false,"internalType":"bool","name":"fungible","type":"bool"},{"indexed":false,"internalType":"bool","name":"burnable","type":"bool"}],"name":"TypeCreation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSITOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ERC712_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"bool","name":"fungible","type":"bool"},{"internalType":"bool","name":"burnable","type":"bool"}],"name":"createType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bytes","name":"depositData","type":"bytes"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"maxSupplyForType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintFungible","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"},{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"mintFungibleBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"mintNonFungible","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"mintNonFungibleBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"mintNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"noTokensForType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","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":"_contractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uriPrefix_","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uriSuffix_","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"typeForToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"typeIsBurnable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"typeIsFungible","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"usedIds","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"withdrawBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawSingle","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526005805460ff191690553480156200001b57600080fd5b50604051620047a4380380620047a48339810160408190526200003e9162000535565b8583828282828162000050816200015e565b5060408051808201909152601481527f4368696c644d696e7461626c65455243313135350000000000000000000000006020820152620000909062000177565b620000a66000620000a0620001b0565b620001cc565b620000d27f8f4f2da22e8ac8f11e15f9fc141cddbb5deea8800186560abb6e68c5496619a982620001cc565b620000dd83620001d8565b50508951620000f99450600f935060208b0192509050620003e3565b5084516200010f906010906020880190620003e3565b50835162000125906013906020870190620003e3565b5082516200013b906011906020860190620003e3565b50815162000151906012906020850190620003e3565b50505050505050620006ea565b805162000173906002906020840190620003e3565b5050565b806040516020016200018a919062000621565b6040516020818303038152906040526004908051906020019062000173929190620003e3565b6000620001c76200023c60201b62001fab1760201c565b905090565b6200017382826200029b565b60055460ff1615620002215760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481a5b9a5d195960921b604482015260640160405180910390fd5b6200022c8162000341565b506005805460ff19166001179055565b6000333014156200029557600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150620002989050565b50335b90565b60008281526003602090815260408083206001600160a01b038516845290915290205460ff16620001735760008281526003602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620002fd620001b0565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6040518060800160405280604f815260200162004755604f9139805160209182012082519282019290922060408051808201825260018152603160f81b90840152805180840194909452838101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608401523060808401524660a0808501919091528151808503909101815260c090930190528151910120600655565b828054620003f19062000697565b90600052602060002090601f01602090048101928262000415576000855562000460565b82601f106200043057805160ff191683800117855562000460565b8280016001018555821562000460579182015b828111156200046057825182559160200191906001019062000443565b506200046e92915062000472565b5090565b5b808211156200046e576000815560010162000473565b80516001600160a01b0381168114620004a157600080fd5b919050565b600082601f830112620004b7578081fd5b81516001600160401b0380821115620004d457620004d4620006d4565b604051601f8301601f19908116603f01168101908282118183101715620004ff57620004ff620006d4565b8160405283815286602085880101111562000518578485fd5b6200052b84602083016020890162000664565b9695505050505050565b60008060008060008060c087890312156200054e578182fd5b86516001600160401b038082111562000565578384fd5b620005738a838b01620004a6565b9750602089015191508082111562000589578384fd5b620005978a838b01620004a6565b96506040890151915080821115620005ad578384fd5b620005bb8a838b01620004a6565b95506060890151915080821115620005d1578384fd5b620005df8a838b01620004a6565b94506080890151915080821115620005f5578384fd5b506200060489828a01620004a6565b9250506200061560a0880162000489565b90509295509295509295565b600082516200063581846020870162000664565b7f3a20494e53554646494349454e545f5045524d495353494f4e53000000000000920191825250601a01919050565b60005b838110156200068157818101518382015260200162000667565b8381111562000691576000848401525b50505050565b600181811c90821680620006ac57607f821691505b60208210811415620006ce57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b61405b80620006fa6000396000f3fe6080604052600436106102715760003560e01c8063799209511161014f578063b88cbbd2116100c1578063e8a3d4851161007a578063e8a3d485146107ca578063e985e9c5146107df578063f242432a14610828578063f79f20b514610848578063f807393a14610875578063fc86b6621461089557600080fd5b8063b88cbbd2146106ea578063bb7201881461070a578063bd378c711461073a578063cf2c52cb1461075a578063d3d57d891461077a578063d547741f146107aa57600080fd5b806395d89b411161011357806395d89b411461061c5780639eea5f6614610631578063a217fddf14610651578063a22cb46514610666578063a3b0b5a314610686578063aed0ddf2146106ba57600080fd5b8063799209511461056f5780637ec4a6591461059c57806391d14854146105bc578063938e3d7b146105dc57806393f7d6c7146105fc57600080fd5b8063248a9ca3116101e857806336568abe116101ac57806336568abe146104b85780634e1273f4146104d85780635503a0e8146105055780635c5fb5211461051a57806362b99ad41461053a57806369fe14e61461054f57600080fd5b8063248a9ca3146103ff5780632d0335ab1461042f5780632eb2c2d6146104655780632f2ff15d146104855780633408e470146104a557600080fd5b80630f699e801161023a5780630f699e801461032e5780630f7e59701461035b57806314564cfb1461038857806316ba10e0146103aa57806320379ee5146103ca5780632262f53f146103df57600080fd5b8062fdd58e1461027657806301ffc9a7146102a957806306fdde03146102d95780630c53c51c146102fb5780630e89341c1461030e575b600080fd5b34801561028257600080fd5b5061029661029136600461335d565b6108c2565b6040519081526020015b60405180910390f35b3480156102b557600080fd5b506102c96102c43660046135db565b610959565b60405190151581526020016102a0565b3480156102e557600080fd5b506102ee6109e1565b6040516102a09190613a67565b6102ee6103093660046132e5565b610a6f565b34801561031a57600080fd5b506102ee6103293660046135a1565b610c59565b34801561033a57600080fd5b506102966103493660046135a1565b600a6020526000908152604090205481565b34801561036757600080fd5b506102ee604051806040016040528060018152602001603160f81b81525081565b34801561039457600080fd5b506103a86103a3366004613694565b610c90565b005b3480156103b657600080fd5b506103a86103c5366004613613565b610dee565b3480156103d657600080fd5b50600654610296565b3480156103eb57600080fd5b506103a86103fa36600461370a565b610e35565b34801561040b57600080fd5b5061029661041a3660046135a1565b60009081526003602052604090206001015490565b34801561043b57600080fd5b5061029661044a3660046130ec565b6001600160a01b031660009081526007602052604090205490565b34801561047157600080fd5b506103a8610480366004613138565b610e4b565b34801561049157600080fd5b506103a86104a03660046135b9565b6110ee565b3480156104b157600080fd5b5046610296565b3480156104c457600080fd5b506103a86104d33660046135b9565b61117b565b3480156104e457600080fd5b506104f86104f3366004613386565b611205565b6040516102a09190613a2f565b34801561051157600080fd5b506102ee611366565b34801561052657600080fd5b506103a8610535366004613450565b611373565b34801561054657600080fd5b506102ee6113ee565b34801561055b57600080fd5b506103a861056a36600461375f565b6113fb565b34801561057b57600080fd5b5061029661058a3660046135a1565b60096020526000908152604090205481565b3480156105a857600080fd5b506103a86105b7366004613613565b611586565b3480156105c857600080fd5b506102c96105d73660046135b9565b6115c8565b3480156105e857600080fd5b506103a86105f7366004613613565b6115f3565b34801561060857600080fd5b506103a86106173660046134b8565b611635565b34801561062857600080fd5b506102ee611785565b34801561063d57600080fd5b506103a861064c366004613660565b611792565b34801561065d57600080fd5b50610296600081565b34801561067257600080fd5b506103a861068136600461323f565b611887565b34801561069257600080fd5b506102967f8f4f2da22e8ac8f11e15f9fc141cddbb5deea8800186560abb6e68c5496619a981565b3480156106c657600080fd5b506102c96106d53660046135a1565b600c6020526000908152604090205460ff1681565b3480156106f657600080fd5b506103a861070536600461372b565b61199b565b34801561071657600080fd5b506102c96107253660046135a1565b600b6020526000908152604090205460ff1681565b34801561074657600080fd5b506103a8610755366004613694565b611a28565b34801561076657600080fd5b506103a8610775366004613268565b611b72565b34801561078657600080fd5b506102c96107953660046135a1565b600d6020526000908152604090205460ff1681565b3480156107b657600080fd5b506103a86107c53660046135b9565b611c55565b3480156107d657600080fd5b506102ee611cd5565b3480156107eb57600080fd5b506102c96107fa366004613106565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561083457600080fd5b506103a86108433660046131dd565b611d67565b34801561085457600080fd5b506102966108633660046135a1565b6000908152600e602052604090205490565b34801561088157600080fd5b506103a8610890366004613660565b611f2b565b3480156108a157600080fd5b506102966108b03660046135a1565b60086020526000908152604090205481565b60006001600160a01b0383166109335760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216637965db0b60e01b148061098a57506001600160e01b031982166301ffc9a760e01b145b806109a557506001600160e01b03198216636cdb3d1360e11b145b806109c057506001600160e01b031982166303a24d0760e21b145b806109db57506001600160e01b0319821663f79f20b560e01b145b92915050565b600f80546109ee90613e7b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1a90613e7b565b8015610a675780601f10610a3c57610100808354040283529160200191610a67565b820191906000526020600020905b815481529060010190602001808311610a4a57829003601f168201915b505050505081565b60408051606081810183526001600160a01b03881660008181526007602090815290859020548452830152918101869052610aad8782878787612008565b610b035760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b606482015260840161092a565b6001600160a01b038716600090815260076020526040902054610b279060016120f8565b6001600160a01b0388166000908152600760205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b90610b7790899033908a9061396e565b60405180910390a1600080306001600160a01b0316888a604051602001610b9f929190613904565b60408051601f1981840301815290829052610bb9916138e8565b6000604051808303816000865af19150503d8060008114610bf6576040519150601f19603f3d011682016040523d82523d6000602084013e610bfb565b606091505b509150915081610c4d5760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c00000000604482015260640161092a565b98975050505050505050565b60606011610c668361210b565b6012604051602001610c7a9392919061393b565b6040516020818303038152906040529050919050565b6000610c9e816105d761224f565b600490610cbe5760405162461bcd60e51b815260040161092a9190613a7a565b50838214610d265760405162461bcd60e51b815260206004820152602f60248201527f6e756d626572206f66206163636f756e7473206d75737420657175616c206e7560448201526e6d626572206f6620616d6f756e747360881b606482015260840161092a565b60005b84811015610da657610d9687878784818110610d5557634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610d6a91906130ec565b868685818110610d8a57634e487b7160e01b600052603260045260246000fd5b9050602002013561225e565b610d9f81613ee2565b9050610d29565b507fbc11d48c1996f53e33584d90e8717cf38a41a8b337a2a6cebffea04c02c18fbf8686868686604051610dde959493929190613d3f565b60405180910390a1505050505050565b6000610dfc816105d761224f565b600490610e1c5760405162461bcd60e51b815260040161092a9190613a7a565b508151610e30906012906020850190612eee565b505050565b610e47610e4061224f565b83836123f1565b5050565b8151835114610e6c5760405162461bcd60e51b815260040161092a90613cb6565b6001600160a01b038416610e925760405162461bcd60e51b815260040161092a90613be4565b610e9a61224f565b6001600160a01b0316856001600160a01b03161480610ec05750610ec0856107fa61224f565b610f275760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161092a565b6000610f3161224f565b905060005b8451811015611080576000858281518110610f6157634e487b7160e01b600052603260045260246000fd5b602002602001015190506000858381518110610f8d57634e487b7160e01b600052603260045260246000fd5b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015610fdd5760405162461bcd60e51b815260040161092a90613c6c565b610fe78282613e38565b60008085815260200190815260200160002060008c6001600160a01b03166001600160a01b03168152602001908152602001600020819055508160008085815260200190815260200160002060008b6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546110659190613dbc565b925050819055505050508061107990613ee2565b9050610f36565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516110d0929190613a42565b60405180910390a46110e6818787878787612506565b505050505050565b60008281526003602052604090206001015461110d905b6105d761224f565b6111715760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60448201526e0818591b5a5b881d1bc819dc985b9d608a1b606482015260840161092a565b610e478282612671565b61118361224f565b6001600160a01b0316816001600160a01b0316146111fb5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840161092a565b610e4782826126f8565b6060815183511461126a5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b606482015260840161092a565b600083516001600160401b0381111561129357634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156112bc578160200160208202803683370190505b50905060005b845181101561135e576113238582815181106112ee57634e487b7160e01b600052603260045260246000fd5b602002602001015185838151811061131657634e487b7160e01b600052603260045260246000fd5b60200260200101516108c2565b82828151811061134357634e487b7160e01b600052603260045260246000fd5b602090810291909101015261135781613ee2565b90506112c2565b509392505050565b601280546109ee90613e7b565b6113e861137e61224f565b8585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060408051602080890282810182019093528882529093508892508791829185019084908082843760009201919091525061277d92505050565b50505050565b601180546109ee90613e7b565b6000611409816105d761224f565b6004906114295760405162461bcd60e51b815260040161092a9190613a7a565b506000858152600d602052604090205460ff16156114895760405162461bcd60e51b815260206004820152601f60248201527f537570706c6965642074797065496420697320616c7265616479207573656400604482015260640161092a565b600084116114d25760405162461bcd60e51b815260206004820152601660248201527506d617820737570706c79206d757374206265203e20360541b604482015260640161092a565b6000858152600860209081526040808320879055600c825280832080548715801560ff1992831617909255600b84528285208054881515908316179055600d909352922080549091166001179055611536576000858152600a602052604090208590555b604080518681526020810186905284151581830152831515606082015290517f4661e4602c152562e2a8e8b7edec591cba0bc4eb934f58e9cb5a8af09302573f9181900360800190a15050505050565b6000611594816105d761224f565b6004906115b45760405162461bcd60e51b815260040161092a9190613a7a565b508151610e30906011906020850190612eee565b60009182526003602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000611601816105d761224f565b6004906116215760405162461bcd60e51b815260040161092a9190613a7a565b508151610e30906013906020850190612eee565b61163d61224f565b6001600160a01b0316826001600160a01b031614806116635750611663826107fa61224f565b6116af5760405162461bcd60e51b815260206004820181905260248201527f43616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564604482015260640161092a565b60005b835181101561177957600b6000600a60008785815181106116e357634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200190815260200160002054815260200190815260200160002060009054906101000a900460ff16151560011515146117695760405162461bcd60e51b815260206004820152601e60248201527f54797065206f6620746f6b656e206d757374206265206275726e61626c650000604482015260640161092a565b61177281613ee2565b90506116b2565b50610e3082848361277d565b601080546109ee90613e7b565b6000838152600a60209081526040808320548352600b90915290205460ff1615156001146118025760405162461bcd60e51b815260206004820152601e60248201527f54797065206f6620746f6b656e206d757374206265206275726e61626c650000604482015260640161092a565b61180a61224f565b6001600160a01b0316826001600160a01b031614806118305750611830826107fa61224f565b61187c5760405162461bcd60e51b815260206004820181905260248201527f43616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564604482015260640161092a565b610e308284836123f1565b816001600160a01b031661189961224f565b6001600160a01b031614156119025760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b606482015260840161092a565b806001600061190f61224f565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561195361224f565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161198f911515815260200190565b60405180910390a35050565b60006119a9816105d761224f565b6004906119c95760405162461bcd60e51b815260040161092a9190613a7a565b506119d584848461292c565b60408051858152602081018590526001600160a01b038416918101919091527faa31d15dd62975f7f98b676018f8787ef55d604ec8c765132c34e398919afb74906060015b60405180910390a150505050565b6000611a36816105d761224f565b600490611a565760405162461bcd60e51b815260040161092a9190613a7a565b50838214611aba5760405162461bcd60e51b815260206004820152602b60248201527f6e756d626572206f6620696473206d75737420657175616c206e756d6265722060448201526a6f66206163636f756e747360a81b606482015260840161092a565b60005b84811015611b3a57611b2a87878784818110611ae957634e487b7160e01b600052603260045260246000fd5b90506020020135868685818110611b1057634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611b2591906130ec565b61292c565b611b3381613ee2565b9050611abd565b507f16a6af95050d3c05c617a7c59f4ab66345c532ef8bf5575e13b8b25cb7ed13c18686868686604051610dde959493929190613d6c565b7f8f4f2da22e8ac8f11e15f9fc141cddbb5deea8800186560abb6e68c5496619a9611b9f816105d761224f565b600490611bbf5760405162461bcd60e51b815260040161092a9190613a7a565b5060008080611bd085870187613528565b919450925090506001600160a01b038716611c405760405162461bcd60e51b815260206004820152602a60248201527f4368696c644d696e7461626c65455243313135353a20494e56414c49445f44456044820152692827a9a4aa2faaa9a2a960b11b606482015260840161092a565b611c4c87848484612ada565b50505050505050565b600082815260036020526040902060010154611c7090611105565b6111fb5760405162461bcd60e51b815260206004820152603060248201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60448201526f2061646d696e20746f207265766f6b6560801b606482015260840161092a565b606060138054611ce490613e7b565b80601f0160208091040260200160405190810160405280929190818152602001828054611d1090613e7b565b8015611d5d5780601f10611d3257610100808354040283529160200191611d5d565b820191906000526020600020905b815481529060010190602001808311611d4057829003601f168201915b5050505050905090565b6001600160a01b038416611d8d5760405162461bcd60e51b815260040161092a90613be4565b611d9561224f565b6001600160a01b0316856001600160a01b03161480611dbb5750611dbb856107fa61224f565b611e195760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b606482015260840161092a565b6000611e2361224f565b9050611e44818787611e3488612c4c565b611e3d88612c4c565b5050505050565b6000848152602081815260408083206001600160a01b038a16845290915290205483811015611e855760405162461bcd60e51b815260040161092a90613c6c565b611e8f8482613e38565b6000868152602081815260408083206001600160a01b038c81168552925280832093909355881681529081208054869290611ecb908490613dbc565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611c4c828888888888612ca5565b6000611f39816105d761224f565b600490611f595760405162461bcd60e51b815260040161092a9190613a7a565b50611f6584848461225e565b604080518581526001600160a01b03851660208201529081018390527f6a47e9a7fdc397ac645d72459fcca69dbb90f878280bf1fc79d95889ab51c19890606001611a1a565b60003330141561200257600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506120059050565b50335b90565b60006001600160a01b03861661206e5760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201526424a3a722a960d91b606482015260840161092a565b600161208161207c87612d6f565b612dec565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa1580156120cf573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b60006121048284613dbc565b9392505050565b60608161212f5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612159578061214381613ee2565b91506121529050600a83613df9565b9150612133565b6000816001600160401b0381111561218157634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156121ab576020820181803683370190505b509050815b8515612246576121c1600182613e38565b905060006121d0600a88613df9565b6121db90600a613e19565b6121e59088613e38565b6121f0906030613dd4565b905060008160f81b90508084848151811061221b57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061223d600a89613df9565b975050506121b0565b50949350505050565b6000612259611fab565b905090565b600061226c816105d761224f565b60049061228c5760405162461bcd60e51b815260040161092a9190613a7a565b506000841161229a57600080fd5b600082116122e15760405162461bcd60e51b81526020600482015260146024820152730416d6f756e742073686f756c64206265203e20360641b604482015260640161092a565b60008481526008602090815260408083205460099092529091205461230690846120f8565b11156123245760405162461bcd60e51b815260040161092a90613b87565b6000848152600c602052604090205460ff1615156001146123875760405162461bcd60e51b815260206004820152601760248201527f747970654964206973206e6f742066756e6769626c652e000000000000000000604482015260640161092a565b6123c083858460005b6040519080825280601f01601f1916602001820160405280156123ba576020820181803683370190505b50612e1c565b6000848152600960205260409020546123d990836120f8565b60009485526009602052604090942093909355505050565b6001600160a01b0383166124175760405162461bcd60e51b815260040161092a90613c29565b600061242161224f565b90506124528185600061243387612c4c565b61243c87612c4c565b5050604080516020810190915260009052505050565b6000838152602081815260408083206001600160a01b0388168452909152902054828110156124935760405162461bcd60e51b815260040161092a90613b43565b61249d8382613e38565b6000858152602081815260408083206001600160a01b038a811680865291845282852095909555815189815292830188905292938616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b6001600160a01b0384163b156110e65760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061254a90899089908890889088906004016139a3565b602060405180830381600087803b15801561256457600080fd5b505af1925050508015612594575060408051601f3d908101601f19168201909252612591918101906135f7565b60015b612641576125a0613f29565b806308c379a014156125da57506125b5613f40565b806125c057506125dc565b8060405162461bcd60e51b815260040161092a9190613a67565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606482015260840161092a565b6001600160e01b0319811663bc197c8160e01b14611c4c5760405162461bcd60e51b815260040161092a90613afb565b61267b82826115c8565b610e475760008281526003602090815260408083206001600160a01b03851684529091529020805460ff191660011790556126b461224f565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61270282826115c8565b15610e475760008281526003602090815260408083206001600160a01b03851684529091529020805460ff1916905561273961224f565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b6001600160a01b0383166127a35760405162461bcd60e51b815260040161092a90613c29565b80518251146127c45760405162461bcd60e51b815260040161092a90613cb6565b60006127ce61224f565b604080516020810190915260009052905060005b83518110156128cd57600084828151811061280d57634e487b7160e01b600052603260045260246000fd5b60200260200101519050600084838151811061283957634e487b7160e01b600052603260045260246000fd5b602090810291909101810151600084815280835260408082206001600160a01b038c1683529093529190912054909150818110156128895760405162461bcd60e51b815260040161092a90613b43565b6128938282613e38565b6000938452602084815260408086206001600160a01b038c16875290915290932092909255508190506128c581613ee2565b9150506127e2565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161291e929190613a42565b60405180910390a450505050565b600061293a816105d761224f565b60049061295a5760405162461bcd60e51b815260040161092a9190613a7a565b506000831161296857600080fd5b60008481526008602090815260408083205460099092529091205461298e9060016120f8565b11156129ac5760405162461bcd60e51b815260040161092a90613b87565b6000838152600d602052604090205460ff1615612a0b5760405162461bcd60e51b815260206004820152601b60248201527f537570706c69656420696420697320616c726561647920757365640000000000604482015260640161092a565b6000848152600c602052604090205460ff1615612a635760405162461bcd60e51b8152602060048201526016602482015275476976656e20747970652069732066756e6769626c6560501b604482015260640161092a565b612a71828460016000612390565b6000838152600d60209081526040808320805460ff19166001908117909155878452600990925290912054612aa5916120f8565b6000858152600960209081526040808320938455958252600a8152858220969096559054600e90955292909220929092555050565b6001600160a01b038416612b005760405162461bcd60e51b815260040161092a90613cfe565b8151835114612b215760405162461bcd60e51b815260040161092a90613cb6565b6000612b2b61224f565b905060005b8451811015612be457838181518110612b5957634e487b7160e01b600052603260045260246000fd5b6020026020010151600080878481518110612b8457634e487b7160e01b600052603260045260246000fd5b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b031681526020019081526020016000206000828254612bcc9190613dbc565b90915550819050612bdc81613ee2565b915050612b30565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612c35929190613a42565b60405180910390a4611e3d81600087878787612506565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110612c9457634e487b7160e01b600052603260045260246000fd5b602090810291909101015292915050565b6001600160a01b0384163b156110e65760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190612ce990899089908890889088906004016139f5565b602060405180830381600087803b158015612d0357600080fd5b505af1925050508015612d33575060408051601f3d908101601f19168201909252612d30918101906135f7565b60015b612d3f576125a0613f29565b6001600160e01b0319811663f23a6e6160e01b14611c4c5760405162461bcd60e51b815260040161092a90613afb565b6000604051806080016040528060438152602001613fe36043913980516020918201208351848301516040808701518051908601209051612dcf950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b6000612df760065490565b60405161190160f01b6020820152602281019190915260428101839052606201612dcf565b6001600160a01b038416612e425760405162461bcd60e51b815260040161092a90613cfe565b6000612e4c61224f565b9050612e5e81600087611e3488612c4c565b6000848152602081815260408083206001600160a01b038916845290915281208054859290612e8e908490613dbc565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611e3d81600087878787612ca5565b828054612efa90613e7b565b90600052602060002090601f016020900481019282612f1c5760008555612f62565b82601f10612f3557805160ff1916838001178555612f62565b82800160010185558215612f62579182015b82811115612f62578251825591602001919060010190612f47565b50612f6e929150612f72565b5090565b5b80821115612f6e5760008155600101612f73565b60006001600160401b03831115612fa057612fa0613f13565b604051612fb7601f8501601f191660200182613eb6565b809150838152848484011115612fcc57600080fd5b83836020830137600060208583010152509392505050565b80356001600160a01b0381168114612ffb57600080fd5b919050565b60008083601f840112613011578182fd5b5081356001600160401b03811115613027578182fd5b6020830191508360208260051b850101111561304257600080fd5b9250929050565b600082601f830112613059578081fd5b8135602061306682613d99565b6040516130738282613eb6565b8381528281019150858301600585901b87018401881015613092578586fd5b855b858110156130b057813584529284019290840190600101613094565b5090979650505050505050565b80358015158114612ffb57600080fd5b600082601f8301126130dd578081fd5b61210483833560208501612f87565b6000602082840312156130fd578081fd5b61210482612fe4565b60008060408385031215613118578081fd5b61312183612fe4565b915061312f60208401612fe4565b90509250929050565b600080600080600060a0868803121561314f578081fd5b61315886612fe4565b945061316660208701612fe4565b935060408601356001600160401b0380821115613181578283fd5b61318d89838a01613049565b945060608801359150808211156131a2578283fd5b6131ae89838a01613049565b935060808801359150808211156131c3578283fd5b506131d0888289016130cd565b9150509295509295909350565b600080600080600060a086880312156131f4578081fd5b6131fd86612fe4565b945061320b60208701612fe4565b9350604086013592506060860135915060808601356001600160401b03811115613233578182fd5b6131d0888289016130cd565b60008060408385031215613251578182fd5b61325a83612fe4565b915061312f602084016130bd565b60008060006040848603121561327c578081fd5b61328584612fe4565b925060208401356001600160401b03808211156132a0578283fd5b818601915086601f8301126132b3578283fd5b8135818111156132c1578384fd5b8760208285010111156132d2578384fd5b6020830194508093505050509250925092565b600080600080600060a086880312156132fc578283fd5b61330586612fe4565b945060208601356001600160401b0381111561331f578384fd5b61332b888289016130cd565b9450506040860135925060608601359150608086013560ff8116811461334f578182fd5b809150509295509295909350565b6000806040838503121561336f578182fd5b61337883612fe4565b946020939093013593505050565b60008060408385031215613398578182fd5b82356001600160401b03808211156133ae578384fd5b818501915085601f8301126133c1578384fd5b813560206133ce82613d99565b6040516133db8282613eb6565b8381528281019150858301600585901b870184018b10156133fa578889fd5b8896505b848710156134235761340f81612fe4565b8352600196909601959183019183016133fe565b5096505086013592505080821115613439578283fd5b5061344685828601613049565b9150509250929050565b60008060008060408587031215613465578182fd5b84356001600160401b038082111561347b578384fd5b61348788838901613000565b9096509450602087013591508082111561349f578384fd5b506134ac87828801613000565b95989497509550505050565b6000806000606084860312156134cc578081fd5b83356001600160401b03808211156134e2578283fd5b6134ee87838801613049565b94506134fc60208701612fe4565b93506040860135915080821115613511578283fd5b5061351e86828701613049565b9150509250925092565b60008060006060848603121561353c578081fd5b83356001600160401b0380821115613552578283fd5b61355e87838801613049565b94506020860135915080821115613573578283fd5b61357f87838801613049565b93506040860135915080821115613594578283fd5b5061351e868287016130cd565b6000602082840312156135b2578081fd5b5035919050565b600080604083850312156135cb578182fd5b8235915061312f60208401612fe4565b6000602082840312156135ec578081fd5b813561210481613fc9565b600060208284031215613608578081fd5b815161210481613fc9565b600060208284031215613624578081fd5b81356001600160401b03811115613639578182fd5b8201601f81018413613649578182fd5b61365884823560208401612f87565b949350505050565b600080600060608486031215613674578081fd5b8335925061368460208501612fe4565b9150604084013590509250925092565b6000806000806000606086880312156136ab578283fd5b8535945060208601356001600160401b03808211156136c8578485fd5b6136d489838a01613000565b909650945060408801359150808211156136ec578283fd5b506136f988828901613000565b969995985093965092949392505050565b6000806040838503121561371c578182fd5b50508035926020909101359150565b60008060006060848603121561373f578081fd5b833592506020840135915061375660408501612fe4565b90509250925092565b60008060008060808587031215613774578182fd5b843593506020850135925061378b604086016130bd565b9150613799606086016130bd565b905092959194509250565b81835260006020808501945082825b858110156137df576001600160a01b036137cc83612fe4565b16875295820195908201906001016137b3565b509495945050505050565b81835260006001600160fb1b03831115613802578081fd5b8260051b80836020870137939093016020019283525090919050565b6000815180845260208085019450808401835b838110156137df57815187529582019590820190600101613831565b60008151808452613865816020860160208601613e4f565b601f01601f19169290920160200192915050565b6000815461388681613e7b565b6001828116801561389e57600181146138af576138de565b60ff198416875282870194506138de565b8560005260208060002060005b858110156138d55781548a8201529084019082016138bc565b50505082870194505b5050505092915050565b600082516138fa818460208701613e4f565b9190910192915050565b60008351613916818460208801613e4f565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b60006139478286613879565b8451613957818360208901613e4f565b61396381830186613879565b979650505050505050565b6001600160a01b0384811682528316602082015260606040820181905260009061399a9083018461384d565b95945050505050565b6001600160a01b0386811682528516602082015260a0604082018190526000906139cf9083018661381e565b82810360608401526139e1818661381e565b90508281036080840152610c4d818561384d565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906139639083018461384d565b602081526000612104602083018461381e565b604081526000613a55604083018561381e565b828103602084015261399a818561381e565b602081526000612104602083018461384d565b60006020808352818454613a8d81613e7b565b80848701526040600180841660008114613aae5760018114613ac257613aed565b60ff19851689840152606089019550613aed565b898852868820885b85811015613ae55781548b8201860152908301908801613aca565b8a0184019650505b509398975050505050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6020808252603b908201527f4d696e74696e6720776f756c642065786365656420746865206d6178206e756d60408201527f626572206f66206974656d7320666f7220676976656e20747970650000000000606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b858152606060208201526000613d596060830186886137a4565b8281036040840152610c4d8185876137ea565b858152606060208201526000613d866060830186886137ea565b8281036040840152610c4d8185876137a4565b60006001600160401b03821115613db257613db2613f13565b5060051b60200190565b60008219821115613dcf57613dcf613efd565b500190565b600060ff821660ff84168060ff03821115613df157613df1613efd565b019392505050565b600082613e1457634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615613e3357613e33613efd565b500290565b600082821015613e4a57613e4a613efd565b500390565b60005b83811015613e6a578181015183820152602001613e52565b838111156113e85750506000910152565b600181811c90821680613e8f57607f821691505b60208210811415613eb057634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f191681016001600160401b0381118282101715613edb57613edb613f13565b6040525050565b6000600019821415613ef657613ef6613efd565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d111561200557600481823e5160e01c90565b600060443d1015613f4e5790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715613f7d57505050505090565b8285019150815181811115613f955750505050505090565b843d8701016020828501011115613faf5750505050505090565b613fbe60208286010187613eb6565b509095945050505050565b6001600160e01b031981168114613fdf57600080fd5b5056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a2646970667358221220ab02c81ff4cef595a8ae8342f3814fc7c73c0c08252ddecca6d801b6fd5901c264736f6c63430008040033454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c742900000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000007446967696d6f6e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007444947494d4f4e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006368747470733a2f2f6d657461646174612e61726b616e652e6e6574776f726b2f6170692f617070732f30303630386231332d343334332d343233342d383232382d6330393463633465653264612f636f6e7472616374732f35372f6d657461646174610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006268747470733a2f2f6d657461646174612e61726b616e652e6e6574776f726b2f6170692f617070732f30303630386231332d343334332d343233342d383232382d6330393463633465653264612f636f6e7472616374732f35372f746f6b656e732f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000092f6d657461646174610000000000000000000000000000000000000000000000
Deployed ByteCode Sourcemap
62229:2284:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40615:231;;;;;;;;;;-1:-1:-1;40615:231:0;;;;;:::i;:::-;;:::i;:::-;;;21370:25:1;;;21358:2;21343:18;40615:231:0;;;;;;;;63054:412;;;;;;;;;;-1:-1:-1;63054:412:0;;;;;:::i;:::-;;:::i;:::-;;;21197:14:1;;21190:22;21172:41;;21160:2;21145:18;63054:412:0;21127:92:1;62277:18:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;22583:1139::-;;;;;;:::i;:::-;;:::i;63761:166::-;;;;;;;;;;-1:-1:-1;63761:166:0;;;;;:::i;:::-;;:::i;56765:48::-;;;;;;;;;;-1:-1:-1;56765:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;19877:43;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;19877:43:0;;;;;60327:435;;;;;;;;;;-1:-1:-1;60327:435:0;;;;;:::i;:::-;;:::i;:::-;;62923:121;;;;;;;;;;-1:-1:-1;62923:121:0;;;;;:::i;:::-;;:::i;20879:101::-;;;;;;;;;;-1:-1:-1;20957:15:0;;20879:101;;55415:111;;;;;;;;;;-1:-1:-1;55415:111:0;;;;;:::i;:::-;;:::i;15784:123::-;;;;;;;;;;-1:-1:-1;15784:123:0;;;;;:::i;:::-;15850:7;15877:12;;;:6;:12;;;;;:22;;;;15784:123;24104:107;;;;;;;;;;-1:-1:-1;24104:107:0;;;;;:::i;:::-;-1:-1:-1;;;;;24191:12:0;24157:13;24191:12;;;:6;:12;;;;;;;24104:107;43286:1227;;;;;;;;;;-1:-1:-1;43286:1227:0;;;;;:::i;:::-;;:::i;16169:232::-;;;;;;;;;;-1:-1:-1;16169:232:0;;;;;:::i;:::-;;:::i;20988:161::-;;;;;;;;;;-1:-1:-1;21102:9:0;20988:161;;17388:218;;;;;;;;;;-1:-1:-1;17388:218:0;;;;;:::i;:::-;;:::i;41012:529::-;;;;;;;;;;-1:-1:-1;41012:529:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;62359:23::-;;;;;;;;;;;;;:::i;55814:151::-;;;;;;;;;;-1:-1:-1;55814:151:0;;;;;:::i;:::-;;:::i;62329:23::-;;;;;;;;;;;;;:::i;57650:577::-;;;;;;;;;;-1:-1:-1;57650:577:0;;;;;:::i;:::-;;:::i;56707:51::-;;;;;;;;;;-1:-1:-1;56707:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;62794:121;;;;;;;;;;-1:-1:-1;62794:121:0;;;;;:::i;:::-;;:::i;15456:139::-;;;;;;;;;;-1:-1:-1;15456:139:0;;;;;:::i;:::-;;:::i;63474:122::-;;;;;;;;;;-1:-1:-1;63474:122:0;;;;;:::i;:::-;;:::i;61753:467::-;;;;;;;;;;-1:-1:-1;61753:467:0;;;;;:::i;:::-;;:::i;62302:20::-;;;;;;;;;;;;;:::i;61186:364::-;;;;;;;;;;-1:-1:-1;61186:364:0;;;;;:::i;:::-;;:::i;13916:49::-;;;;;;;;;;-1:-1:-1;13916:49:0;13961:4;13916:49;;41614:311;;;;;;;;;;-1:-1:-1;41614:311:0;;;;;:::i;:::-;;:::i;53227:68::-;;;;;;;;;;;;53268:27;53227:68;;56874:47;;;;;;;;;;-1:-1:-1;56874:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;58901:212;;;;;;;;;;-1:-1:-1;58901:212:0;;;;;:::i;:::-;;:::i;56820:47::-;;;;;;;;;;-1:-1:-1;56820:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;59900:419;;;;;;;;;;-1:-1:-1;59900:419:0;;;;;:::i;:::-;;:::i;54660:471::-;;;;;;;;;;-1:-1:-1;54660:471:0;;;;;:::i;:::-;;:::i;56928:40::-;;;;;;;;;;-1:-1:-1;56928:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;16646:235;;;;;;;;;;-1:-1:-1;16646:235:0;;;;;:::i;:::-;;:::i;63604:89::-;;;;;;;;;;;;;:::i;41997:168::-;;;;;;;;;;-1:-1:-1;41997:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;42120:27:0;;;42096:4;42120:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;41997:168;42237:972;;;;;;;;;;-1:-1:-1;42237:972:0;;;;;:::i;:::-;;:::i;60770:112::-;;;;;;;;;;-1:-1:-1;60770:112:0;;;;;:::i;:::-;60832:7;60859:15;;;:11;:15;;;;;;;60770:112;59677:215;;;;;;;;;;-1:-1:-1;59677:215:0;;;;;:::i;:::-;;:::i;56648:52::-;;;;;;;;;;-1:-1:-1;56648:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;40615:231;40701:7;-1:-1:-1;;;;;40729:21:0;;40721:77;;;;-1:-1:-1;;;40721:77:0;;25420:2:1;40721:77:0;;;25402:21:1;25459:2;25439:18;;;25432:30;25498:34;25478:18;;;25471:62;-1:-1:-1;;;25549:18:1;;;25542:41;25600:19;;40721:77:0;;;;;;;;;-1:-1:-1;40816:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;40816:22:0;;;;;;;;;;;;40615:231::o;63054:412::-;63153:4;-1:-1:-1;;;;;;63177:47:0;;-1:-1:-1;;;63177:47:0;;:100;;-1:-1:-1;;;;;;;63237:40:0;;-1:-1:-1;;;63237:40:0;63177:100;:154;;;-1:-1:-1;;;;;;;63290:41:0;;-1:-1:-1;;;63290:41:0;63177:154;:219;;;-1:-1:-1;;;;;;;63344:52:0;;-1:-1:-1;;;63344:52:0;63177:219;:281;;;-1:-1:-1;;;;;;;63409:49:0;;-1:-1:-1;;;63409:49:0;63177:281;63170:288;63054:412;-1:-1:-1;;63054:412:0:o;62277:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22583:1139::-;22841:140;;;22784:12;22841:140;;;;;-1:-1:-1;;;;;22875:19:0;;22809:29;22875:19;;;:6;:19;;;;;;;;;22841:140;;;;;;;;;;;23016:45;22882:11;22841:140;23044:4;23050;23056;23016:6;:45::i;:::-;22994:128;;;;-1:-1:-1;;;22994:128:0;;32497:2:1;22994:128:0;;;32479:21:1;32536:2;32516:18;;;32509:30;32575:34;32555:18;;;32548:62;-1:-1:-1;;;32626:18:1;;;32619:31;32667:19;;22994:128:0;32469:223:1;22994:128:0;-1:-1:-1;;;;;23211:19:0;;;;;;:6;:19;;;;;;:26;;23235:1;23211:23;:26::i;:::-;-1:-1:-1;;;;;23189:19:0;;;;;;:6;:19;;;;;;;:48;;;;23255:126;;;;;23196:11;;23327:10;;23353:17;;23255:126;:::i;:::-;;;;;;;;23492:12;23506:23;23541:4;-1:-1:-1;;;;;23533:18:0;23583:17;23602:11;23566:48;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;23566:48:0;;;;;;;;;;23533:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23491:134;;;;23644:7;23636:48;;;;-1:-1:-1;;;23636:48:0;;25832:2:1;23636:48:0;;;25814:21:1;25871:2;25851:18;;;25844:30;25910;25890:18;;;25883:58;25958:18;;23636:48:0;25804:178:1;23636:48:0;23704:10;22583:1139;-1:-1:-1;;;;;;;;22583:1139:0:o;63761:166::-;63821:13;63878:9;63889:17;63898:7;63889:8;:17::i;:::-;63908:9;63861:57;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63847:72;;63761:166;;;:::o;60327:435::-;13961:4;19424:27;13961:4;19438:12;:10;:12::i;19424:27::-;19466:10;19402:85;;;;;-1:-1:-1;;;19402:85:0;;;;;;;;:::i;:::-;-1:-1:-1;60478:33:0;;::::1;60470:93;;;::::0;-1:-1:-1;;;60470:93:0;;28551:2:1;60470:93:0::1;::::0;::::1;28533:21:1::0;28590:2;28570:18;;;28563:30;28629:34;28609:18;;;28602:62;-1:-1:-1;;;28680:18:1;;;28673:45;28735:19;;60470:93:0::1;28523:237:1::0;60470:93:0::1;60579:9;60574:119;60594:19:::0;;::::1;60574:119;;;60635:46;60649:6;60657:8;;60666:1;60657:11;;;;;-1:-1:-1::0;;;60657:11:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60670:7;;60678:1;60670:10;;;;;-1:-1:-1::0;;;60670:10:0::1;;;;;;;;;;;;;;;60635:13;:46::i;:::-;60615:3;::::0;::::1;:::i;:::-;;;60574:119;;;;60708:46;60728:6;60736:8;;60746:7;;60708:46;;;;;;;;;;:::i;:::-;;;;;;;;60327:435:::0;;;;;;:::o;62923:121::-;13961:4;19424:27;13961:4;19438:12;:10;:12::i;19424:27::-;19466:10;19402:85;;;;;-1:-1:-1;;;19402:85:0;;;;;;;;:::i;:::-;-1:-1:-1;63014:22:0;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;62923:121:::0;;:::o;55415:111::-;55487:31;55493:12;:10;:12::i;:::-;55507:2;55511:6;55487:5;:31::i;:::-;55415:111;;:::o;43286:1227::-;43539:7;:14;43525:3;:10;:28;43517:81;;;;-1:-1:-1;;;43517:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43617:16:0;;43609:66;;;;-1:-1:-1;;;43609:66:0;;;;;;;:::i;:::-;43716:12;:10;:12::i;:::-;-1:-1:-1;;;;;43708:20:0;:4;-1:-1:-1;;;;;43708:20:0;;:60;;;;43732:36;43749:4;43755:12;:10;:12::i;43732:36::-;43686:160;;;;-1:-1:-1;;;43686:160:0;;30556:2:1;43686:160:0;;;30538:21:1;30595:2;30575:18;;;30568:30;30634:34;30614:18;;;30607:62;-1:-1:-1;;;30685:18:1;;;30678:48;30743:19;;43686:160:0;30528:240:1;43686:160:0;43859:16;43878:12;:10;:12::i;:::-;43859:31;;43981:9;43976:377;44000:3;:10;43996:1;:14;43976:377;;;44032:10;44045:3;44049:1;44045:6;;;;;;-1:-1:-1;;;44045:6:0;;;;;;;;;;;;;;;44032:19;;44066:14;44083:7;44091:1;44083:10;;;;;;-1:-1:-1;;;44083:10:0;;;;;;;;;;;;;;;;;;;;44110:19;44132:13;;;;;;;;;;-1:-1:-1;;;;;44132:19:0;;;;;;;;;;;;44083:10;;-1:-1:-1;44174:21:0;;;;44166:76;;;;-1:-1:-1;;;44166:76:0;;;;;;;:::i;:::-;44279:20;44293:6;44279:11;:20;:::i;:::-;44257:9;:13;44267:2;44257:13;;;;;;;;;;;:19;44271:4;-1:-1:-1;;;;;44257:19:0;-1:-1:-1;;;;;44257:19:0;;;;;;;;;;;;:42;;;;44335:6;44314:9;:13;44324:2;44314:13;;;;;;;;;;;:17;44328:2;-1:-1:-1;;;;;44314:17:0;-1:-1:-1;;;;;44314:17:0;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;43976:377;;;44012:3;;;;:::i;:::-;;;43976:377;;;;44400:2;-1:-1:-1;;;;;44370:47:0;44394:4;-1:-1:-1;;;;;44370:47:0;44384:8;-1:-1:-1;;;;;44370:47:0;;44404:3;44409:7;44370:47;;;;;;;:::i;:::-;;;;;;;;44430:75;44466:8;44476:4;44482:2;44486:3;44491:7;44500:4;44430:35;:75::i;:::-;43286:1227;;;;;;:::o;16169:232::-;15850:7;15877:12;;;:6;:12;;;;;:22;;;16262:41;;16270:18;16290:12;:10;:12::i;16262:41::-;16254:101;;;;-1:-1:-1;;;16254:101:0;;25004:2:1;16254:101:0;;;24986:21:1;25043:2;25023:18;;;25016:30;25082:34;25062:18;;;25055:62;-1:-1:-1;;;25133:18:1;;;25126:45;25188:19;;16254:101:0;24976:237:1;16254:101:0;16368:25;16379:4;16385:7;16368:10;:25::i;17388:218::-;17495:12;:10;:12::i;:::-;-1:-1:-1;;;;;17484:23:0;:7;-1:-1:-1;;;;;17484:23:0;;17476:83;;;;-1:-1:-1;;;17476:83:0;;35303:2:1;17476:83:0;;;35285:21:1;35342:2;35322:18;;;35315:30;35381:34;35361:18;;;35354:62;-1:-1:-1;;;35432:18:1;;;35425:45;35487:19;;17476:83:0;35275:237:1;17476:83:0;17572:26;17584:4;17590:7;17572:11;:26::i;41012:529::-;41173:16;41234:3;:10;41215:8;:15;:29;41207:83;;;;-1:-1:-1;;;41207:83:0;;33670:2:1;41207:83:0;;;33652:21:1;33709:2;33689:18;;;33682:30;33748:34;33728:18;;;33721:62;-1:-1:-1;;;33799:18:1;;;33792:39;33848:19;;41207:83:0;33642:231:1;41207:83:0;41303:30;41350:8;:15;-1:-1:-1;;;;;41336:30:0;;;;;-1:-1:-1;;;41336:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41336:30:0;;41303:63;;41384:9;41379:122;41403:8;:15;41399:1;:19;41379:122;;;41459:30;41469:8;41478:1;41469:11;;;;;;-1:-1:-1;;;41469:11:0;;;;;;;;;;;;;;;41482:3;41486:1;41482:6;;;;;;-1:-1:-1;;;41482:6:0;;;;;;;;;;;;;;;41459:9;:30::i;:::-;41440:13;41454:1;41440:16;;;;;;-1:-1:-1;;;41440:16:0;;;;;;;;;;;;;;;;;;:49;41420:3;;;:::i;:::-;;;41379:122;;;-1:-1:-1;41520:13:0;41012:529;-1:-1:-1;;;41012:529:0:o;62359:23::-;;;;;;;:::i;55814:151::-;55919:38;55930:12;:10;:12::i;:::-;55944:3;;55919:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55919:38:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55949:7:0;;-1:-1:-1;55949:7:0;;;;55919:38;;;55949:7;;55919:38;55949:7;55919:38;;;;;;;;;-1:-1:-1;55919:10:0;;-1:-1:-1;;;55919:38:0:i;:::-;55814:151;;;;:::o;62329:23::-;;;;;;;:::i;57650:577::-;13961:4;19424:27;13961:4;19438:12;:10;:12::i;19424:27::-;19466:10;19402:85;;;;;-1:-1:-1;;;19402:85:0;;;;;;;;:::i;:::-;-1:-1:-1;57786:15:0::1;::::0;;;:7:::1;:15;::::0;;;;;::::1;;:24;57778:68;;;::::0;-1:-1:-1;;;57778:68:0;;29384:2:1;57778:68:0::1;::::0;::::1;29366:21:1::0;29423:2;29403:18;;;29396:30;29462:33;29442:18;;;29435:61;29513:18;;57778:68:0::1;29356:181:1::0;57778:68:0::1;57877:1;57865:9;:13;57857:48;;;::::0;-1:-1:-1;;;57857:48:0;;35719:2:1;57857:48:0::1;::::0;::::1;35701:21:1::0;35758:2;35738:18;;;35731:30;-1:-1:-1;;;35777:18:1;;;35770:52;35839:18;;57857:48:0::1;35691:172:1::0;57857:48:0::1;57916:24;::::0;;;:16:::1;:24;::::0;;;;;;;:36;;;57963:14:::1;:22:::0;;;;;:33;;;::::1;::::0;::::1;-1:-1:-1::0;;57963:33:0;;::::1;;::::0;;;58007:14:::1;:22:::0;;;;;:33;;;::::1;;::::0;;::::1;;::::0;;58051:7:::1;:15:::0;;;;;:22;;;;::::1;57963:33:::0;58051:22:::1;::::0;;58084:69:::1;;58112:20;::::0;;;:12:::1;:20;::::0;;;;:29;;;58084:69:::1;58168:51;::::0;;38412:25:1;;;38468:2;38453:18;;38446:34;;;38523:14;;38516:22;38496:18;;;38489:50;38582:14;;38575:22;38570:2;38555:18;;38548:50;58168:51:0;;::::1;::::0;;;;38399:3:1;58168:51:0;;::::1;57650:577:::0;;;;;:::o;62794:121::-;13961:4;19424:27;13961:4;19438:12;:10;:12::i;19424:27::-;19466:10;19402:85;;;;;-1:-1:-1;;;19402:85:0;;;;;;;;:::i;:::-;-1:-1:-1;62885:22:0;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;15456:139::-:0;15534:4;15558:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;15558:29:0;;;;;;;;;;;;;;;15456:139::o;63474:122::-;13961:4;19424:27;13961:4;19438:12;:10;:12::i;19424:27::-;19466:10;19402:85;;;;;-1:-1:-1;;;19402:85:0;;;;;;;;:::i;:::-;-1:-1:-1;63569:19:0;;::::1;::::0;:4:::1;::::0;:19:::1;::::0;::::1;::::0;::::1;:::i;61753:467::-:0;61888:12;:10;:12::i;:::-;-1:-1:-1;;;;;61877:23:0;:7;-1:-1:-1;;;;;61877:23:0;;:66;;;;61904:39;61921:7;61930:12;:10;:12::i;61904:39::-;61855:148;;;;-1:-1:-1;;;61855:148:0;;32899:2:1;61855:148:0;;;32881:21:1;;;32918:18;;;32911:30;32977:34;32957:18;;;32950:62;33029:18;;61855:148:0;32871:182:1;61855:148:0;62019:9;62014:155;62038:3;:10;62034:1;:14;62014:155;;;62078:14;:36;62093:12;:20;62106:3;62110:1;62106:6;;;;;;-1:-1:-1;;;62106:6:0;;;;;;;;;;;;;;;62093:20;;;;;;;;;;;;62078:36;;;;;;;;;;;;;;;;;;;;;:44;;62118:4;62078:44;;;62070:87;;;;-1:-1:-1;;;62070:87:0;;27353:2:1;62070:87:0;;;27335:21:1;27392:2;27372:18;;;27365:30;27431:32;27411:18;;;27404:60;27481:18;;62070:87:0;27325:180:1;62070:87:0;62050:3;;;:::i;:::-;;;62014:155;;;;62179:33;62190:7;62199:3;62204:7;62179:10;:33::i;62302:20::-;;;;;;;:::i;61186:364::-;61271:32;61286:16;;;:12;:16;;;;;;;;;61271:32;;:14;:32;;;;;;;;:40;;:32;:40;61263:83;;;;-1:-1:-1;;;61263:83:0;;27353:2:1;61263:83:0;;;27335:21:1;27392:2;27372:18;;;27365:30;27431:32;27411:18;;;27404:60;27481:18;;61263:83:0;27325:180:1;61263:83:0;61390:12;:10;:12::i;:::-;-1:-1:-1;;;;;61379:23:0;:7;-1:-1:-1;;;;;61379:23:0;;:66;;;;61406:39;61423:7;61432:12;:10;:12::i;61406:39::-;61357:148;;;;-1:-1:-1;;;61357:148:0;;32899:2:1;61357:148:0;;;32881:21:1;;;32918:18;;;32911:30;32977:34;32957:18;;;32950:62;33029:18;;61357:148:0;32871:182:1;61357:148:0;61516:26;61522:7;61531:2;61535:6;61516:5;:26::i;41614:311::-;41733:8;-1:-1:-1;;;;;41717:24:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;41717:24:0;;;41709:78;;;;-1:-1:-1;;;41709:78:0;;33260:2:1;41709:78:0;;;33242:21:1;33299:2;33279:18;;;33272:30;33338:34;33318:18;;;33311:62;-1:-1:-1;;;33389:18:1;;;33382:39;33438:19;;41709:78:0;33232:231:1;41709:78:0;41845:8;41800:18;:32;41819:12;:10;:12::i;:::-;-1:-1:-1;;;;;41800:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;41800:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;41800:53:0;;;;;;;;;;;41884:12;:10;:12::i;:::-;-1:-1:-1;;;;;41869:48:0;;41908:8;41869:48;;;;21197:14:1;21190:22;21172:41;;21160:2;21145:18;;21127:92;41869:48:0;;;;;;;;41614:311;;:::o;58901:212::-;13961:4;19424:27;13961:4;19438:12;:10;:12::i;19424:27::-;19466:10;19402:85;;;;;-1:-1:-1;;;19402:85:0;;;;;;;;:::i;:::-;;59014:37:::1;59031:6;59039:2;59043:7;59014:16;:37::i;:::-;59067:38;::::0;;38045:25:1;;;38101:2;38086:18;;38079:34;;;-1:-1:-1;;;;;38149:32:1;;38129:18;;;38122:60;;;;59067:38:0::1;::::0;38033:2:1;38018:18;59067:38:0::1;;;;;;;;58901:212:::0;;;;:::o;59900:419::-;13961:4;19424:27;13961:4;19438:12;:10;:12::i;19424:27::-;19466:10;19402:85;;;;;-1:-1:-1;;;19402:85:0;;;;;;;;:::i;:::-;-1:-1:-1;60050:29:0;;::::1;60042:85;;;::::0;-1:-1:-1;;;60042:85:0;;34891:2:1;60042:85:0::1;::::0;::::1;34873:21:1::0;34930:2;34910:18;;;34903:30;34969:34;34949:18;;;34942:62;-1:-1:-1;;;35020:18:1;;;35013:41;35071:19;;60042:85:0::1;34863:233:1::0;60042:85:0::1;60143:9;60138:113;60158:14:::0;;::::1;60138:113;;;60194:45;60211:6;60219:3;;60223:1;60219:6;;;;;-1:-1:-1::0;;;60219:6:0::1;;;;;;;;;;;;;;;60227:8;;60236:1;60227:11;;;;;-1:-1:-1::0;;;60227:11:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60194:16;:45::i;:::-;60174:3;::::0;::::1;:::i;:::-;;;60138:113;;;;60266:45;60289:6;60297:3;;60302:8;;60266:45;;;;;;;;;;:::i;54660:471::-:0;53268:27;19424;19432:4;19438:12;:10;:12::i;19424:27::-;19466:10;19402:85;;;;;-1:-1:-1;;;19402:85:0;;;;;;;;:::i;:::-;-1:-1:-1;54800:20:0::1;::::0;;54897:54:::1;::::0;;::::1;54908:11:::0;54897:54:::1;:::i;:::-;54789:162:::0;;-1:-1:-1;54789:162:0;-1:-1:-1;54789:162:0;-1:-1:-1;;;;;;54986:18:0;::::1;54964:110;;;::::0;-1:-1:-1;;;54964:110:0;;28140:2:1;54964:110:0::1;::::0;::::1;28122:21:1::0;28179:2;28159:18;;;28152:30;28218:34;28198:18;;;28191:62;-1:-1:-1;;;28269:18:1;;;28262:40;28319:19;;54964:110:0::1;28112:232:1::0;54964:110:0::1;55087:36;55098:4;55104:3;55109:7;55118:4;55087:10;:36::i;:::-;19498:1;;;54660:471:::0;;;;:::o;16646:235::-;15850:7;15877:12;;;:6;:12;;;;;:22;;;16740:41;;16748:18;15784:123;16740:41;16732:102;;;;-1:-1:-1;;;16732:102:0;;28967:2:1;16732:102:0;;;28949:21:1;29006:2;28986:18;;;28979:30;29045:34;29025:18;;;29018:62;-1:-1:-1;;;29096:18:1;;;29089:46;29152:19;;16732:102:0;28939:238:1;63604:89:0;63648:13;63681:4;63674:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63604:89;:::o;42237:972::-;-1:-1:-1;;;;;42451:16:0;;42443:66;;;;-1:-1:-1;;;42443:66:0;;;;;;;:::i;:::-;42550:12;:10;:12::i;:::-;-1:-1:-1;;;;;42542:20:0;:4;-1:-1:-1;;;;;42542:20:0;;:60;;;;42566:36;42583:4;42589:12;:10;:12::i;42566:36::-;42520:151;;;;-1:-1:-1;;;42520:151:0;;26594:2:1;42520:151:0;;;26576:21:1;26633:2;26613:18;;;26606:30;26672:34;26652:18;;;26645:62;-1:-1:-1;;;26723:18:1;;;26716:39;26772:19;;42520:151:0;26566:231:1;42520:151:0;42684:16;42703:12;:10;:12::i;:::-;42684:31;;42728:96;42749:8;42759:4;42765:2;42769:21;42787:2;42769:17;:21::i;:::-;42792:25;42810:6;42792:17;:25::i;:::-;43286:1227;;;;;;42728:96;42837:19;42859:13;;;;;;;;;;;-1:-1:-1;;;;;42859:19:0;;;;;;;;;;42897:21;;;;42889:76;;;;-1:-1:-1;;;42889:76:0;;;;;;;:::i;:::-;42998:20;43012:6;42998:11;:20;:::i;:::-;42976:9;:13;;;;;;;;;;;-1:-1:-1;;;;;42976:19:0;;;;;;;;;;:42;;;;43029:17;;;;;;;:27;;43050:6;;42976:9;43029:27;;43050:6;;43029:27;:::i;:::-;;;;-1:-1:-1;;43074:46:0;;;37764:25:1;;;37820:2;37805:18;;37798:34;;;-1:-1:-1;;;;;43074:46:0;;;;;;;;;;;;;;37737:18:1;43074:46:0;;;;;;;43133:68;43164:8;43174:4;43180:2;43184;43188:6;43196:4;43133:30;:68::i;59677:215::-;13961:4;19424:27;13961:4;19438:12;:10;:12::i;19424:27::-;19466:10;19402:85;;;;;-1:-1:-1;;;19402:85:0;;;;;;;;:::i;:::-;;59791:38:::1;59805:6;59813:7;59822:6;59791:13;:38::i;:::-;59845:39;::::0;;36252:25:1;;;-1:-1:-1;;;;;36313:32:1;;36308:2;36293:18;;36286:60;36362:18;;;36355:34;;;59845:39:0::1;::::0;36240:2:1;36225:18;59845:39:0::1;36207:188:1::0;52470:626:0;52529:22;52573:10;52595:4;52573:27;52569:496;;;52617:18;52638:8;;52617:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;52677:8:0;52880:17;52874:24;-1:-1:-1;;;;;52852:126:0;;-1:-1:-1;52716:277:0;;-1:-1:-1;52716:277:0;;-1:-1:-1;53042:10:0;52569:496;52470:626;:::o;24219:458::-;24397:4;-1:-1:-1;;;;;24422:20:0;;24414:70;;;;-1:-1:-1;;;24414:70:0;;29744:2:1;24414:70:0;;;29726:21:1;29783:2;29763:18;;;29756:30;29822:34;29802:18;;;29795:62;-1:-1:-1;;;29873:18:1;;;29866:35;29918:19;;24414:70:0;29716:227:1;24414:70:0;24530:139;24554:47;24573:27;24593:6;24573:19;:27::i;:::-;24554:18;:47::i;:::-;24530:139;;;;;;;;;;;;22055:25:1;;;;22128:4;22116:17;;22096:18;;;22089:45;22150:18;;;22143:34;;;22193:18;;;22186:34;;;22027:19;;24530:139:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24511:158:0;:6;-1:-1:-1;;;;;24511:158:0;;24495:174;;24219:458;;;;;;;:::o;7924:98::-;7982:7;8009:5;8013:1;8009;:5;:::i;:::-;8002:12;7924:98;-1:-1:-1;;;7924:98:0:o;63935:573::-;63985:27;64029:7;64025:50;;-1:-1:-1;;64053:10:0;;;;;;;;;;;;-1:-1:-1;;;64053:10:0;;;;;63935:573::o;64025:50::-;64094:2;64085:6;64126:69;64133:6;;64126:69;;64156:5;;;;:::i;:::-;;-1:-1:-1;64176:7:0;;-1:-1:-1;64181:2:0;64176:7;;:::i;:::-;;;64126:69;;;64205:17;64235:3;-1:-1:-1;;;;;64225:14:0;;;;;-1:-1:-1;;;64225:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64225:14:0;-1:-1:-1;64205:34:0;-1:-1:-1;64259:3:0;64273:198;64280:7;;64273:198;;64308:3;64310:1;64308;:3;:::i;:::-;64304:7;-1:-1:-1;64326:10:0;64356:7;64361:2;64356;:7;:::i;:::-;:12;;64366:2;64356:12;:::i;:::-;64351:17;;:2;:17;:::i;:::-;64340:29;;:2;:29;:::i;:::-;64326:44;;64385:9;64404:4;64397:12;;64385:24;;64434:2;64424:4;64429:1;64424:7;;;;;;-1:-1:-1;;;64424:7:0;;;;;;;;;;;;:12;-1:-1:-1;;;;;64424:12:0;;;;;;;;-1:-1:-1;64451:8:0;64457:2;64451:8;;:::i;:::-;;;64273:198;;;;;-1:-1:-1;64495:4:0;63935:573;-1:-1:-1;;;;63935:573:0:o;54103:153::-;54177:22;54224:24;:22;:24::i;:::-;54217:31;;54103:153;:::o;59121:548::-;13961:4;19424:27;13961:4;19438:12;:10;:12::i;19424:27::-;19466:10;19402:85;;;;;-1:-1:-1;;;19402:85:0;;;;;;;;:::i;:::-;;59255:1:::1;59246:6;:10;59238:19;;;::::0;::::1;;59285:1;59276:6;:10;59268:43;;;::::0;-1:-1:-1;;;59268:43:0;;27004:2:1;59268:43:0::1;::::0;::::1;26986:21:1::0;27043:2;27023:18;;;27016:30;-1:-1:-1;;;27062:18:1;;;27055:50;27122:18;;59268:43:0::1;26976:170:1::0;59268:43:0::1;59369:24;::::0;;;:16:::1;:24;::::0;;;;;;;;59330:15:::1;:23:::0;;;;;;;:35:::1;::::0;59358:6;59330:27:::1;:35::i;:::-;:63;;59322:135;;;;-1:-1:-1::0;;;59322:135:0::1;;;;;;;:::i;:::-;59476:22;::::0;;;:14:::1;:22;::::0;;;;;::::1;;:30;;:22:::0;:30:::1;59468:66;;;::::0;-1:-1:-1;;;59468:66:0;;24243:2:1;59468:66:0::1;::::0;::::1;24225:21:1::0;24282:2;24262:18;;;24255:30;24321:25;24301:18;;;24294:53;24364:18;;59468:66:0::1;24215:173:1::0;59468:66:0::1;59545:44;59551:7:::0;59560:6;59568;59586:1:::1;59576:12;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;59576:12:0::1;;59545:5;:44::i;:::-;59626:23;::::0;;;:15:::1;:23;::::0;;;;;:35:::1;::::0;59654:6;59626:27:::1;:35::i;:::-;59600:23;::::0;;;:15:::1;:23;::::0;;;;;:61;;;;-1:-1:-1;;;59121:548:0:o;47706:605::-;-1:-1:-1;;;;;47802:21:0;;47794:69;;;;-1:-1:-1;;;47794:69:0;;;;;;;:::i;:::-;47876:16;47895:12;:10;:12::i;:::-;47876:31;;47920:105;47941:8;47951:7;47968:1;47972:21;47990:2;47972:17;:21::i;:::-;47995:25;48013:6;47995:17;:25::i;:::-;-1:-1:-1;;47920:105:0;;;;;;;;;-1:-1:-1;47920:105:0;;-1:-1:-1;;;43286:1227:0;47920:105;48038:22;48063:13;;;;;;;;;;;-1:-1:-1;;;;;48063:22:0;;;;;;;;;;48104:24;;;;48096:73;;;;-1:-1:-1;;;48096:73:0;;;;;;;:::i;:::-;48205:23;48222:6;48205:14;:23;:::i;:::-;48180:9;:13;;;;;;;;;;;-1:-1:-1;;;;;48180:22:0;;;;;;;;;;;;:48;;;;48246:57;;37764:25:1;;;37805:18;;;37798:34;;;48180:9:0;;48246:57;;;;;37737:18:1;48246:57:0;;;;;;;47706:605;;;;;:::o;51318:795::-;-1:-1:-1;;;;;51568:13:0;;31799:20;31838:8;51564:542;;51604:79;;-1:-1:-1;;;51604:79:0;;-1:-1:-1;;;;;51604:43:0;;;;;:79;;51648:8;;51658:4;;51664:3;;51669:7;;51678:4;;51604:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51604:79:0;;;;;;;;-1:-1:-1;;51604:79:0;;;;;;;;;;;;:::i;:::-;;;51600:495;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;51968:6;51961:14;;-1:-1:-1;;;51961:14:0;;;;;;;;:::i;51600:495::-;;;52017:62;;-1:-1:-1;;;52017:62:0;;23822:2:1;52017:62:0;;;23804:21:1;23861:2;23841:18;;;23834:30;23900:34;23880:18;;;23873:62;-1:-1:-1;;;23951:18:1;;;23944:50;24011:19;;52017:62:0;23794:242:1;51600:495:0;-1:-1:-1;;;;;;51733:64:0;;-1:-1:-1;;;51733:64:0;51729:163;;51822:50;;-1:-1:-1;;;51822:50:0;;;;;;;:::i;18636:229::-;18711:22;18719:4;18725:7;18711;:22::i;:::-;18706:152;;18750:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;18750:29:0;;;;;;;;;:36;;-1:-1:-1;;18750:36:0;18782:4;18750:36;;;18833:12;:10;:12::i;:::-;-1:-1:-1;;;;;18806:40:0;18824:7;-1:-1:-1;;;;;18806:40:0;18818:4;18806:40;;;;;;;;;;18636:229;;:::o;18873:230::-;18948:22;18956:4;18962:7;18948;:22::i;:::-;18944:152;;;19019:5;18987:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;18987:29:0;;;;;;;;;:37;;-1:-1:-1;;18987:37:0;;;19071:12;:10;:12::i;:::-;-1:-1:-1;;;;;19044:40:0;19062:7;-1:-1:-1;;;;;19044:40:0;19056:4;19044:40;;;;;;;;;;18873:230;;:::o;48514:837::-;-1:-1:-1;;;;;48635:21:0;;48627:69;;;;-1:-1:-1;;;48627:69:0;;;;;;;:::i;:::-;48729:7;:14;48715:3;:10;:28;48707:81;;;;-1:-1:-1;;;48707:81:0;;;;;;;:::i;:::-;48801:16;48820:12;:10;:12::i;:::-;48845:69;;;;;;;;;48893:1;48845:69;;48801:31;-1:-1:-1;48932:6:0;48927:341;48948:3;:10;48944:1;:14;48927:341;;;48980:10;48993:3;48997:1;48993:6;;;;;;-1:-1:-1;;;48993:6:0;;;;;;;;;;;;;;;48980:19;;49014:14;49031:7;49039:1;49031:10;;;;;;-1:-1:-1;;;49031:10:0;;;;;;;;;;;;;;;;;;;;49058:22;49083:13;;;;;;;;;;-1:-1:-1;;;;;49083:22:0;;;;;;;;;;;;49031:10;;-1:-1:-1;49128:24:0;;;;49120:73;;;;-1:-1:-1;;;49120:73:0;;;;;;;:::i;:::-;49233:23;49250:6;49233:14;:23;:::i;:::-;49208:9;:13;;;;;;;;;;;-1:-1:-1;;;;;49208:22:0;;;;;;;;;;:48;;;;-1:-1:-1;48960:3:0;;-1:-1:-1;48960:3:0;;;:::i;:::-;;;;48927:341;;;;49326:1;-1:-1:-1;;;;;49285:58:0;49309:7;-1:-1:-1;;;;;49285:58:0;49299:8;-1:-1:-1;;;;;49285:58:0;;49330:3;49335:7;49285:58;;;;;;;:::i;:::-;;;;;;;;48514:837;;;;:::o;58235:658::-;13961:4;19424:27;13961:4;19438:12;:10;:12::i;19424:27::-;19466:10;19402:85;;;;;-1:-1:-1;;;19402:85:0;;;;;;;;:::i;:::-;;58364:1:::1;58359:2;:6;58351:15;;;::::0;::::1;;58419:24;::::0;;;:16:::1;:24;::::0;;;;;;;;58385:15:::1;:23:::0;;;;;;;:30:::1;::::0;58413:1:::1;58385:27;:30::i;:::-;:58;;58377:130;;;;-1:-1:-1::0;;;58377:130:0::1;;;;;;;:::i;:::-;58526:11;::::0;;;:7:::1;:11;::::0;;;;;::::1;;:20;58518:60;;;::::0;-1:-1:-1;;;58518:60:0;;30975:2:1;58518:60:0::1;::::0;::::1;30957:21:1::0;31014:2;30994:18;;;30987:30;31053:29;31033:18;;;31026:57;31100:18;;58518:60:0::1;30947:177:1::0;58518:60:0::1;58597:22;::::0;;;:14:::1;:22;::::0;;;;;::::1;;:31;58589:66;;;::::0;-1:-1:-1;;;58589:66:0;;31331:2:1;58589:66:0::1;::::0;::::1;31313:21:1::0;31370:2;31350:18;;;31343:30;-1:-1:-1;;;31389:18:1;;;31382:52;31451:18;;58589:66:0::1;31303:172:1::0;58589:66:0::1;58666:35;58672:7:::0;58681:2;58685:1:::1;58698;58688:12;::::0;58666:35:::1;58712:11;::::0;;;:7:::1;:11;::::0;;;;;;;:18;;-1:-1:-1;;58712:18:0::1;58726:4;58712:18:::0;;::::1;::::0;;;58767:23;;;:15:::1;:23:::0;;;;;;;:30:::1;::::0;:27:::1;:30::i;:::-;58741:23;::::0;;;:15:::1;:23;::::0;;;;;;;:56;;;58808:16;;;:12:::1;:16:::0;;;;;:25;;;;58862:23;;58844:11:::1;:15:::0;;;;;;;:41;;;;-1:-1:-1;;58235:658:0:o;46758:689::-;-1:-1:-1;;;;;46893:16:0;;46885:62;;;;-1:-1:-1;;;46885:62:0;;;;;;;:::i;:::-;46980:7;:14;46966:3;:10;:28;46958:81;;;;-1:-1:-1;;;46958:81:0;;;;;;;:::i;:::-;47052:16;47071:12;:10;:12::i;:::-;47052:31;;47180:6;47175:100;47196:3;:10;47192:1;:14;47175:100;;;47253:7;47261:1;47253:10;;;;;;-1:-1:-1;;;47253:10:0;;;;;;;;;;;;;;;47228:9;:17;47238:3;47242:1;47238:6;;;;;;-1:-1:-1;;;47238:6:0;;;;;;;;;;;;;;;47228:17;;;;;;;;;;;:21;47246:2;-1:-1:-1;;;;;47228:21:0;-1:-1:-1;;;;;47228:21:0;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;47208:3:0;;-1:-1:-1;47208:3:0;;;:::i;:::-;;;;47175:100;;;;47328:2;-1:-1:-1;;;;;47292:53:0;47324:1;-1:-1:-1;;;;;47292:53:0;47306:8;-1:-1:-1;;;;;47292:53:0;;47332:3;47337:7;47292:53;;;;;;;:::i;:::-;;;;;;;;47358:81;47394:8;47412:1;47416:2;47420:3;47425:7;47434:4;47358:35;:81::i;52121:198::-;52241:16;;;52255:1;52241:16;;;;;;;;;52187;;52216:22;;52241:16;;;;;;;;;;;;-1:-1:-1;52241:16:0;52216:41;;52279:7;52268:5;52274:1;52268:8;;;;;;-1:-1:-1;;;52268:8:0;;;;;;;;;;;;;;;;;;:18;52306:5;52121:198;-1:-1:-1;;52121:198:0:o;50552:758::-;-1:-1:-1;;;;;50777:13:0;;31799:20;31838:8;50773:530;;50813:72;;-1:-1:-1;;;50813:72:0;;-1:-1:-1;;;;;50813:38:0;;;;;:72;;50852:8;;50862:4;;50868:2;;50872:6;;50880:4;;50813:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50813:72:0;;;;;;;;-1:-1:-1;;50813:72:0;;;;;;;;;;;;:::i;:::-;;;50809:483;;;;:::i;:::-;-1:-1:-1;;;;;;50935:59:0;;-1:-1:-1;;;50935:59:0;50931:158;;51019:50;;-1:-1:-1;;;51019:50:0;;;;;;;:::i;23730:366::-;23828:7;21919:100;;;;;;;;;;;;;;;;;21899:127;;;;;;;23966:12;;23997:11;;;;24037:24;;;;;24027:35;;;;;;23893:184;;;;;21637:25:1;;;21693:2;21678:18;;21671:34;;;;-1:-1:-1;;;;;21741:32:1;21736:2;21721:18;;21714:60;21805:2;21790:18;;21783:34;21624:3;21609:19;;21591:232;23893:184:0;;;;;;;;;;;;;23869:219;;;;;;23853:235;;23730:366;;;:::o;21518:234::-;21605:7;21699:20;20957:15;;;20879:101;21699:20;21670:63;;-1:-1:-1;;;21670:63:0;;;18325:27:1;18368:11;;;18361:27;;;;18404:12;;;18397:28;;;18441:12;;21670:63:0;18315:144:1;45846:556:0;-1:-1:-1;;;;;45961:21:0;;45953:67;;;;-1:-1:-1;;;45953:67:0;;;;;;;:::i;:::-;46033:16;46052:12;:10;:12::i;:::-;46033:31;;46077:107;46098:8;46116:1;46120:7;46129:21;46147:2;46129:17;:21::i;46077:107::-;46197:9;:13;;;;;;;;;;;-1:-1:-1;;;;;46197:22:0;;;;;;;;;:32;;46223:6;;46197:9;:32;;46223:6;;46197:32;:::i;:::-;;;;-1:-1:-1;;46245:57:0;;;37764:25:1;;;37820:2;37805:18;;37798:34;;;-1:-1:-1;;;;;46245:57:0;;;;46278:1;;46245:57;;;;;;37737:18:1;46245:57:0;;;;;;;46315:79;46346:8;46364:1;46368:7;46377:2;46381:6;46389:4;46315:30;:79::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:468:1;78:5;-1:-1:-1;;;;;104:6:1;101:30;98:2;;;134:18;;:::i;:::-;183:2;177:9;195:69;252:2;231:15;;-1:-1:-1;;227:29:1;258:4;223:40;177:9;195:69;:::i;:::-;282:6;273:15;;312:6;304;297:22;352:3;343:6;338:3;334:16;331:25;328:2;;;369:1;366;359:12;328:2;419:6;414:3;407:4;399:6;395:17;382:44;474:1;467:4;458:6;450;446:19;442:30;435:41;;88:394;;;;;:::o;487:173::-;555:20;;-1:-1:-1;;;;;604:31:1;;594:42;;584:2;;650:1;647;640:12;584:2;536:124;;;:::o;665:395::-;728:8;738:6;792:3;785:4;777:6;773:17;769:27;759:2;;817:8;807;800:26;759:2;-1:-1:-1;847:20:1;;-1:-1:-1;;;;;879:30:1;;876:2;;;929:8;919;912:26;876:2;973:4;965:6;961:17;949:29;;1033:3;1026:4;1016:6;1013:1;1009:14;1001:6;997:27;993:38;990:47;987:2;;;1050:1;1047;1040:12;987:2;749:311;;;;;:::o;1065:755::-;1119:5;1172:3;1165:4;1157:6;1153:17;1149:27;1139:2;;1194:5;1187;1180:20;1139:2;1234:6;1221:20;1260:4;1283:43;1323:2;1283:43;:::i;:::-;1355:2;1349:9;1367:31;1395:2;1387:6;1367:31;:::i;:::-;1433:18;;;1467:15;;;;-1:-1:-1;1502:15:1;;;1552:1;1548:10;;;1536:23;;1532:32;;1529:41;-1:-1:-1;1526:2:1;;;1587:5;1580;1573:20;1526:2;1613:5;1627:163;1641:2;1638:1;1635:9;1627:163;;;1698:17;;1686:30;;1736:12;;;;1768;;;;1659:1;1652:9;1627:163;;;-1:-1:-1;1808:6:1;;1129:691;-1:-1:-1;;;;;;;1129:691:1:o;1825:160::-;1890:20;;1946:13;;1939:21;1929:32;;1919:2;;1975:1;1972;1965:12;1990:228;2032:5;2085:3;2078:4;2070:6;2066:17;2062:27;2052:2;;2107:5;2100;2093:20;2052:2;2133:79;2208:3;2199:6;2186:20;2179:4;2171:6;2167:17;2133:79;:::i;2223:196::-;2282:6;2335:2;2323:9;2314:7;2310:23;2306:32;2303:2;;;2356:6;2348;2341:22;2303:2;2384:29;2403:9;2384:29;:::i;2424:270::-;2492:6;2500;2553:2;2541:9;2532:7;2528:23;2524:32;2521:2;;;2574:6;2566;2559:22;2521:2;2602:29;2621:9;2602:29;:::i;:::-;2592:39;;2650:38;2684:2;2673:9;2669:18;2650:38;:::i;:::-;2640:48;;2511:183;;;;;:::o;2699:983::-;2853:6;2861;2869;2877;2885;2938:3;2926:9;2917:7;2913:23;2909:33;2906:2;;;2960:6;2952;2945:22;2906:2;2988:29;3007:9;2988:29;:::i;:::-;2978:39;;3036:38;3070:2;3059:9;3055:18;3036:38;:::i;:::-;3026:48;;3125:2;3114:9;3110:18;3097:32;-1:-1:-1;;;;;3189:2:1;3181:6;3178:14;3175:2;;;3210:6;3202;3195:22;3175:2;3238:61;3291:7;3282:6;3271:9;3267:22;3238:61;:::i;:::-;3228:71;;3352:2;3341:9;3337:18;3324:32;3308:48;;3381:2;3371:8;3368:16;3365:2;;;3402:6;3394;3387:22;3365:2;3430:63;3485:7;3474:8;3463:9;3459:24;3430:63;:::i;:::-;3420:73;;3546:3;3535:9;3531:19;3518:33;3502:49;;3576:2;3566:8;3563:16;3560:2;;;3597:6;3589;3582:22;3560:2;;3625:51;3668:7;3657:8;3646:9;3642:24;3625:51;:::i;:::-;3615:61;;;2896:786;;;;;;;;:::o;3687:626::-;3791:6;3799;3807;3815;3823;3876:3;3864:9;3855:7;3851:23;3847:33;3844:2;;;3898:6;3890;3883:22;3844:2;3926:29;3945:9;3926:29;:::i;:::-;3916:39;;3974:38;4008:2;3997:9;3993:18;3974:38;:::i;:::-;3964:48;;4059:2;4048:9;4044:18;4031:32;4021:42;;4110:2;4099:9;4095:18;4082:32;4072:42;;4165:3;4154:9;4150:19;4137:33;-1:-1:-1;;;;;4185:6:1;4182:30;4179:2;;;4230:6;4222;4215:22;4179:2;4258:49;4299:7;4290:6;4279:9;4275:22;4258:49;:::i;4318:264::-;4383:6;4391;4444:2;4432:9;4423:7;4419:23;4415:32;4412:2;;;4465:6;4457;4450:22;4412:2;4493:29;4512:9;4493:29;:::i;:::-;4483:39;;4541:35;4572:2;4561:9;4557:18;4541:35;:::i;4587:715::-;4666:6;4674;4682;4735:2;4723:9;4714:7;4710:23;4706:32;4703:2;;;4756:6;4748;4741:22;4703:2;4784:29;4803:9;4784:29;:::i;:::-;4774:39;;4864:2;4853:9;4849:18;4836:32;-1:-1:-1;;;;;4928:2:1;4920:6;4917:14;4914:2;;;4949:6;4941;4934:22;4914:2;4992:6;4981:9;4977:22;4967:32;;5037:7;5030:4;5026:2;5022:13;5018:27;5008:2;;5064:6;5056;5049:22;5008:2;5109;5096:16;5135:2;5127:6;5124:14;5121:2;;;5156:6;5148;5141:22;5121:2;5206:7;5201:2;5192:6;5188:2;5184:15;5180:24;5177:37;5174:2;;;5232:6;5224;5217:22;5174:2;5268;5264;5260:11;5250:21;;5290:6;5280:16;;;;;4693:609;;;;;:::o;5307:719::-;5409:6;5417;5425;5433;5441;5494:3;5482:9;5473:7;5469:23;5465:33;5462:2;;;5516:6;5508;5501:22;5462:2;5544:29;5563:9;5544:29;:::i;:::-;5534:39;;5624:2;5613:9;5609:18;5596:32;-1:-1:-1;;;;;5643:6:1;5640:30;5637:2;;;5688:6;5680;5673:22;5637:2;5716:49;5757:7;5748:6;5737:9;5733:22;5716:49;:::i;:::-;5706:59;;;5812:2;5801:9;5797:18;5784:32;5774:42;;5863:2;5852:9;5848:18;5835:32;5825:42;;5917:3;5906:9;5902:19;5889:33;5962:4;5955:5;5951:16;5944:5;5941:27;5931:2;;5987:6;5979;5972:22;5931:2;6015:5;6005:15;;;5452:574;;;;;;;;:::o;6031:264::-;6099:6;6107;6160:2;6148:9;6139:7;6135:23;6131:32;6128:2;;;6181:6;6173;6166:22;6128:2;6209:29;6228:9;6209:29;:::i;:::-;6199:39;6285:2;6270:18;;;;6257:32;;-1:-1:-1;;;6118:177:1:o;6300:1274::-;6418:6;6426;6479:2;6467:9;6458:7;6454:23;6450:32;6447:2;;;6500:6;6492;6485:22;6447:2;6545:9;6532:23;-1:-1:-1;;;;;6615:2:1;6607:6;6604:14;6601:2;;;6636:6;6628;6621:22;6601:2;6679:6;6668:9;6664:22;6654:32;;6724:7;6717:4;6713:2;6709:13;6705:27;6695:2;;6751:6;6743;6736:22;6695:2;6792;6779:16;6814:4;6837:43;6877:2;6837:43;:::i;:::-;6909:2;6903:9;6921:31;6949:2;6941:6;6921:31;:::i;:::-;6987:18;;;7021:15;;;;-1:-1:-1;7056:11:1;;;7098:1;7094:10;;;7086:19;;7082:28;;7079:41;-1:-1:-1;7076:2:1;;;7138:6;7130;7123:22;7076:2;7165:6;7156:15;;7180:169;7194:2;7191:1;7188:9;7180:169;;;7251:23;7270:3;7251:23;:::i;:::-;7239:36;;7212:1;7205:9;;;;;7295:12;;;;7327;;7180:169;;;-1:-1:-1;7368:6:1;-1:-1:-1;;7412:18:1;;7399:32;;-1:-1:-1;;7443:16:1;;;7440:2;;;7477:6;7469;7462:22;7440:2;;7505:63;7560:7;7549:8;7538:9;7534:24;7505:63;:::i;:::-;7495:73;;;6437:1137;;;;;:::o;7579:803::-;7701:6;7709;7717;7725;7778:2;7766:9;7757:7;7753:23;7749:32;7746:2;;;7799:6;7791;7784:22;7746:2;7844:9;7831:23;-1:-1:-1;;;;;7914:2:1;7906:6;7903:14;7900:2;;;7935:6;7927;7920:22;7900:2;7979:70;8041:7;8032:6;8021:9;8017:22;7979:70;:::i;:::-;8068:8;;-1:-1:-1;7953:96:1;-1:-1:-1;8156:2:1;8141:18;;8128:32;;-1:-1:-1;8172:16:1;;;8169:2;;;8206:6;8198;8191:22;8169:2;;8250:72;8314:7;8303:8;8292:9;8288:24;8250:72;:::i;:::-;7736:646;;;;-1:-1:-1;8341:8:1;-1:-1:-1;;;;7736:646:1:o;8387:699::-;8514:6;8522;8530;8583:2;8571:9;8562:7;8558:23;8554:32;8551:2;;;8604:6;8596;8589:22;8551:2;8649:9;8636:23;-1:-1:-1;;;;;8719:2:1;8711:6;8708:14;8705:2;;;8740:6;8732;8725:22;8705:2;8768:61;8821:7;8812:6;8801:9;8797:22;8768:61;:::i;:::-;8758:71;;8848:38;8882:2;8871:9;8867:18;8848:38;:::i;:::-;8838:48;;8939:2;8928:9;8924:18;8911:32;8895:48;;8968:2;8958:8;8955:16;8952:2;;;8989:6;8981;8974:22;8952:2;;9017:63;9072:7;9061:8;9050:9;9046:24;9017:63;:::i;:::-;9007:73;;;8541:545;;;;;:::o;9091:833::-;9227:6;9235;9243;9296:2;9284:9;9275:7;9271:23;9267:32;9264:2;;;9317:6;9309;9302:22;9264:2;9362:9;9349:23;-1:-1:-1;;;;;9432:2:1;9424:6;9421:14;9418:2;;;9453:6;9445;9438:22;9418:2;9481:61;9534:7;9525:6;9514:9;9510:22;9481:61;:::i;:::-;9471:71;;9595:2;9584:9;9580:18;9567:32;9551:48;;9624:2;9614:8;9611:16;9608:2;;;9645:6;9637;9630:22;9608:2;9673:63;9728:7;9717:8;9706:9;9702:24;9673:63;:::i;:::-;9663:73;;9789:2;9778:9;9774:18;9761:32;9745:48;;9818:2;9808:8;9805:16;9802:2;;;9839:6;9831;9824:22;9802:2;;9867:51;9910:7;9899:8;9888:9;9884:24;9867:51;:::i;9929:190::-;9988:6;10041:2;10029:9;10020:7;10016:23;10012:32;10009:2;;;10062:6;10054;10047:22;10009:2;-1:-1:-1;10090:23:1;;9999:120;-1:-1:-1;9999:120:1:o;10124:264::-;10192:6;10200;10253:2;10241:9;10232:7;10228:23;10224:32;10221:2;;;10274:6;10266;10259:22;10221:2;10315:9;10302:23;10292:33;;10344:38;10378:2;10367:9;10363:18;10344:38;:::i;10393:255::-;10451:6;10504:2;10492:9;10483:7;10479:23;10475:32;10472:2;;;10525:6;10517;10510:22;10472:2;10569:9;10556:23;10588:30;10612:5;10588:30;:::i;10653:259::-;10722:6;10775:2;10763:9;10754:7;10750:23;10746:32;10743:2;;;10796:6;10788;10781:22;10743:2;10833:9;10827:16;10852:30;10876:5;10852:30;:::i;10917:480::-;10986:6;11039:2;11027:9;11018:7;11014:23;11010:32;11007:2;;;11060:6;11052;11045:22;11007:2;11105:9;11092:23;-1:-1:-1;;;;;11130:6:1;11127:30;11124:2;;;11175:6;11167;11160:22;11124:2;11203:22;;11256:4;11248:13;;11244:27;-1:-1:-1;11234:2:1;;11290:6;11282;11275:22;11234:2;11318:73;11383:7;11378:2;11365:16;11360:2;11356;11352:11;11318:73;:::i;:::-;11308:83;10997:400;-1:-1:-1;;;;10997:400:1:o;11597:332::-;11674:6;11682;11690;11743:2;11731:9;11722:7;11718:23;11714:32;11711:2;;;11764:6;11756;11749:22;11711:2;11805:9;11792:23;11782:33;;11834:38;11868:2;11857:9;11853:18;11834:38;:::i;:::-;11824:48;;11919:2;11908:9;11904:18;11891:32;11881:42;;11701:228;;;;;:::o;11934:871::-;12065:6;12073;12081;12089;12097;12150:2;12138:9;12129:7;12125:23;12121:32;12118:2;;;12171:6;12163;12156:22;12118:2;12212:9;12199:23;12189:33;;12273:2;12262:9;12258:18;12245:32;-1:-1:-1;;;;;12337:2:1;12329:6;12326:14;12323:2;;;12358:6;12350;12343:22;12323:2;12402:70;12464:7;12455:6;12444:9;12440:22;12402:70;:::i;:::-;12491:8;;-1:-1:-1;12376:96:1;-1:-1:-1;12579:2:1;12564:18;;12551:32;;-1:-1:-1;12595:16:1;;;12592:2;;;12629:6;12621;12614:22;12592:2;;12673:72;12737:7;12726:8;12715:9;12711:24;12673:72;:::i;:::-;12108:697;;;;-1:-1:-1;12108:697:1;;-1:-1:-1;12764:8:1;;12647:98;12108:697;-1:-1:-1;;;12108:697:1:o;13686:258::-;13754:6;13762;13815:2;13803:9;13794:7;13790:23;13786:32;13783:2;;;13836:6;13828;13821:22;13783:2;-1:-1:-1;;13864:23:1;;;13934:2;13919:18;;;13906:32;;-1:-1:-1;13773:171:1:o;13949:332::-;14026:6;14034;14042;14095:2;14083:9;14074:7;14070:23;14066:32;14063:2;;;14116:6;14108;14101:22;14063:2;14157:9;14144:23;14134:33;;14214:2;14203:9;14199:18;14186:32;14176:42;;14237:38;14271:2;14260:9;14256:18;14237:38;:::i;:::-;14227:48;;14053:228;;;;;:::o;14286:395::-;14366:6;14374;14382;14390;14443:3;14431:9;14422:7;14418:23;14414:33;14411:2;;;14465:6;14457;14450:22;14411:2;14506:9;14493:23;14483:33;;14563:2;14552:9;14548:18;14535:32;14525:42;;14586:35;14617:2;14606:9;14602:18;14586:35;:::i;:::-;14576:45;;14640:35;14671:2;14660:9;14656:18;14640:35;:::i;:::-;14630:45;;14401:280;;;;;;;:::o;14686:449::-;14786:6;14781:3;14774:19;14756:3;14812:4;14841:2;14836:3;14832:12;14825:19;;14867:5;14890:3;14902:208;14916:6;14913:1;14910:13;14902:208;;;-1:-1:-1;;;;;14981:26:1;15000:6;14981:26;:::i;:::-;14977:52;14965:65;;15050:12;;;;15085:15;;;;14938:1;14931:9;14902:208;;;-1:-1:-1;15126:3:1;;14764:371;-1:-1:-1;;;;;14764:371:1:o;15140:360::-;15228:19;;;15210:3;-1:-1:-1;;;;;15259:31:1;;15256:2;;;15305:3;15300;15293:16;15256:2;15343:6;15340:1;15336:14;15395:8;15388:5;15381:4;15376:3;15372:14;15359:45;15427:18;;;;15447:4;15423:29;15461:15;;;-1:-1:-1;15423:29:1;;15218:282;-1:-1:-1;15218:282:1:o;15505:437::-;15558:3;15596:5;15590:12;15623:6;15618:3;15611:19;15649:4;15678:2;15673:3;15669:12;15662:19;;15715:2;15708:5;15704:14;15736:3;15748:169;15762:6;15759:1;15756:13;15748:169;;;15823:13;;15811:26;;15857:12;;;;15892:15;;;;15784:1;15777:9;15748:169;;15947:257;15988:3;16026:5;16020:12;16053:6;16048:3;16041:19;16069:63;16125:6;16118:4;16113:3;16109:14;16102:4;16095:5;16091:16;16069:63;:::i;:::-;16186:2;16165:15;-1:-1:-1;;16161:29:1;16152:39;;;;16193:4;16148:50;;15996:208;-1:-1:-1;;15996:208:1:o;16209:693::-;16259:3;16300:5;16294:12;16329:36;16355:9;16329:36;:::i;:::-;16384:1;16401:18;;;16428:104;;;;16546:1;16541:355;;;;16394:502;;16428:104;-1:-1:-1;;16461:24:1;;16449:37;;16506:16;;;;-1:-1:-1;16428:104:1;;16541:355;16572:5;16569:1;16562:16;16601:4;16646:2;16643:1;16633:16;16671:1;16685:165;16699:6;16696:1;16693:13;16685:165;;;16777:14;;16764:11;;;16757:35;16820:16;;;;16714:10;;16685:165;;;16689:3;;;16879:6;16874:3;16870:16;16863:23;;16394:502;;;;;16267:635;;;;:::o;16907:274::-;17036:3;17074:6;17068:13;17090:53;17136:6;17131:3;17124:4;17116:6;17112:17;17090:53;:::i;:::-;17159:16;;;;;17044:137;-1:-1:-1;;17044:137:1:o;17186:415::-;17343:3;17381:6;17375:13;17397:53;17443:6;17438:3;17431:4;17423:6;17419:17;17397:53;:::i;:::-;17519:2;17515:15;;;;-1:-1:-1;;17511:53:1;17472:16;;;;17497:68;;;17592:2;17581:14;;17351:250;-1:-1:-1;;17351:250:1:o;17606:456::-;17827:3;17855:38;17889:3;17881:6;17855:38;:::i;:::-;17922:6;17916:13;17938:52;17983:6;17979:2;17972:4;17964:6;17960:17;17938:52;:::i;:::-;18006:50;18048:6;18044:2;18040:15;18032:6;18006:50;:::i;:::-;17999:57;17835:227;-1:-1:-1;;;;;;;17835:227:1:o;18464:431::-;-1:-1:-1;;;;;18721:15:1;;;18703:34;;18773:15;;18768:2;18753:18;;18746:43;18825:2;18820;18805:18;;18798:30;;;18646:4;;18845:44;;18870:18;;18862:6;18845:44;:::i;:::-;18837:52;18655:240;-1:-1:-1;;;;;18655:240:1:o;18900:826::-;-1:-1:-1;;;;;19297:15:1;;;19279:34;;19349:15;;19344:2;19329:18;;19322:43;19259:3;19396:2;19381:18;;19374:31;;;19222:4;;19428:57;;19465:19;;19457:6;19428:57;:::i;:::-;19533:9;19525:6;19521:22;19516:2;19505:9;19501:18;19494:50;19567:44;19604:6;19596;19567:44;:::i;:::-;19553:58;;19660:9;19652:6;19648:22;19642:3;19631:9;19627:19;19620:51;19688:32;19713:6;19705;19688:32;:::i;19731:560::-;-1:-1:-1;;;;;20028:15:1;;;20010:34;;20080:15;;20075:2;20060:18;;20053:43;20127:2;20112:18;;20105:34;;;20170:2;20155:18;;20148:34;;;19990:3;20213;20198:19;;20191:32;;;19953:4;;20240:45;;20265:19;;20257:6;20240:45;:::i;20296:261::-;20475:2;20464:9;20457:21;20438:4;20495:56;20547:2;20536:9;20532:18;20524:6;20495:56;:::i;20562:465::-;20819:2;20808:9;20801:21;20782:4;20845:56;20897:2;20886:9;20882:18;20874:6;20845:56;:::i;:::-;20949:9;20941:6;20937:22;20932:2;20921:9;20917:18;20910:50;20977:44;21014:6;21006;20977:44;:::i;22231:217::-;22378:2;22367:9;22360:21;22341:4;22398:44;22438:2;22427:9;22423:18;22415:6;22398:44;:::i;22677:938::-;22786:4;22815:2;22844;22833:9;22826:21;22867:4;22903:6;22897:13;22933:36;22959:9;22933:36;:::i;:::-;23005:6;23000:2;22989:9;22985:18;22978:34;23031:2;23052:1;23084:2;23073:9;23069:18;23101:1;23096:121;;;;23231:1;23226:363;;;;23062:527;;23096:121;-1:-1:-1;;23144:24:1;;23124:18;;;23117:52;23204:2;23189:18;;;-1:-1:-1;23096:121:1;;23226:363;23260:6;23254:4;23247:20;23311:2;23305:4;23295:19;23336:4;23353:180;23367:6;23364:1;23361:13;23353:180;;;23460:14;;23436:17;;;23432:26;;23425:50;23503:16;;;;23382:10;;23353:180;;;23557:17;;23553:26;;;-1:-1:-1;;23062:527:1;-1:-1:-1;23606:3:1;;22795:820;-1:-1:-1;;;;;;;;22795:820:1:o;24393:404::-;24595:2;24577:21;;;24634:2;24614:18;;;24607:30;24673:34;24668:2;24653:18;;24646:62;-1:-1:-1;;;24739:2:1;24724:18;;24717:38;24787:3;24772:19;;24567:230::o;25987:400::-;26189:2;26171:21;;;26228:2;26208:18;;;26201:30;26267:34;26262:2;26247:18;;26240:62;-1:-1:-1;;;26333:2:1;26318:18;;26311:34;26377:3;26362:19;;26161:226::o;27510:423::-;27712:2;27694:21;;;27751:2;27731:18;;;27724:30;27790:34;27785:2;27770:18;;27763:62;27861:29;27856:2;27841:18;;27834:57;27923:3;27908:19;;27684:249::o;29948:401::-;30150:2;30132:21;;;30189:2;30169:18;;;30162:30;30228:34;30223:2;30208:18;;30201:62;-1:-1:-1;;;30294:2:1;30279:18;;30272:35;30339:3;30324:19;;30122:227::o;31480:399::-;31682:2;31664:21;;;31721:2;31701:18;;;31694:30;31760:34;31755:2;31740:18;;31733:62;-1:-1:-1;;;31826:2:1;31811:18;;31804:33;31869:3;31854:19;;31654:225::o;31884:406::-;32086:2;32068:21;;;32125:2;32105:18;;;32098:30;32164:34;32159:2;32144:18;;32137:62;-1:-1:-1;;;32230:2:1;32215:18;;32208:40;32280:3;32265:19;;32058:232::o;33878:404::-;34080:2;34062:21;;;34119:2;34099:18;;;34092:30;34158:34;34153:2;34138:18;;34131:62;-1:-1:-1;;;34224:2:1;34209:18;;34202:38;34272:3;34257:19;;34052:230::o;34287:397::-;34489:2;34471:21;;;34528:2;34508:18;;;34501:30;34567:34;34562:2;34547:18;;34540:62;-1:-1:-1;;;34633:2:1;34618:18;;34611:31;34674:3;34659:19;;34461:223::o;36400:590::-;36705:6;36694:9;36687:25;36748:2;36743;36732:9;36728:18;36721:30;36668:4;36774:73;36843:2;36832:9;36828:18;36820:6;36812;36774:73;:::i;:::-;36895:9;36887:6;36883:22;36878:2;36867:9;36863:18;36856:50;36923:61;36977:6;36969;36961;36923:61;:::i;36995:590::-;37300:6;37289:9;37282:25;37343:2;37338;37327:9;37323:18;37316:30;37263:4;37369:73;37438:2;37427:9;37423:18;37415:6;37407;37369:73;:::i;:::-;37490:9;37482:6;37478:22;37473:2;37462:9;37458:18;37451:50;37518:61;37572:6;37564;37556;37518:61;:::i;38609:183::-;38669:4;-1:-1:-1;;;;;38694:6:1;38691:30;38688:2;;;38724:18;;:::i;:::-;-1:-1:-1;38769:1:1;38765:14;38781:4;38761:25;;38678:114::o;38797:128::-;38837:3;38868:1;38864:6;38861:1;38858:13;38855:2;;;38874:18;;:::i;:::-;-1:-1:-1;38910:9:1;;38845:80::o;38930:204::-;38968:3;39004:4;39001:1;38997:12;39036:4;39033:1;39029:12;39071:3;39065:4;39061:14;39056:3;39053:23;39050:2;;;39079:18;;:::i;:::-;39115:13;;38976:158;-1:-1:-1;;;38976:158:1:o;39139:217::-;39179:1;39205;39195:2;;-1:-1:-1;;;39230:31:1;;39284:4;39281:1;39274:15;39312:4;39237:1;39302:15;39195:2;-1:-1:-1;39341:9:1;;39185:171::o;39361:168::-;39401:7;39467:1;39463;39459:6;39455:14;39452:1;39449:21;39444:1;39437:9;39430:17;39426:45;39423:2;;;39474:18;;:::i;:::-;-1:-1:-1;39514:9:1;;39413:116::o;39534:125::-;39574:4;39602:1;39599;39596:8;39593:2;;;39607:18;;:::i;:::-;-1:-1:-1;39644:9:1;;39583:76::o;39664:258::-;39736:1;39746:113;39760:6;39757:1;39754:13;39746:113;;;39836:11;;;39830:18;39817:11;;;39810:39;39782:2;39775:10;39746:113;;;39877:6;39874:1;39871:13;39868:2;;;-1:-1:-1;;39912:1:1;39894:16;;39887:27;39717:205::o;39927:380::-;40006:1;40002:12;;;;40049;;;40070:2;;40124:4;40116:6;40112:17;40102:27;;40070:2;40177;40169:6;40166:14;40146:18;40143:38;40140:2;;;40223:10;40218:3;40214:20;40211:1;40204:31;40258:4;40255:1;40248:15;40286:4;40283:1;40276:15;40140:2;;39982:325;;;:::o;40312:249::-;40422:2;40403:13;;-1:-1:-1;;40399:27:1;40387:40;;-1:-1:-1;;;;;40442:34:1;;40478:22;;;40439:62;40436:2;;;40504:18;;:::i;:::-;40540:2;40533:22;-1:-1:-1;;40359:202:1:o;40566:135::-;40605:3;-1:-1:-1;;40626:17:1;;40623:2;;;40646:18;;:::i;:::-;-1:-1:-1;40693:1:1;40682:13;;40613:88::o;40706:127::-;40767:10;40762:3;40758:20;40755:1;40748:31;40798:4;40795:1;40788:15;40822:4;40819:1;40812:15;40838:127;40899:10;40894:3;40890:20;40887:1;40880:31;40930:4;40927:1;40920:15;40954:4;40951:1;40944:15;40970:185;41005:3;41047:1;41029:16;41026:23;41023:2;;;41097:1;41092:3;41087;41072:27;41128:10;41123:3;41119:20;41013:142;:::o;41160:671::-;41199:3;41241:4;41223:16;41220:26;41217:2;;;41207:624;:::o;41217:2::-;41283;41277:9;-1:-1:-1;;41348:16:1;41344:25;;41341:1;41277:9;41320:50;41399:4;41393:11;41423:16;-1:-1:-1;;;;;41529:2:1;41522:4;41514:6;41510:17;41507:25;41502:2;41494:6;41491:14;41488:45;41485:2;;;41536:5;;;;;41207:624;:::o;41485:2::-;41573:6;41567:4;41563:17;41552:28;;41609:3;41603:10;41636:2;41628:6;41625:14;41622:2;;;41642:5;;;;;;41207:624;:::o;41622:2::-;41726;41707:16;41701:4;41697:27;41693:36;41686:4;41677:6;41672:3;41668:16;41664:27;41661:69;41658:2;;;41733:5;;;;;;41207:624;:::o;41658:2::-;41749:57;41800:4;41791:6;41783;41779:19;41775:30;41769:4;41749:57;:::i;:::-;-1:-1:-1;41822:3:1;;41207:624;-1:-1:-1;;;;;41207:624:1:o;41836:131::-;-1:-1:-1;;;;;;41910:32:1;;41900:43;;41890:2;;41957:1;41954;41947:12;41890:2;41880:87;:::o
Swarm Source
ipfs://ab02c81ff4cef595a8ae8342f3814fc7c73c0c08252ddecca6d801b6fd5901c2
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.