Token Jackals Reloaded
Overview CRC721
Total Supply:
3,081 JackalsReloaded
Holders:
135 addresses
Contract:
Balance
20 JackalsReloaded
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
JackalsReloaded
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2023-02-07 */ /** *Submitted for verification at cronoscan.com on 2023-01-31 */ /** *Submitted for verification at cronoscan.com on 2022-08-21 */ // SPDX-License-Identifier: GPL-3.0 // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // File: Jarheads.sol /** *Submitted for verification at cronoscan.com on 2022-07-05 */ // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File contracts/WithLimitedSupply.sol // pragma solidity ^0.8.4; /// @author Modified version of original code by 1001.digital /// @title A token tracker that limits the token supply and increments token IDs on each new mint. abstract contract WithLimitedSupply { // Keeps track of how many we have minted uint256 private _tokenCount; /// @dev The maximum count of tokens this token tracker will issue. uint256 private immutable _maxAvailableSupply; /// Instanciate the contract /// @param maxSupply_ how many tokens this collection should hold constructor(uint256 maxSupply_, uint256 reserved_) { _maxAvailableSupply = maxSupply_ - reserved_; } function maxAvailableSupply() public view returns (uint256) { return _maxAvailableSupply; } /// @dev Get the current token count /// @return the created token count /// TODO: if this is not required externally, does making it `public view` use unneccary gas? function tokenCount() public view returns (uint256) { return _tokenCount; } /// @dev Check whether tokens are still available /// @return the available token count function availableTokenCount() public view returns (uint256) { return maxAvailableSupply() - tokenCount(); } /// @dev Increment the token count and fetch the latest count /// @return the next token id function nextToken() internal virtual ensureAvailability returns (uint256) { return _tokenCount++; } /// @dev Check whether another token is still available modifier ensureAvailability() { require(availableTokenCount() > 0, 'No more tokens available'); _; } /// @param amount Check whether number of tokens are still available /// @dev Check whether tokens are still available modifier ensureAvailabilityFor(uint256 amount) { require( availableTokenCount() >= amount, 'Requested number of tokens not available' ); _; } } // File contracts/RandomlyAssigned.sol // pragma solidity ^0.8.4; /// @author Modified version of original code by 1001.digital /// @title Randomly assign tokenIDs from a given set of tokens. abstract contract RandomlyAssigned is WithLimitedSupply { // Used for random index assignment mapping(uint256 => uint256) private tokenMatrix; // The initial token ID uint256 private immutable startFrom; /// Instanciate the contract /// @param maxSupply_ how many tokens this collection should hold /// @param numReserved_ the number of tokens reserved whose IDs dont come from the randomizer constructor(uint256 maxSupply_, uint256 numReserved_) WithLimitedSupply(maxSupply_, numReserved_) { startFrom = numReserved_ + 1; } /// Get the next token ID /// @dev Randomly gets a new token ID and keeps track of the ones that are still available. /// @return the next token ID function nextToken() internal override returns (uint256) { uint256 maxIndex = maxAvailableSupply() - tokenCount(); uint256 random = uint256( keccak256( abi.encodePacked( msg.sender, block.coinbase, block.difficulty, block.gaslimit, block.timestamp ) ) ) % maxIndex; uint256 value = 0; if (tokenMatrix[random] == 0) { // If this matrix position is empty, set the value to the generated random number. value = random; } else { // Otherwise, use the previously stored number from the matrix. value = tokenMatrix[random]; } // If the last available tokenID is still unused... if (tokenMatrix[maxIndex - 1] == 0) { // ...store that ID in the current matrix position. tokenMatrix[random] = maxIndex - 1; } else { // ...otherwise copy over the stored number to the current matrix position. tokenMatrix[random] = tokenMatrix[maxIndex - 1]; } // Increment counts (ie. qty minted) super.nextToken(); return value + startFrom; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: contracts/CroArmyJackals3.sol abstract contract Army { function isMember(address user) public view virtual returns (bool); } pragma solidity ^0.8.0; contract JackalsReloaded is ERC721Enumerable, Ownable, RandomlyAssigned { using Strings for uint256; using Counters for Counters.Counter; string public baseURI = "ipfs://Qmai3UCzPie9UBPwRikXpiEEPhjx974oAatuZuYRYwrfMr/"; string public baseExtension = ".json"; string public notRevealedUri; ERC721 public memberships; ERC721 public memberships1; ERC721 public memberships2; uint256 public memberPrice = 50 ether; uint256 public whitelistPrice = 50 ether; uint256 public normalPrice = 55 ether; uint256 public maxSupply = 4200; uint256 public numReserved; Counters.Counter public _tokenIdCounter; bool public paused = false; bool public revealed = true; mapping(address => bool) whitelist; address private armyContract; address private armySoldier; address private armyCoalition; address private Jackals; // Pass the token address constructor(address _armySoldier, address _armyContract, address _armyCoalition, address _Jackals) ERC721("Jackals Reloaded","JackalsReloaded") RandomlyAssigned(maxSupply, numReserved){ memberships = ERC721(_armySoldier); memberships1 = ERC721(_armyCoalition); memberships2 = ERC721(_Jackals); armyContract = _armyContract; } function isArmySoldier(address _address) private view returns (bool) { return memberships.balanceOf(_address) > 0; } function isArmyCoalition(address _address) private view returns (bool) { return memberships1.balanceOf(_address) > 0; } function isJackals(address _address) private view returns (bool) { return memberships2.balanceOf(_address) > 0; } // internal function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function mintCost(address _address) public view returns (uint256) { require(_address != address(0), "not address 0"); if (whitelistPrice <= memberPrice) { if (isWhiteList(_address)) { return whitelistPrice; } else if (isDiscount(_address)) { return memberPrice; } else { return normalPrice; } } else if (isDiscount(_address)) { return memberPrice; } else if (isWhiteList(_address)) { return whitelistPrice; } else { return normalPrice; } } // public function mint(uint256 _count) public payable { require(!paused, "the contract is paused"); require(_count > 0, "need to mint at least 1 NFT"); uint256 cost; cost = mintCost(msg.sender); if (msg.sender != owner()) { uint amountDue = cost * _count; require(msg.value >= amountDue, "insufficient funds"); } for (uint256 i = 1; i <= _count; i++) { uint256 tokenId; _tokenIdCounter.increment(); tokenId = _tokenIdCounter.current(); require(tokenId <= maxSupply, "max NFT limit exceeded"); _safeMint(msg.sender, tokenId); } } function airdropMint(address [] calldata addlist,uint256 [] calldata amount) external onlyOwner { for (uint256 i = 0; i < addlist.length; i++) { uint256 amounttomint = amount[i]; for (uint256 j = 0; j < amounttomint; j++) { /*_mintRandomId(addlist[i]);*/ uint256 tokenId; _tokenIdCounter.increment(); tokenId = _tokenIdCounter.current(); require(tokenId <= maxSupply, "max NFT limit exceeded"); _safeMint(msg.sender, tokenId); } } } function safeMint(address _to) internal { uint256 tokenId; _tokenIdCounter.increment(); tokenId = _tokenIdCounter.current(); require(tokenId <= maxSupply, "max NFT limit exceeded"); _safeMint(_to, tokenId); } // Checks is specific address is on the WL and returns a boolean value function isWhiteList(address _address) public view returns(bool) { return whitelist[_address]; } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory tokenIds = new uint256[](ownerTokenCount); for (uint256 i; i < ownerTokenCount; i++) { tokenIds[i] = tokenOfOwnerByIndex(_owner, i); } return tokenIds; } function _mintRandomId(address to) private { uint256 id = nextToken(); require(id > 0 && id <= maxSupply, "Mint not possible"); _safeMint(to, id); } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); if(revealed == false) { return notRevealedUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension)) : ""; } //only owner function reveal() public onlyOwner { revealed = true; } function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function setBaseExtension(string memory _newBaseExtension) public onlyOwner { baseExtension = _newBaseExtension; } function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner { notRevealedUri = _notRevealedURI; } function pause(bool _state) public onlyOwner { paused = _state; } function addWhiteList(address[] calldata addresses) public onlyOwner { for (uint i = 0; i < addresses.length; i++) { whitelist[addresses[i]] = true; } } function removeWhiteList(address[] calldata addresses) public onlyOwner { for (uint i = 0; i < addresses.length; i++) { whitelist[addresses[i]] = false; } } // Checks if a specified address should receive a discount function isDiscount(address _address) public view returns (bool) { if (isArmySoldier(_address) || hasArmy(_address) || isArmyCoalition(_address) || isJackals(_address)) { return true; } else { return false; } } function setnormalPrice(uint256 _cost) external onlyOwner { normalPrice = _cost; } function setmemberPrice(uint256 _cost) external onlyOwner { memberPrice = _cost; } function setwhitelistPrice(uint256 _cost) external onlyOwner { whitelistPrice = _cost; } function hasArmy(address _address) internal view returns (bool) { uint balance = ERC20(armyContract).balanceOf(_address); if (balance >= 100000000000000000000000) { return true; } else { return false; } } function withdraw() public payable onlyOwner { // This will payout the owner the contract balance. // Do not remove this otherwise you will not be able to withdraw the funds. // ============================================================================= (bool os, ) = payable(owner()).call{value: address(this).balance}(""); require(os); // ============================================================================= } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_armySoldier","type":"address"},{"internalType":"address","name":"_armyContract","type":"address"},{"internalType":"address","name":"_armyCoalition","type":"address"},{"internalType":"address","name":"_Jackals","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_tokenIdCounter","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addlist","type":"address[]"},{"internalType":"uint256[]","name":"amount","type":"uint256[]"}],"name":"airdropMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"availableTokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isDiscount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isWhiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxAvailableSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"memberPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"memberships","outputs":[{"internalType":"contract ERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"memberships1","outputs":[{"internalType":"contract ERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"memberships2","outputs":[{"internalType":"contract ERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"mintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"normalPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numReserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"removeWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setmemberPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setnormalPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setwhitelistPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60c060405260405180606001604052806036815260200162005e4560369139600d908051906020019062000035929190620003ed565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600e908051906020019062000083929190620003ed565b506802b5e3af16b18800006013556802b5e3af16b18800006014556802fb474098f67c00006015556110686016556000601960006101000a81548160ff0219169083151502179055506001601960016101000a81548160ff021916908315150217905550348015620000f457600080fd5b5060405162005e7b38038062005e7b83398181016040528101906200011a9190620004b4565b60165460175481816040518060400160405280601081526020017f4a61636b616c732052656c6f61646564000000000000000000000000000000008152506040518060400160405280600f81526020017f4a61636b616c7352656c6f6164656400000000000000000000000000000000008152508160009080519060200190620001a6929190620003ed565b508060019080519060200190620001bf929190620003ed565b505050620001e2620001d66200031f60201b60201c565b6200032760201b60201c565b8082620001f0919062000583565b60808181525050505060018162000208919062000526565b60a08181525050505083601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082601b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050620006af565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620003fb90620005fc565b90600052602060002090601f0160209004810192826200041f57600085556200046b565b82601f106200043a57805160ff19168380011785556200046b565b828001600101855582156200046b579182015b828111156200046a5782518255916020019190600101906200044d565b5b5090506200047a91906200047e565b5090565b5b80821115620004995760008160009055506001016200047f565b5090565b600081519050620004ae8162000695565b92915050565b60008060008060808587031215620004d157620004d062000690565b5b6000620004e1878288016200049d565b9450506020620004f4878288016200049d565b935050604062000507878288016200049d565b92505060606200051a878288016200049d565b91505092959194509250565b60006200053382620005f2565b91506200054083620005f2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000578576200057762000632565b5b828201905092915050565b60006200059082620005f2565b91506200059d83620005f2565b925082821015620005b357620005b262000632565b5b828203905092915050565b6000620005cb82620005d2565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060028204905060018216806200061557607f821691505b602082108114156200062c576200062b62000661565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b620006a081620005be565b8114620006ac57600080fd5b50565b60805160a051615773620006d260003960005050600061103a01526157736000f3fe60806040526004361061031a5760003560e01c8063715018a6116101ab578063b150a6f6116100f7578063da3ef23f11610095578063f2c4ce1e1161006f578063f2c4ce1e14610bac578063f2fde38b14610bd5578063f99031a714610bfe578063fc1a1c3614610c3b5761031a565b8063da3ef23f14610b1b578063e14ca35314610b44578063e985e9c514610b6f5761031a565b8063bcb96f52116100d1578063bcb96f5214610a5f578063c668286214610a88578063c87b56dd14610ab3578063d5abeb0114610af05761031a565b8063b150a6f6146109e0578063b88d4fde14610a0b578063b88fe6a314610a345761031a565b806395d89b4111610164578063a0712d681161013e578063a0712d6814610947578063a22cb46514610963578063a475b5dd1461098c578063a526c5d9146109a35761031a565b806395d89b41146108c85780639f181b5e146108f3578063a02956441461091e5761031a565b8063715018a6146107dc578063795f2cf8146107f357806384c4bd4b1461081e5780638da5cb5b146108495780638dd94bba14610874578063945ec9dd1461089d5761031a565b80633ccfd60b1161026a5780635c975abb11610223578063636e746b116101fd578063636e746b1461071e5780636b150b13146107495780636c0360eb1461077457806370a082311461079f5761031a565b80635c975abb1461068d5780635e1045ec146106b85780636352211e146106e15761031a565b80633ccfd60b1461058c57806342842e0e14610596578063438b6300146105bf5780634f6ccce7146105fc578063518302271461063957806355f804b3146106645761031a565b806315f91c18116102d7578063279a669e116102b1578063279a669e146104c05780632acc659e146104e95780632f745c591461052657806339745791146105635761031a565b806315f91c181461044157806318160ddd1461046c57806323b872dd146104975761031a565b806301ffc9a71461031f57806302329a291461035c57806306fdde0314610385578063081812fc146103b0578063081c8c44146103ed578063095ea7b314610418575b600080fd5b34801561032b57600080fd5b5061034660048036038101906103419190614187565b610c66565b604051610353919061487e565b60405180910390f35b34801561036857600080fd5b50610383600480360381019061037e919061415a565b610ce0565b005b34801561039157600080fd5b5061039a610d79565b6040516103a791906148b4565b60405180910390f35b3480156103bc57600080fd5b506103d760048036038101906103d2919061422a565b610e0b565b6040516103e491906147f5565b60405180910390f35b3480156103f957600080fd5b50610402610e90565b60405161040f91906148b4565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a919061404c565b610f1e565b005b34801561044d57600080fd5b50610456611036565b6040516104639190614bb6565b60405180910390f35b34801561047857600080fd5b5061048161105e565b60405161048e9190614bb6565b60405180910390f35b3480156104a357600080fd5b506104be60048036038101906104b99190613f36565b61106b565b005b3480156104cc57600080fd5b506104e760048036038101906104e291906140d9565b6110cb565b005b3480156104f557600080fd5b50610510600480360381019061050b9190613ec9565b611215565b60405161051d9190614bb6565b60405180910390f35b34801561053257600080fd5b5061054d6004803603810190610548919061404c565b611306565b60405161055a9190614bb6565b60405180910390f35b34801561056f57600080fd5b5061058a6004803603810190610585919061408c565b6113ab565b005b6105946114cc565b005b3480156105a257600080fd5b506105bd60048036038101906105b89190613f36565b6115c8565b005b3480156105cb57600080fd5b506105e660048036038101906105e19190613ec9565b6115e8565b6040516105f3919061485c565b60405180910390f35b34801561060857600080fd5b50610623600480360381019061061e919061422a565b611696565b6040516106309190614bb6565b60405180910390f35b34801561064557600080fd5b5061064e611707565b60405161065b919061487e565b60405180910390f35b34801561067057600080fd5b5061068b600480360381019061068691906141e1565b61171a565b005b34801561069957600080fd5b506106a26117b0565b6040516106af919061487e565b60405180910390f35b3480156106c457600080fd5b506106df60048036038101906106da919061408c565b6117c3565b005b3480156106ed57600080fd5b506107086004803603810190610703919061422a565b6118e4565b60405161071591906147f5565b60405180910390f35b34801561072a57600080fd5b50610733611996565b6040516107409190614bb6565b60405180910390f35b34801561075557600080fd5b5061075e61199c565b60405161076b9190614899565b60405180910390f35b34801561078057600080fd5b506107896119c2565b60405161079691906148b4565b60405180910390f35b3480156107ab57600080fd5b506107c660048036038101906107c19190613ec9565b611a50565b6040516107d39190614bb6565b60405180910390f35b3480156107e857600080fd5b506107f1611b08565b005b3480156107ff57600080fd5b50610808611b90565b6040516108159190614899565b60405180910390f35b34801561082a57600080fd5b50610833611bb6565b6040516108409190614bb6565b60405180910390f35b34801561085557600080fd5b5061085e611bc2565b60405161086b91906147f5565b60405180910390f35b34801561088057600080fd5b5061089b6004803603810190610896919061422a565b611bec565b005b3480156108a957600080fd5b506108b2611c72565b6040516108bf9190614bb6565b60405180910390f35b3480156108d457600080fd5b506108dd611c78565b6040516108ea91906148b4565b60405180910390f35b3480156108ff57600080fd5b50610908611d0a565b6040516109159190614bb6565b60405180910390f35b34801561092a57600080fd5b506109456004803603810190610940919061422a565b611d14565b005b610961600480360381019061095c919061422a565b611d9a565b005b34801561096f57600080fd5b5061098a6004803603810190610985919061400c565b611f57565b005b34801561099857600080fd5b506109a1611f6d565b005b3480156109af57600080fd5b506109ca60048036038101906109c59190613ec9565b612006565b6040516109d7919061487e565b60405180910390f35b3480156109ec57600080fd5b506109f5612059565b604051610a029190614bb6565b60405180910390f35b348015610a1757600080fd5b50610a326004803603810190610a2d9190613f89565b61205f565b005b348015610a4057600080fd5b50610a496120c1565b604051610a569190614899565b60405180910390f35b348015610a6b57600080fd5b50610a866004803603810190610a81919061422a565b6120e7565b005b348015610a9457600080fd5b50610a9d61216d565b604051610aaa91906148b4565b60405180910390f35b348015610abf57600080fd5b50610ada6004803603810190610ad5919061422a565b6121fb565b604051610ae791906148b4565b60405180910390f35b348015610afc57600080fd5b50610b05612354565b604051610b129190614bb6565b60405180910390f35b348015610b2757600080fd5b50610b426004803603810190610b3d91906141e1565b61235a565b005b348015610b5057600080fd5b50610b596123f0565b604051610b669190614bb6565b60405180910390f35b348015610b7b57600080fd5b50610b966004803603810190610b919190613ef6565b612411565b604051610ba3919061487e565b60405180910390f35b348015610bb857600080fd5b50610bd36004803603810190610bce91906141e1565b6124a5565b005b348015610be157600080fd5b50610bfc6004803603810190610bf79190613ec9565b61253b565b005b348015610c0a57600080fd5b50610c256004803603810190610c209190613ec9565b612633565b604051610c32919061487e565b60405180910390f35b348015610c4757600080fd5b50610c50612689565b604051610c5d9190614bb6565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610cd95750610cd88261268f565b5b9050919050565b610ce8612771565b73ffffffffffffffffffffffffffffffffffffffff16610d06611bc2565b73ffffffffffffffffffffffffffffffffffffffff1614610d5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5390614a96565b60405180910390fd5b80601960006101000a81548160ff02191690831515021790555050565b606060008054610d8890614ef5565b80601f0160208091040260200160405190810160405280929190818152602001828054610db490614ef5565b8015610e015780601f10610dd657610100808354040283529160200191610e01565b820191906000526020600020905b815481529060010190602001808311610de457829003601f168201915b5050505050905090565b6000610e1682612779565b610e55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4c90614a76565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600f8054610e9d90614ef5565b80601f0160208091040260200160405190810160405280929190818152602001828054610ec990614ef5565b8015610f165780601f10610eeb57610100808354040283529160200191610f16565b820191906000526020600020905b815481529060010190602001808311610ef957829003601f168201915b505050505081565b6000610f29826118e4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9190614b16565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610fb9612771565b73ffffffffffffffffffffffffffffffffffffffff161480610fe85750610fe781610fe2612771565b612411565b5b611027576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101e906149d6565b60405180910390fd5b61103183836127e5565b505050565b60007f0000000000000000000000000000000000000000000000000000000000000000905090565b6000600880549050905090565b61107c611076612771565b8261289e565b6110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b290614b56565b60405180910390fd5b6110c683838361297c565b505050565b6110d3612771565b73ffffffffffffffffffffffffffffffffffffffff166110f1611bc2565b73ffffffffffffffffffffffffffffffffffffffff1614611147576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113e90614a96565b60405180910390fd5b60005b8484905081101561120e57600083838381811061116a5761116961508e565b5b90506020020135905060005b818110156111f957600061118a6018612be3565b6111946018612bf9565b90506016548111156111db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d290614a36565b60405180910390fd5b6111e53382612c07565b5080806111f190614f58565b915050611176565b5050808061120690614f58565b91505061114a565b5050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127d90614af6565b60405180910390fd5b601354601454116112cb5761129a82612633565b156112a9576014549050611301565b6112b282612006565b156112c1576013549050611301565b6015549050611301565b6112d482612006565b156112e3576013549050611301565b6112ec82612633565b156112fb576014549050611301565b60155490505b919050565b600061131183611a50565b8210611352576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611349906148d6565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6113b3612771565b73ffffffffffffffffffffffffffffffffffffffff166113d1611bc2565b73ffffffffffffffffffffffffffffffffffffffff1614611427576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141e90614a96565b60405180910390fd5b60005b828290508110156114c7576000601a600085858581811061144e5761144d61508e565b5b90506020020160208101906114639190613ec9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806114bf90614f58565b91505061142a565b505050565b6114d4612771565b73ffffffffffffffffffffffffffffffffffffffff166114f2611bc2565b73ffffffffffffffffffffffffffffffffffffffff1614611548576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153f90614a96565b60405180910390fd5b6000611552611bc2565b73ffffffffffffffffffffffffffffffffffffffff1647604051611575906147e0565b60006040518083038185875af1925050503d80600081146115b2576040519150601f19603f3d011682016040523d82523d6000602084013e6115b7565b606091505b50509050806115c557600080fd5b50565b6115e38383836040518060200160405280600081525061205f565b505050565b606060006115f583611a50565b905060008167ffffffffffffffff811115611613576116126150bd565b5b6040519080825280602002602001820160405280156116415781602001602082028036833780820191505090505b50905060005b8281101561168b576116598582611306565b82828151811061166c5761166b61508e565b5b602002602001018181525050808061168390614f58565b915050611647565b508092505050919050565b60006116a061105e565b82106116e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d890614b76565b60405180910390fd5b600882815481106116f5576116f461508e565b5b90600052602060002001549050919050565b601960019054906101000a900460ff1681565b611722612771565b73ffffffffffffffffffffffffffffffffffffffff16611740611bc2565b73ffffffffffffffffffffffffffffffffffffffff1614611796576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178d90614a96565b60405180910390fd5b80600d90805190602001906117ac929190613c1c565b5050565b601960009054906101000a900460ff1681565b6117cb612771565b73ffffffffffffffffffffffffffffffffffffffff166117e9611bc2565b73ffffffffffffffffffffffffffffffffffffffff161461183f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183690614a96565b60405180910390fd5b60005b828290508110156118df576001601a60008585858181106118665761186561508e565b5b905060200201602081019061187b9190613ec9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806118d790614f58565b915050611842565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561198d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198490614a16565b60405180910390fd5b80915050919050565b60135481565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d80546119cf90614ef5565b80601f01602080910402602001604051908101604052809291908181526020018280546119fb90614ef5565b8015611a485780601f10611a1d57610100808354040283529160200191611a48565b820191906000526020600020905b815481529060010190602001808311611a2b57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ac1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab8906149f6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611b10612771565b73ffffffffffffffffffffffffffffffffffffffff16611b2e611bc2565b73ffffffffffffffffffffffffffffffffffffffff1614611b84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7b90614a96565b60405180910390fd5b611b8e6000612c25565b565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60188060000154905081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611bf4612771565b73ffffffffffffffffffffffffffffffffffffffff16611c12611bc2565b73ffffffffffffffffffffffffffffffffffffffff1614611c68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5f90614a96565b60405180910390fd5b8060138190555050565b60155481565b606060018054611c8790614ef5565b80601f0160208091040260200160405190810160405280929190818152602001828054611cb390614ef5565b8015611d005780601f10611cd557610100808354040283529160200191611d00565b820191906000526020600020905b815481529060010190602001808311611ce357829003601f168201915b5050505050905090565b6000600b54905090565b611d1c612771565b73ffffffffffffffffffffffffffffffffffffffff16611d3a611bc2565b73ffffffffffffffffffffffffffffffffffffffff1614611d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8790614a96565b60405180910390fd5b8060148190555050565b601960009054906101000a900460ff1615611dea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de190614ab6565b60405180910390fd5b60008111611e2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2490614b96565b60405180910390fd5b6000611e3833611215565b9050611e42611bc2565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ec95760008282611e829190614d7b565b905080341015611ec7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebe90614b36565b60405180910390fd5b505b6000600190505b828111611f52576000611ee36018612be3565b611eed6018612bf9565b9050601654811115611f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2b90614a36565b60405180910390fd5b611f3e3382612c07565b508080611f4a90614f58565b915050611ed0565b505050565b611f69611f62612771565b8383612ceb565b5050565b611f75612771565b73ffffffffffffffffffffffffffffffffffffffff16611f93611bc2565b73ffffffffffffffffffffffffffffffffffffffff1614611fe9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe090614a96565b60405180910390fd5b6001601960016101000a81548160ff021916908315150217905550565b600061201182612e58565b80612021575061202082612f0e565b5b80612031575061203082612fe4565b5b8061204157506120408261309a565b5b1561204f5760019050612054565b600090505b919050565b60175481565b61207061206a612771565b8361289e565b6120af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a690614b56565b60405180910390fd5b6120bb84848484613150565b50505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6120ef612771565b73ffffffffffffffffffffffffffffffffffffffff1661210d611bc2565b73ffffffffffffffffffffffffffffffffffffffff1614612163576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215a90614a96565b60405180910390fd5b8060158190555050565b600e805461217a90614ef5565b80601f01602080910402602001604051908101604052809291908181526020018280546121a690614ef5565b80156121f35780601f106121c8576101008083540402835291602001916121f3565b820191906000526020600020905b8154815290600101906020018083116121d657829003601f168201915b505050505081565b606061220682612779565b612245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223c90614ad6565b60405180910390fd5b60001515601960019054906101000a900460ff16151514156122f357600f805461226e90614ef5565b80601f016020809104026020016040519081016040528092919081815260200182805461229a90614ef5565b80156122e75780601f106122bc576101008083540402835291602001916122e7565b820191906000526020600020905b8154815290600101906020018083116122ca57829003601f168201915b5050505050905061234f565b60006122fd6131ac565b9050600081511161231d576040518060200160405280600081525061234b565b806123278461323e565b600e60405160200161233b939291906147af565b6040516020818303038152906040525b9150505b919050565b60165481565b612362612771565b73ffffffffffffffffffffffffffffffffffffffff16612380611bc2565b73ffffffffffffffffffffffffffffffffffffffff16146123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd90614a96565b60405180910390fd5b80600e90805190602001906123ec929190613c1c565b5050565b60006123fa611d0a565b612402611036565b61240c9190614dd5565b905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6124ad612771565b73ffffffffffffffffffffffffffffffffffffffff166124cb611bc2565b73ffffffffffffffffffffffffffffffffffffffff1614612521576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251890614a96565b60405180910390fd5b80600f9080519060200190612537929190613c1c565b5050565b612543612771565b73ffffffffffffffffffffffffffffffffffffffff16612561611bc2565b73ffffffffffffffffffffffffffffffffffffffff16146125b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ae90614a96565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612627576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261e90614916565b60405180910390fd5b61263081612c25565b50565b6000601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60145481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061275a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061276a57506127698261339f565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612858836118e4565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006128a982612779565b6128e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128df906149b6565b60405180910390fd5b60006128f3836118e4565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061293557506129348185612411565b5b8061297357508373ffffffffffffffffffffffffffffffffffffffff1661295b84610e0b565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661299c826118e4565b73ffffffffffffffffffffffffffffffffffffffff16146129f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e990614936565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5990614976565b60405180910390fd5b612a6d838383613409565b612a786000826127e5565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ac89190614dd5565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b1f9190614cf4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bde83838361351d565b505050565b6001816000016000828254019250508190555050565b600081600001549050919050565b612c21828260405180602001604052806000815250613522565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5190614996565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612e4b919061487e565b60405180910390a3505050565b600080601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401612eb691906147f5565b60206040518083038186803b158015612ece57600080fd5b505afa158015612ee2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f069190614257565b119050919050565b600080601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401612f6c91906147f5565b60206040518083038186803b158015612f8457600080fd5b505afa158015612f98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fbc9190614257565b905069152d02c7e14af68000008110612fd9576001915050612fdf565b60009150505b919050565b600080601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b815260040161304291906147f5565b60206040518083038186803b15801561305a57600080fd5b505afa15801561306e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130929190614257565b119050919050565b600080601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016130f891906147f5565b60206040518083038186803b15801561311057600080fd5b505afa158015613124573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131489190614257565b119050919050565b61315b84848461297c565b6131678484848461357d565b6131a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319d906148f6565b60405180910390fd5b50505050565b6060600d80546131bb90614ef5565b80601f01602080910402602001604051908101604052809291908181526020018280546131e790614ef5565b80156132345780601f1061320957610100808354040283529160200191613234565b820191906000526020600020905b81548152906001019060200180831161321757829003601f168201915b5050505050905090565b60606000821415613286576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061339a565b600082905060005b600082146132b85780806132a190614f58565b915050600a826132b19190614d4a565b915061328e565b60008167ffffffffffffffff8111156132d4576132d36150bd565b5b6040519080825280601f01601f1916602001820160405280156133065781602001600182028036833780820191505090505b5090505b600085146133935760018261331f9190614dd5565b9150600a8561332e9190614fa1565b603061333a9190614cf4565b60f81b8183815181106133505761334f61508e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561338c9190614d4a565b945061330a565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613414838383613714565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156134575761345281613719565b613496565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613495576134948382613762565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134d9576134d4816138cf565b613518565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146135175761351682826139a0565b5b5b505050565b505050565b61352c8383613a1f565b613539600084848461357d565b613578576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161356f906148f6565b60405180910390fd5b505050565b600061359e8473ffffffffffffffffffffffffffffffffffffffff16613bf9565b15613707578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026135c7612771565b8786866040518563ffffffff1660e01b81526004016135e99493929190614810565b602060405180830381600087803b15801561360357600080fd5b505af192505050801561363457506040513d601f19601f8201168201806040525081019061363191906141b4565b60015b6136b7573d8060008114613664576040519150601f19603f3d011682016040523d82523d6000602084013e613669565b606091505b506000815114156136af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136a6906148f6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061370c565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161376f84611a50565b6137799190614dd5565b905060006007600084815260200190815260200160002054905081811461385e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506138e39190614dd5565b90506000600960008481526020019081526020016000205490506000600883815481106139135761391261508e565b5b9060005260206000200154905080600883815481106139355761393461508e565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806139845761398361505f565b5b6001900381819060005260206000200160009055905550505050565b60006139ab83611a50565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a8690614a56565b60405180910390fd5b613a9881612779565b15613ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613acf90614956565b60405180910390fd5b613ae460008383613409565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613b349190614cf4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613bf56000838361351d565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054613c2890614ef5565b90600052602060002090601f016020900481019282613c4a5760008555613c91565b82601f10613c6357805160ff1916838001178555613c91565b82800160010185558215613c91579182015b82811115613c90578251825591602001919060010190613c75565b5b509050613c9e9190613ca2565b5090565b5b80821115613cbb576000816000905550600101613ca3565b5090565b6000613cd2613ccd84614bf6565b614bd1565b905082815260208101848484011115613cee57613ced6150fb565b5b613cf9848285614eb3565b509392505050565b6000613d14613d0f84614c27565b614bd1565b905082815260208101848484011115613d3057613d2f6150fb565b5b613d3b848285614eb3565b509392505050565b600081359050613d52816156e1565b92915050565b60008083601f840112613d6e57613d6d6150f1565b5b8235905067ffffffffffffffff811115613d8b57613d8a6150ec565b5b602083019150836020820283011115613da757613da66150f6565b5b9250929050565b60008083601f840112613dc457613dc36150f1565b5b8235905067ffffffffffffffff811115613de157613de06150ec565b5b602083019150836020820283011115613dfd57613dfc6150f6565b5b9250929050565b600081359050613e13816156f8565b92915050565b600081359050613e288161570f565b92915050565b600081519050613e3d8161570f565b92915050565b600082601f830112613e5857613e576150f1565b5b8135613e68848260208601613cbf565b91505092915050565b600082601f830112613e8657613e856150f1565b5b8135613e96848260208601613d01565b91505092915050565b600081359050613eae81615726565b92915050565b600081519050613ec381615726565b92915050565b600060208284031215613edf57613ede615105565b5b6000613eed84828501613d43565b91505092915050565b60008060408385031215613f0d57613f0c615105565b5b6000613f1b85828601613d43565b9250506020613f2c85828601613d43565b9150509250929050565b600080600060608486031215613f4f57613f4e615105565b5b6000613f5d86828701613d43565b9350506020613f6e86828701613d43565b9250506040613f7f86828701613e9f565b9150509250925092565b60008060008060808587031215613fa357613fa2615105565b5b6000613fb187828801613d43565b9450506020613fc287828801613d43565b9350506040613fd387828801613e9f565b925050606085013567ffffffffffffffff811115613ff457613ff3615100565b5b61400087828801613e43565b91505092959194509250565b6000806040838503121561402357614022615105565b5b600061403185828601613d43565b925050602061404285828601613e04565b9150509250929050565b6000806040838503121561406357614062615105565b5b600061407185828601613d43565b925050602061408285828601613e9f565b9150509250929050565b600080602083850312156140a3576140a2615105565b5b600083013567ffffffffffffffff8111156140c1576140c0615100565b5b6140cd85828601613d58565b92509250509250929050565b600080600080604085870312156140f3576140f2615105565b5b600085013567ffffffffffffffff81111561411157614110615100565b5b61411d87828801613d58565b9450945050602085013567ffffffffffffffff8111156141405761413f615100565b5b61414c87828801613dae565b925092505092959194509250565b6000602082840312156141705761416f615105565b5b600061417e84828501613e04565b91505092915050565b60006020828403121561419d5761419c615105565b5b60006141ab84828501613e19565b91505092915050565b6000602082840312156141ca576141c9615105565b5b60006141d884828501613e2e565b91505092915050565b6000602082840312156141f7576141f6615105565b5b600082013567ffffffffffffffff81111561421557614214615100565b5b61422184828501613e71565b91505092915050565b6000602082840312156142405761423f615105565b5b600061424e84828501613e9f565b91505092915050565b60006020828403121561426d5761426c615105565b5b600061427b84828501613eb4565b91505092915050565b60006142908383614791565b60208301905092915050565b6142a581614e09565b82525050565b60006142b682614c7d565b6142c08185614cab565b93506142cb83614c58565b8060005b838110156142fc5781516142e38882614284565b97506142ee83614c9e565b9250506001810190506142cf565b5085935050505092915050565b61431281614e1b565b82525050565b600061432382614c88565b61432d8185614cbc565b935061433d818560208601614ec2565b6143468161510a565b840191505092915050565b61435a81614e7d565b82525050565b600061436b82614c93565b6143758185614cd8565b9350614385818560208601614ec2565b61438e8161510a565b840191505092915050565b60006143a482614c93565b6143ae8185614ce9565b93506143be818560208601614ec2565b80840191505092915050565b600081546143d781614ef5565b6143e18186614ce9565b945060018216600081146143fc576001811461440d57614440565b60ff19831686528186019350614440565b61441685614c68565b60005b8381101561443857815481890152600182019150602081019050614419565b838801955050505b50505092915050565b6000614456602b83614cd8565b91506144618261511b565b604082019050919050565b6000614479603283614cd8565b91506144848261516a565b604082019050919050565b600061449c602683614cd8565b91506144a7826151b9565b604082019050919050565b60006144bf602583614cd8565b91506144ca82615208565b604082019050919050565b60006144e2601c83614cd8565b91506144ed82615257565b602082019050919050565b6000614505602483614cd8565b915061451082615280565b604082019050919050565b6000614528601983614cd8565b9150614533826152cf565b602082019050919050565b600061454b602c83614cd8565b9150614556826152f8565b604082019050919050565b600061456e603883614cd8565b915061457982615347565b604082019050919050565b6000614591602a83614cd8565b915061459c82615396565b604082019050919050565b60006145b4602983614cd8565b91506145bf826153e5565b604082019050919050565b60006145d7601683614cd8565b91506145e282615434565b602082019050919050565b60006145fa602083614cd8565b91506146058261545d565b602082019050919050565b600061461d602c83614cd8565b915061462882615486565b604082019050919050565b6000614640602083614cd8565b915061464b826154d5565b602082019050919050565b6000614663601683614cd8565b915061466e826154fe565b602082019050919050565b6000614686602f83614cd8565b915061469182615527565b604082019050919050565b60006146a9600d83614cd8565b91506146b482615576565b602082019050919050565b60006146cc602183614cd8565b91506146d78261559f565b604082019050919050565b60006146ef600083614ccd565b91506146fa826155ee565b600082019050919050565b6000614712601283614cd8565b915061471d826155f1565b602082019050919050565b6000614735603183614cd8565b91506147408261561a565b604082019050919050565b6000614758602c83614cd8565b915061476382615669565b604082019050919050565b600061477b601b83614cd8565b9150614786826156b8565b602082019050919050565b61479a81614e73565b82525050565b6147a981614e73565b82525050565b60006147bb8286614399565b91506147c78285614399565b91506147d382846143ca565b9150819050949350505050565b60006147eb826146e2565b9150819050919050565b600060208201905061480a600083018461429c565b92915050565b6000608082019050614825600083018761429c565b614832602083018661429c565b61483f60408301856147a0565b81810360608301526148518184614318565b905095945050505050565b6000602082019050818103600083015261487681846142ab565b905092915050565b60006020820190506148936000830184614309565b92915050565b60006020820190506148ae6000830184614351565b92915050565b600060208201905081810360008301526148ce8184614360565b905092915050565b600060208201905081810360008301526148ef81614449565b9050919050565b6000602082019050818103600083015261490f8161446c565b9050919050565b6000602082019050818103600083015261492f8161448f565b9050919050565b6000602082019050818103600083015261494f816144b2565b9050919050565b6000602082019050818103600083015261496f816144d5565b9050919050565b6000602082019050818103600083015261498f816144f8565b9050919050565b600060208201905081810360008301526149af8161451b565b9050919050565b600060208201905081810360008301526149cf8161453e565b9050919050565b600060208201905081810360008301526149ef81614561565b9050919050565b60006020820190508181036000830152614a0f81614584565b9050919050565b60006020820190508181036000830152614a2f816145a7565b9050919050565b60006020820190508181036000830152614a4f816145ca565b9050919050565b60006020820190508181036000830152614a6f816145ed565b9050919050565b60006020820190508181036000830152614a8f81614610565b9050919050565b60006020820190508181036000830152614aaf81614633565b9050919050565b60006020820190508181036000830152614acf81614656565b9050919050565b60006020820190508181036000830152614aef81614679565b9050919050565b60006020820190508181036000830152614b0f8161469c565b9050919050565b60006020820190508181036000830152614b2f816146bf565b9050919050565b60006020820190508181036000830152614b4f81614705565b9050919050565b60006020820190508181036000830152614b6f81614728565b9050919050565b60006020820190508181036000830152614b8f8161474b565b9050919050565b60006020820190508181036000830152614baf8161476e565b9050919050565b6000602082019050614bcb60008301846147a0565b92915050565b6000614bdb614bec565b9050614be78282614f27565b919050565b6000604051905090565b600067ffffffffffffffff821115614c1157614c106150bd565b5b614c1a8261510a565b9050602081019050919050565b600067ffffffffffffffff821115614c4257614c416150bd565b5b614c4b8261510a565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614cff82614e73565b9150614d0a83614e73565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d3f57614d3e614fd2565b5b828201905092915050565b6000614d5582614e73565b9150614d6083614e73565b925082614d7057614d6f615001565b5b828204905092915050565b6000614d8682614e73565b9150614d9183614e73565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614dca57614dc9614fd2565b5b828202905092915050565b6000614de082614e73565b9150614deb83614e73565b925082821015614dfe57614dfd614fd2565b5b828203905092915050565b6000614e1482614e53565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614e8882614e8f565b9050919050565b6000614e9a82614ea1565b9050919050565b6000614eac82614e53565b9050919050565b82818337600083830152505050565b60005b83811015614ee0578082015181840152602081019050614ec5565b83811115614eef576000848401525b50505050565b60006002820490506001821680614f0d57607f821691505b60208210811415614f2157614f20615030565b5b50919050565b614f308261510a565b810181811067ffffffffffffffff82111715614f4f57614f4e6150bd565b5b80604052505050565b6000614f6382614e73565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614f9657614f95614fd2565b5b600182019050919050565b6000614fac82614e73565b9150614fb783614e73565b925082614fc757614fc6615001565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f74686520636f6e74726163742069732070617573656400000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f6e6f742061646472657373203000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f6e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b6156ea81614e09565b81146156f557600080fd5b50565b61570181614e1b565b811461570c57600080fd5b50565b61571881614e27565b811461572357600080fd5b50565b61572f81614e73565b811461573a57600080fd5b5056fea26469706673582212202959e0b709cea55d3ab47a98e9e8bd3e9d4d40d2ac42d44d97bd663d1d3e686c64736f6c63430008070033697066733a2f2f516d61693355437a506965395542507752696b587069454550686a783937346f416174755a755952597772664d722f000000000000000000000000e4a36aa88d8380db252558104dbe0d71505af7a5000000000000000000000000b20115b8b176d72f077c4f93e95492870240a0b200000000000000000000000085ac0eac55a62840121c5bc75368987a52267086000000000000000000000000a423b83f5e8c5a2b47676316f22b91e6dfce3cd1
Deployed Bytecode
0x60806040526004361061031a5760003560e01c8063715018a6116101ab578063b150a6f6116100f7578063da3ef23f11610095578063f2c4ce1e1161006f578063f2c4ce1e14610bac578063f2fde38b14610bd5578063f99031a714610bfe578063fc1a1c3614610c3b5761031a565b8063da3ef23f14610b1b578063e14ca35314610b44578063e985e9c514610b6f5761031a565b8063bcb96f52116100d1578063bcb96f5214610a5f578063c668286214610a88578063c87b56dd14610ab3578063d5abeb0114610af05761031a565b8063b150a6f6146109e0578063b88d4fde14610a0b578063b88fe6a314610a345761031a565b806395d89b4111610164578063a0712d681161013e578063a0712d6814610947578063a22cb46514610963578063a475b5dd1461098c578063a526c5d9146109a35761031a565b806395d89b41146108c85780639f181b5e146108f3578063a02956441461091e5761031a565b8063715018a6146107dc578063795f2cf8146107f357806384c4bd4b1461081e5780638da5cb5b146108495780638dd94bba14610874578063945ec9dd1461089d5761031a565b80633ccfd60b1161026a5780635c975abb11610223578063636e746b116101fd578063636e746b1461071e5780636b150b13146107495780636c0360eb1461077457806370a082311461079f5761031a565b80635c975abb1461068d5780635e1045ec146106b85780636352211e146106e15761031a565b80633ccfd60b1461058c57806342842e0e14610596578063438b6300146105bf5780634f6ccce7146105fc578063518302271461063957806355f804b3146106645761031a565b806315f91c18116102d7578063279a669e116102b1578063279a669e146104c05780632acc659e146104e95780632f745c591461052657806339745791146105635761031a565b806315f91c181461044157806318160ddd1461046c57806323b872dd146104975761031a565b806301ffc9a71461031f57806302329a291461035c57806306fdde0314610385578063081812fc146103b0578063081c8c44146103ed578063095ea7b314610418575b600080fd5b34801561032b57600080fd5b5061034660048036038101906103419190614187565b610c66565b604051610353919061487e565b60405180910390f35b34801561036857600080fd5b50610383600480360381019061037e919061415a565b610ce0565b005b34801561039157600080fd5b5061039a610d79565b6040516103a791906148b4565b60405180910390f35b3480156103bc57600080fd5b506103d760048036038101906103d2919061422a565b610e0b565b6040516103e491906147f5565b60405180910390f35b3480156103f957600080fd5b50610402610e90565b60405161040f91906148b4565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a919061404c565b610f1e565b005b34801561044d57600080fd5b50610456611036565b6040516104639190614bb6565b60405180910390f35b34801561047857600080fd5b5061048161105e565b60405161048e9190614bb6565b60405180910390f35b3480156104a357600080fd5b506104be60048036038101906104b99190613f36565b61106b565b005b3480156104cc57600080fd5b506104e760048036038101906104e291906140d9565b6110cb565b005b3480156104f557600080fd5b50610510600480360381019061050b9190613ec9565b611215565b60405161051d9190614bb6565b60405180910390f35b34801561053257600080fd5b5061054d6004803603810190610548919061404c565b611306565b60405161055a9190614bb6565b60405180910390f35b34801561056f57600080fd5b5061058a6004803603810190610585919061408c565b6113ab565b005b6105946114cc565b005b3480156105a257600080fd5b506105bd60048036038101906105b89190613f36565b6115c8565b005b3480156105cb57600080fd5b506105e660048036038101906105e19190613ec9565b6115e8565b6040516105f3919061485c565b60405180910390f35b34801561060857600080fd5b50610623600480360381019061061e919061422a565b611696565b6040516106309190614bb6565b60405180910390f35b34801561064557600080fd5b5061064e611707565b60405161065b919061487e565b60405180910390f35b34801561067057600080fd5b5061068b600480360381019061068691906141e1565b61171a565b005b34801561069957600080fd5b506106a26117b0565b6040516106af919061487e565b60405180910390f35b3480156106c457600080fd5b506106df60048036038101906106da919061408c565b6117c3565b005b3480156106ed57600080fd5b506107086004803603810190610703919061422a565b6118e4565b60405161071591906147f5565b60405180910390f35b34801561072a57600080fd5b50610733611996565b6040516107409190614bb6565b60405180910390f35b34801561075557600080fd5b5061075e61199c565b60405161076b9190614899565b60405180910390f35b34801561078057600080fd5b506107896119c2565b60405161079691906148b4565b60405180910390f35b3480156107ab57600080fd5b506107c660048036038101906107c19190613ec9565b611a50565b6040516107d39190614bb6565b60405180910390f35b3480156107e857600080fd5b506107f1611b08565b005b3480156107ff57600080fd5b50610808611b90565b6040516108159190614899565b60405180910390f35b34801561082a57600080fd5b50610833611bb6565b6040516108409190614bb6565b60405180910390f35b34801561085557600080fd5b5061085e611bc2565b60405161086b91906147f5565b60405180910390f35b34801561088057600080fd5b5061089b6004803603810190610896919061422a565b611bec565b005b3480156108a957600080fd5b506108b2611c72565b6040516108bf9190614bb6565b60405180910390f35b3480156108d457600080fd5b506108dd611c78565b6040516108ea91906148b4565b60405180910390f35b3480156108ff57600080fd5b50610908611d0a565b6040516109159190614bb6565b60405180910390f35b34801561092a57600080fd5b506109456004803603810190610940919061422a565b611d14565b005b610961600480360381019061095c919061422a565b611d9a565b005b34801561096f57600080fd5b5061098a6004803603810190610985919061400c565b611f57565b005b34801561099857600080fd5b506109a1611f6d565b005b3480156109af57600080fd5b506109ca60048036038101906109c59190613ec9565b612006565b6040516109d7919061487e565b60405180910390f35b3480156109ec57600080fd5b506109f5612059565b604051610a029190614bb6565b60405180910390f35b348015610a1757600080fd5b50610a326004803603810190610a2d9190613f89565b61205f565b005b348015610a4057600080fd5b50610a496120c1565b604051610a569190614899565b60405180910390f35b348015610a6b57600080fd5b50610a866004803603810190610a81919061422a565b6120e7565b005b348015610a9457600080fd5b50610a9d61216d565b604051610aaa91906148b4565b60405180910390f35b348015610abf57600080fd5b50610ada6004803603810190610ad5919061422a565b6121fb565b604051610ae791906148b4565b60405180910390f35b348015610afc57600080fd5b50610b05612354565b604051610b129190614bb6565b60405180910390f35b348015610b2757600080fd5b50610b426004803603810190610b3d91906141e1565b61235a565b005b348015610b5057600080fd5b50610b596123f0565b604051610b669190614bb6565b60405180910390f35b348015610b7b57600080fd5b50610b966004803603810190610b919190613ef6565b612411565b604051610ba3919061487e565b60405180910390f35b348015610bb857600080fd5b50610bd36004803603810190610bce91906141e1565b6124a5565b005b348015610be157600080fd5b50610bfc6004803603810190610bf79190613ec9565b61253b565b005b348015610c0a57600080fd5b50610c256004803603810190610c209190613ec9565b612633565b604051610c32919061487e565b60405180910390f35b348015610c4757600080fd5b50610c50612689565b604051610c5d9190614bb6565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610cd95750610cd88261268f565b5b9050919050565b610ce8612771565b73ffffffffffffffffffffffffffffffffffffffff16610d06611bc2565b73ffffffffffffffffffffffffffffffffffffffff1614610d5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5390614a96565b60405180910390fd5b80601960006101000a81548160ff02191690831515021790555050565b606060008054610d8890614ef5565b80601f0160208091040260200160405190810160405280929190818152602001828054610db490614ef5565b8015610e015780601f10610dd657610100808354040283529160200191610e01565b820191906000526020600020905b815481529060010190602001808311610de457829003601f168201915b5050505050905090565b6000610e1682612779565b610e55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4c90614a76565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600f8054610e9d90614ef5565b80601f0160208091040260200160405190810160405280929190818152602001828054610ec990614ef5565b8015610f165780601f10610eeb57610100808354040283529160200191610f16565b820191906000526020600020905b815481529060010190602001808311610ef957829003601f168201915b505050505081565b6000610f29826118e4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9190614b16565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610fb9612771565b73ffffffffffffffffffffffffffffffffffffffff161480610fe85750610fe781610fe2612771565b612411565b5b611027576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101e906149d6565b60405180910390fd5b61103183836127e5565b505050565b60007f0000000000000000000000000000000000000000000000000000000000001068905090565b6000600880549050905090565b61107c611076612771565b8261289e565b6110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b290614b56565b60405180910390fd5b6110c683838361297c565b505050565b6110d3612771565b73ffffffffffffffffffffffffffffffffffffffff166110f1611bc2565b73ffffffffffffffffffffffffffffffffffffffff1614611147576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113e90614a96565b60405180910390fd5b60005b8484905081101561120e57600083838381811061116a5761116961508e565b5b90506020020135905060005b818110156111f957600061118a6018612be3565b6111946018612bf9565b90506016548111156111db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d290614a36565b60405180910390fd5b6111e53382612c07565b5080806111f190614f58565b915050611176565b5050808061120690614f58565b91505061114a565b5050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127d90614af6565b60405180910390fd5b601354601454116112cb5761129a82612633565b156112a9576014549050611301565b6112b282612006565b156112c1576013549050611301565b6015549050611301565b6112d482612006565b156112e3576013549050611301565b6112ec82612633565b156112fb576014549050611301565b60155490505b919050565b600061131183611a50565b8210611352576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611349906148d6565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6113b3612771565b73ffffffffffffffffffffffffffffffffffffffff166113d1611bc2565b73ffffffffffffffffffffffffffffffffffffffff1614611427576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141e90614a96565b60405180910390fd5b60005b828290508110156114c7576000601a600085858581811061144e5761144d61508e565b5b90506020020160208101906114639190613ec9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806114bf90614f58565b91505061142a565b505050565b6114d4612771565b73ffffffffffffffffffffffffffffffffffffffff166114f2611bc2565b73ffffffffffffffffffffffffffffffffffffffff1614611548576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153f90614a96565b60405180910390fd5b6000611552611bc2565b73ffffffffffffffffffffffffffffffffffffffff1647604051611575906147e0565b60006040518083038185875af1925050503d80600081146115b2576040519150601f19603f3d011682016040523d82523d6000602084013e6115b7565b606091505b50509050806115c557600080fd5b50565b6115e38383836040518060200160405280600081525061205f565b505050565b606060006115f583611a50565b905060008167ffffffffffffffff811115611613576116126150bd565b5b6040519080825280602002602001820160405280156116415781602001602082028036833780820191505090505b50905060005b8281101561168b576116598582611306565b82828151811061166c5761166b61508e565b5b602002602001018181525050808061168390614f58565b915050611647565b508092505050919050565b60006116a061105e565b82106116e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d890614b76565b60405180910390fd5b600882815481106116f5576116f461508e565b5b90600052602060002001549050919050565b601960019054906101000a900460ff1681565b611722612771565b73ffffffffffffffffffffffffffffffffffffffff16611740611bc2565b73ffffffffffffffffffffffffffffffffffffffff1614611796576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178d90614a96565b60405180910390fd5b80600d90805190602001906117ac929190613c1c565b5050565b601960009054906101000a900460ff1681565b6117cb612771565b73ffffffffffffffffffffffffffffffffffffffff166117e9611bc2565b73ffffffffffffffffffffffffffffffffffffffff161461183f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183690614a96565b60405180910390fd5b60005b828290508110156118df576001601a60008585858181106118665761186561508e565b5b905060200201602081019061187b9190613ec9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806118d790614f58565b915050611842565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561198d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198490614a16565b60405180910390fd5b80915050919050565b60135481565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d80546119cf90614ef5565b80601f01602080910402602001604051908101604052809291908181526020018280546119fb90614ef5565b8015611a485780601f10611a1d57610100808354040283529160200191611a48565b820191906000526020600020905b815481529060010190602001808311611a2b57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ac1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab8906149f6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611b10612771565b73ffffffffffffffffffffffffffffffffffffffff16611b2e611bc2565b73ffffffffffffffffffffffffffffffffffffffff1614611b84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7b90614a96565b60405180910390fd5b611b8e6000612c25565b565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60188060000154905081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611bf4612771565b73ffffffffffffffffffffffffffffffffffffffff16611c12611bc2565b73ffffffffffffffffffffffffffffffffffffffff1614611c68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5f90614a96565b60405180910390fd5b8060138190555050565b60155481565b606060018054611c8790614ef5565b80601f0160208091040260200160405190810160405280929190818152602001828054611cb390614ef5565b8015611d005780601f10611cd557610100808354040283529160200191611d00565b820191906000526020600020905b815481529060010190602001808311611ce357829003601f168201915b5050505050905090565b6000600b54905090565b611d1c612771565b73ffffffffffffffffffffffffffffffffffffffff16611d3a611bc2565b73ffffffffffffffffffffffffffffffffffffffff1614611d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8790614a96565b60405180910390fd5b8060148190555050565b601960009054906101000a900460ff1615611dea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de190614ab6565b60405180910390fd5b60008111611e2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2490614b96565b60405180910390fd5b6000611e3833611215565b9050611e42611bc2565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ec95760008282611e829190614d7b565b905080341015611ec7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebe90614b36565b60405180910390fd5b505b6000600190505b828111611f52576000611ee36018612be3565b611eed6018612bf9565b9050601654811115611f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2b90614a36565b60405180910390fd5b611f3e3382612c07565b508080611f4a90614f58565b915050611ed0565b505050565b611f69611f62612771565b8383612ceb565b5050565b611f75612771565b73ffffffffffffffffffffffffffffffffffffffff16611f93611bc2565b73ffffffffffffffffffffffffffffffffffffffff1614611fe9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe090614a96565b60405180910390fd5b6001601960016101000a81548160ff021916908315150217905550565b600061201182612e58565b80612021575061202082612f0e565b5b80612031575061203082612fe4565b5b8061204157506120408261309a565b5b1561204f5760019050612054565b600090505b919050565b60175481565b61207061206a612771565b8361289e565b6120af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a690614b56565b60405180910390fd5b6120bb84848484613150565b50505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6120ef612771565b73ffffffffffffffffffffffffffffffffffffffff1661210d611bc2565b73ffffffffffffffffffffffffffffffffffffffff1614612163576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215a90614a96565b60405180910390fd5b8060158190555050565b600e805461217a90614ef5565b80601f01602080910402602001604051908101604052809291908181526020018280546121a690614ef5565b80156121f35780601f106121c8576101008083540402835291602001916121f3565b820191906000526020600020905b8154815290600101906020018083116121d657829003601f168201915b505050505081565b606061220682612779565b612245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223c90614ad6565b60405180910390fd5b60001515601960019054906101000a900460ff16151514156122f357600f805461226e90614ef5565b80601f016020809104026020016040519081016040528092919081815260200182805461229a90614ef5565b80156122e75780601f106122bc576101008083540402835291602001916122e7565b820191906000526020600020905b8154815290600101906020018083116122ca57829003601f168201915b5050505050905061234f565b60006122fd6131ac565b9050600081511161231d576040518060200160405280600081525061234b565b806123278461323e565b600e60405160200161233b939291906147af565b6040516020818303038152906040525b9150505b919050565b60165481565b612362612771565b73ffffffffffffffffffffffffffffffffffffffff16612380611bc2565b73ffffffffffffffffffffffffffffffffffffffff16146123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd90614a96565b60405180910390fd5b80600e90805190602001906123ec929190613c1c565b5050565b60006123fa611d0a565b612402611036565b61240c9190614dd5565b905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6124ad612771565b73ffffffffffffffffffffffffffffffffffffffff166124cb611bc2565b73ffffffffffffffffffffffffffffffffffffffff1614612521576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251890614a96565b60405180910390fd5b80600f9080519060200190612537929190613c1c565b5050565b612543612771565b73ffffffffffffffffffffffffffffffffffffffff16612561611bc2565b73ffffffffffffffffffffffffffffffffffffffff16146125b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ae90614a96565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612627576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261e90614916565b60405180910390fd5b61263081612c25565b50565b6000601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60145481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061275a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061276a57506127698261339f565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612858836118e4565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006128a982612779565b6128e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128df906149b6565b60405180910390fd5b60006128f3836118e4565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061293557506129348185612411565b5b8061297357508373ffffffffffffffffffffffffffffffffffffffff1661295b84610e0b565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661299c826118e4565b73ffffffffffffffffffffffffffffffffffffffff16146129f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e990614936565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5990614976565b60405180910390fd5b612a6d838383613409565b612a786000826127e5565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ac89190614dd5565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b1f9190614cf4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bde83838361351d565b505050565b6001816000016000828254019250508190555050565b600081600001549050919050565b612c21828260405180602001604052806000815250613522565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5190614996565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612e4b919061487e565b60405180910390a3505050565b600080601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401612eb691906147f5565b60206040518083038186803b158015612ece57600080fd5b505afa158015612ee2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f069190614257565b119050919050565b600080601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401612f6c91906147f5565b60206040518083038186803b158015612f8457600080fd5b505afa158015612f98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fbc9190614257565b905069152d02c7e14af68000008110612fd9576001915050612fdf565b60009150505b919050565b600080601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b815260040161304291906147f5565b60206040518083038186803b15801561305a57600080fd5b505afa15801561306e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130929190614257565b119050919050565b600080601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016130f891906147f5565b60206040518083038186803b15801561311057600080fd5b505afa158015613124573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131489190614257565b119050919050565b61315b84848461297c565b6131678484848461357d565b6131a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319d906148f6565b60405180910390fd5b50505050565b6060600d80546131bb90614ef5565b80601f01602080910402602001604051908101604052809291908181526020018280546131e790614ef5565b80156132345780601f1061320957610100808354040283529160200191613234565b820191906000526020600020905b81548152906001019060200180831161321757829003601f168201915b5050505050905090565b60606000821415613286576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061339a565b600082905060005b600082146132b85780806132a190614f58565b915050600a826132b19190614d4a565b915061328e565b60008167ffffffffffffffff8111156132d4576132d36150bd565b5b6040519080825280601f01601f1916602001820160405280156133065781602001600182028036833780820191505090505b5090505b600085146133935760018261331f9190614dd5565b9150600a8561332e9190614fa1565b603061333a9190614cf4565b60f81b8183815181106133505761334f61508e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561338c9190614d4a565b945061330a565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613414838383613714565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156134575761345281613719565b613496565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613495576134948382613762565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134d9576134d4816138cf565b613518565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146135175761351682826139a0565b5b5b505050565b505050565b61352c8383613a1f565b613539600084848461357d565b613578576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161356f906148f6565b60405180910390fd5b505050565b600061359e8473ffffffffffffffffffffffffffffffffffffffff16613bf9565b15613707578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026135c7612771565b8786866040518563ffffffff1660e01b81526004016135e99493929190614810565b602060405180830381600087803b15801561360357600080fd5b505af192505050801561363457506040513d601f19601f8201168201806040525081019061363191906141b4565b60015b6136b7573d8060008114613664576040519150601f19603f3d011682016040523d82523d6000602084013e613669565b606091505b506000815114156136af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136a6906148f6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061370c565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161376f84611a50565b6137799190614dd5565b905060006007600084815260200190815260200160002054905081811461385e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506138e39190614dd5565b90506000600960008481526020019081526020016000205490506000600883815481106139135761391261508e565b5b9060005260206000200154905080600883815481106139355761393461508e565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806139845761398361505f565b5b6001900381819060005260206000200160009055905550505050565b60006139ab83611a50565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a8690614a56565b60405180910390fd5b613a9881612779565b15613ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613acf90614956565b60405180910390fd5b613ae460008383613409565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613b349190614cf4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613bf56000838361351d565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054613c2890614ef5565b90600052602060002090601f016020900481019282613c4a5760008555613c91565b82601f10613c6357805160ff1916838001178555613c91565b82800160010185558215613c91579182015b82811115613c90578251825591602001919060010190613c75565b5b509050613c9e9190613ca2565b5090565b5b80821115613cbb576000816000905550600101613ca3565b5090565b6000613cd2613ccd84614bf6565b614bd1565b905082815260208101848484011115613cee57613ced6150fb565b5b613cf9848285614eb3565b509392505050565b6000613d14613d0f84614c27565b614bd1565b905082815260208101848484011115613d3057613d2f6150fb565b5b613d3b848285614eb3565b509392505050565b600081359050613d52816156e1565b92915050565b60008083601f840112613d6e57613d6d6150f1565b5b8235905067ffffffffffffffff811115613d8b57613d8a6150ec565b5b602083019150836020820283011115613da757613da66150f6565b5b9250929050565b60008083601f840112613dc457613dc36150f1565b5b8235905067ffffffffffffffff811115613de157613de06150ec565b5b602083019150836020820283011115613dfd57613dfc6150f6565b5b9250929050565b600081359050613e13816156f8565b92915050565b600081359050613e288161570f565b92915050565b600081519050613e3d8161570f565b92915050565b600082601f830112613e5857613e576150f1565b5b8135613e68848260208601613cbf565b91505092915050565b600082601f830112613e8657613e856150f1565b5b8135613e96848260208601613d01565b91505092915050565b600081359050613eae81615726565b92915050565b600081519050613ec381615726565b92915050565b600060208284031215613edf57613ede615105565b5b6000613eed84828501613d43565b91505092915050565b60008060408385031215613f0d57613f0c615105565b5b6000613f1b85828601613d43565b9250506020613f2c85828601613d43565b9150509250929050565b600080600060608486031215613f4f57613f4e615105565b5b6000613f5d86828701613d43565b9350506020613f6e86828701613d43565b9250506040613f7f86828701613e9f565b9150509250925092565b60008060008060808587031215613fa357613fa2615105565b5b6000613fb187828801613d43565b9450506020613fc287828801613d43565b9350506040613fd387828801613e9f565b925050606085013567ffffffffffffffff811115613ff457613ff3615100565b5b61400087828801613e43565b91505092959194509250565b6000806040838503121561402357614022615105565b5b600061403185828601613d43565b925050602061404285828601613e04565b9150509250929050565b6000806040838503121561406357614062615105565b5b600061407185828601613d43565b925050602061408285828601613e9f565b9150509250929050565b600080602083850312156140a3576140a2615105565b5b600083013567ffffffffffffffff8111156140c1576140c0615100565b5b6140cd85828601613d58565b92509250509250929050565b600080600080604085870312156140f3576140f2615105565b5b600085013567ffffffffffffffff81111561411157614110615100565b5b61411d87828801613d58565b9450945050602085013567ffffffffffffffff8111156141405761413f615100565b5b61414c87828801613dae565b925092505092959194509250565b6000602082840312156141705761416f615105565b5b600061417e84828501613e04565b91505092915050565b60006020828403121561419d5761419c615105565b5b60006141ab84828501613e19565b91505092915050565b6000602082840312156141ca576141c9615105565b5b60006141d884828501613e2e565b91505092915050565b6000602082840312156141f7576141f6615105565b5b600082013567ffffffffffffffff81111561421557614214615100565b5b61422184828501613e71565b91505092915050565b6000602082840312156142405761423f615105565b5b600061424e84828501613e9f565b91505092915050565b60006020828403121561426d5761426c615105565b5b600061427b84828501613eb4565b91505092915050565b60006142908383614791565b60208301905092915050565b6142a581614e09565b82525050565b60006142b682614c7d565b6142c08185614cab565b93506142cb83614c58565b8060005b838110156142fc5781516142e38882614284565b97506142ee83614c9e565b9250506001810190506142cf565b5085935050505092915050565b61431281614e1b565b82525050565b600061432382614c88565b61432d8185614cbc565b935061433d818560208601614ec2565b6143468161510a565b840191505092915050565b61435a81614e7d565b82525050565b600061436b82614c93565b6143758185614cd8565b9350614385818560208601614ec2565b61438e8161510a565b840191505092915050565b60006143a482614c93565b6143ae8185614ce9565b93506143be818560208601614ec2565b80840191505092915050565b600081546143d781614ef5565b6143e18186614ce9565b945060018216600081146143fc576001811461440d57614440565b60ff19831686528186019350614440565b61441685614c68565b60005b8381101561443857815481890152600182019150602081019050614419565b838801955050505b50505092915050565b6000614456602b83614cd8565b91506144618261511b565b604082019050919050565b6000614479603283614cd8565b91506144848261516a565b604082019050919050565b600061449c602683614cd8565b91506144a7826151b9565b604082019050919050565b60006144bf602583614cd8565b91506144ca82615208565b604082019050919050565b60006144e2601c83614cd8565b91506144ed82615257565b602082019050919050565b6000614505602483614cd8565b915061451082615280565b604082019050919050565b6000614528601983614cd8565b9150614533826152cf565b602082019050919050565b600061454b602c83614cd8565b9150614556826152f8565b604082019050919050565b600061456e603883614cd8565b915061457982615347565b604082019050919050565b6000614591602a83614cd8565b915061459c82615396565b604082019050919050565b60006145b4602983614cd8565b91506145bf826153e5565b604082019050919050565b60006145d7601683614cd8565b91506145e282615434565b602082019050919050565b60006145fa602083614cd8565b91506146058261545d565b602082019050919050565b600061461d602c83614cd8565b915061462882615486565b604082019050919050565b6000614640602083614cd8565b915061464b826154d5565b602082019050919050565b6000614663601683614cd8565b915061466e826154fe565b602082019050919050565b6000614686602f83614cd8565b915061469182615527565b604082019050919050565b60006146a9600d83614cd8565b91506146b482615576565b602082019050919050565b60006146cc602183614cd8565b91506146d78261559f565b604082019050919050565b60006146ef600083614ccd565b91506146fa826155ee565b600082019050919050565b6000614712601283614cd8565b915061471d826155f1565b602082019050919050565b6000614735603183614cd8565b91506147408261561a565b604082019050919050565b6000614758602c83614cd8565b915061476382615669565b604082019050919050565b600061477b601b83614cd8565b9150614786826156b8565b602082019050919050565b61479a81614e73565b82525050565b6147a981614e73565b82525050565b60006147bb8286614399565b91506147c78285614399565b91506147d382846143ca565b9150819050949350505050565b60006147eb826146e2565b9150819050919050565b600060208201905061480a600083018461429c565b92915050565b6000608082019050614825600083018761429c565b614832602083018661429c565b61483f60408301856147a0565b81810360608301526148518184614318565b905095945050505050565b6000602082019050818103600083015261487681846142ab565b905092915050565b60006020820190506148936000830184614309565b92915050565b60006020820190506148ae6000830184614351565b92915050565b600060208201905081810360008301526148ce8184614360565b905092915050565b600060208201905081810360008301526148ef81614449565b9050919050565b6000602082019050818103600083015261490f8161446c565b9050919050565b6000602082019050818103600083015261492f8161448f565b9050919050565b6000602082019050818103600083015261494f816144b2565b9050919050565b6000602082019050818103600083015261496f816144d5565b9050919050565b6000602082019050818103600083015261498f816144f8565b9050919050565b600060208201905081810360008301526149af8161451b565b9050919050565b600060208201905081810360008301526149cf8161453e565b9050919050565b600060208201905081810360008301526149ef81614561565b9050919050565b60006020820190508181036000830152614a0f81614584565b9050919050565b60006020820190508181036000830152614a2f816145a7565b9050919050565b60006020820190508181036000830152614a4f816145ca565b9050919050565b60006020820190508181036000830152614a6f816145ed565b9050919050565b60006020820190508181036000830152614a8f81614610565b9050919050565b60006020820190508181036000830152614aaf81614633565b9050919050565b60006020820190508181036000830152614acf81614656565b9050919050565b60006020820190508181036000830152614aef81614679565b9050919050565b60006020820190508181036000830152614b0f8161469c565b9050919050565b60006020820190508181036000830152614b2f816146bf565b9050919050565b60006020820190508181036000830152614b4f81614705565b9050919050565b60006020820190508181036000830152614b6f81614728565b9050919050565b60006020820190508181036000830152614b8f8161474b565b9050919050565b60006020820190508181036000830152614baf8161476e565b9050919050565b6000602082019050614bcb60008301846147a0565b92915050565b6000614bdb614bec565b9050614be78282614f27565b919050565b6000604051905090565b600067ffffffffffffffff821115614c1157614c106150bd565b5b614c1a8261510a565b9050602081019050919050565b600067ffffffffffffffff821115614c4257614c416150bd565b5b614c4b8261510a565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614cff82614e73565b9150614d0a83614e73565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d3f57614d3e614fd2565b5b828201905092915050565b6000614d5582614e73565b9150614d6083614e73565b925082614d7057614d6f615001565b5b828204905092915050565b6000614d8682614e73565b9150614d9183614e73565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614dca57614dc9614fd2565b5b828202905092915050565b6000614de082614e73565b9150614deb83614e73565b925082821015614dfe57614dfd614fd2565b5b828203905092915050565b6000614e1482614e53565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614e8882614e8f565b9050919050565b6000614e9a82614ea1565b9050919050565b6000614eac82614e53565b9050919050565b82818337600083830152505050565b60005b83811015614ee0578082015181840152602081019050614ec5565b83811115614eef576000848401525b50505050565b60006002820490506001821680614f0d57607f821691505b60208210811415614f2157614f20615030565b5b50919050565b614f308261510a565b810181811067ffffffffffffffff82111715614f4f57614f4e6150bd565b5b80604052505050565b6000614f6382614e73565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614f9657614f95614fd2565b5b600182019050919050565b6000614fac82614e73565b9150614fb783614e73565b925082614fc757614fc6615001565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f74686520636f6e74726163742069732070617573656400000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f6e6f742061646472657373203000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f6e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b6156ea81614e09565b81146156f557600080fd5b50565b61570181614e1b565b811461570c57600080fd5b50565b61571881614e27565b811461572357600080fd5b50565b61572f81614e73565b811461573a57600080fd5b5056fea26469706673582212202959e0b709cea55d3ab47a98e9e8bd3e9d4d40d2ac42d44d97bd663d1d3e686c64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000e4a36aa88d8380db252558104dbe0d71505af7a5000000000000000000000000b20115b8b176d72f077c4f93e95492870240a0b200000000000000000000000085ac0eac55a62840121c5bc75368987a52267086000000000000000000000000a423b83f5e8c5a2b47676316f22b91e6dfce3cd1
-----Decoded View---------------
Arg [0] : _armySoldier (address): 0xe4a36aa88d8380db252558104dbe0d71505af7a5
Arg [1] : _armyContract (address): 0xb20115b8b176d72f077c4f93e95492870240a0b2
Arg [2] : _armyCoalition (address): 0x85ac0eac55a62840121c5bc75368987a52267086
Arg [3] : _Jackals (address): 0xa423b83f5e8c5a2b47676316f22b91e6dfce3cd1
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000e4a36aa88d8380db252558104dbe0d71505af7a5
Arg [1] : 000000000000000000000000b20115b8b176d72f077c4f93e95492870240a0b2
Arg [2] : 00000000000000000000000085ac0eac55a62840121c5bc75368987a52267086
Arg [3] : 000000000000000000000000a423b83f5e8c5a2b47676316f22b91e6dfce3cd1
Deployed ByteCode Sourcemap
67806:7254:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61485:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73287:73;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48304:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49864:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68080:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49387:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21937:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62125:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50614:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70826:560;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69577:563;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61793:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73556:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74602:455;;;:::i;:::-;;51024:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71817:348;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62315:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68476:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72927:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68445:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73366:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47998:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68205:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68143:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67953:80;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47728:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26862:103;;;;;;;;;;;;;:::i;:::-;;68174:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68401:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26211:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74153:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68292:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48473:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22211:80;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74249:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70163:657;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50157:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72856:65;;;;;;;;;;;;;:::i;:::-;;73813:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68370:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51280:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68113:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74057:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68038:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72337:497;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68334:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73031:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22388:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50383:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73161:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27120:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71707:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68247:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61485:224;61587:4;61626:35;61611:50;;;:11;:50;;;;:90;;;;61665:36;61689:11;61665:23;:36::i;:::-;61611:90;61604:97;;61485:224;;;:::o;73287:73::-;26442:12;:10;:12::i;:::-;26431:23;;:7;:5;:7::i;:::-;:23;;;26423:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73348:6:::1;73339;;:15;;;;;;;;;;;;;;;;;;73287:73:::0;:::o;48304:100::-;48358:13;48391:5;48384:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48304:100;:::o;49864:221::-;49940:7;49968:16;49976:7;49968;:16::i;:::-;49960:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;50053:15;:24;50069:7;50053:24;;;;;;;;;;;;;;;;;;;;;50046:31;;49864:221;;;:::o;68080:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49387:411::-;49468:13;49484:23;49499:7;49484:14;:23::i;:::-;49468:39;;49532:5;49526:11;;:2;:11;;;;49518:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;49626:5;49610:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;49635:37;49652:5;49659:12;:10;:12::i;:::-;49635:16;:37::i;:::-;49610:62;49588:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;49769:21;49778:2;49782:7;49769:8;:21::i;:::-;49457:341;49387:411;;:::o;21937:96::-;21988:7;22009:19;22002:26;;21937:96;:::o;62125:113::-;62186:7;62213:10;:17;;;;62206:24;;62125:113;:::o;50614:339::-;50809:41;50828:12;:10;:12::i;:::-;50842:7;50809:18;:41::i;:::-;50801:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;50917:28;50927:4;50933:2;50937:7;50917:9;:28::i;:::-;50614:339;;;:::o;70826:560::-;26442:12;:10;:12::i;:::-;26431:23;;:7;:5;:7::i;:::-;:23;;;26423:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70934:9:::1;70929:450;70953:7;;:14;;70949:1;:18;70929:450;;;70985:20;71008:6;;71015:1;71008:9;;;;;;;:::i;:::-;;;;;;;;70985:32;;71033:9;71028:344;71052:12;71048:1;:16;71028:344;;;71130:15;71160:27;:15;:25;:27::i;:::-;71213:25;:15;:23;:25::i;:::-;71203:35;;71273:9;;71262:7;:20;;71254:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;71326:30;71336:10;71348:7;71326:9;:30::i;:::-;71071:301;71066:3;;;;;:::i;:::-;;;;71028:344;;;;70974:405;70969:3;;;;;:::i;:::-;;;;70929:450;;;;70826:560:::0;;;;:::o;69577:563::-;69634:7;69678:1;69658:22;;:8;:22;;;;69650:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;69727:11;;69709:14;;:29;69705:430;;69755:21;69767:8;69755:11;:21::i;:::-;69751:192;;;69796:14;;69789:21;;;;69751:192;69832:20;69843:8;69832:10;:20::i;:::-;69828:115;;;69872:11;;69865:18;;;;69828:115;69920:11;;69913:18;;;;69705:430;69960:20;69971:8;69960:10;:20::i;:::-;69956:179;;;70000:11;;69993:18;;;;69956:179;70029:21;70041:8;70029:11;:21::i;:::-;70025:110;;;70070:14;;70063:21;;;;70025:110;70116:11;;70109:18;;69577:563;;;;:::o;61793:256::-;61890:7;61926:23;61943:5;61926:16;:23::i;:::-;61918:5;:31;61910:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;62015:12;:19;62028:5;62015:19;;;;;;;;;;;;;;;:26;62035:5;62015:26;;;;;;;;;;;;62008:33;;61793:256;;;;:::o;73556:186::-;26442:12;:10;:12::i;:::-;26431:23;;:7;:5;:7::i;:::-;:23;;;26423:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73640:6:::1;73635:94;73656:9;;:16;;73652:1;:20;73635:94;;;73716:5;73690:9;:23;73700:9;;73710:1;73700:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;73690:23;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;73674:3;;;;;:::i;:::-;;;;73635:94;;;;73556:186:::0;;:::o;74602:455::-;26442:12;:10;:12::i;:::-;26431:23;;:7;:5;:7::i;:::-;:23;;;26423:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74879:7:::1;74900;:5;:7::i;:::-;74892:21;;74921;74892:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74878:69;;;74962:2;74954:11;;;::::0;::::1;;74647:410;74602:455::o:0;51024:185::-;51162:39;51179:4;51185:2;51189:7;51162:39;;;;;;;;;;;;:16;:39::i;:::-;51024:185;;;:::o;71817:348::-;71892:16;71920:23;71946:17;71956:6;71946:9;:17::i;:::-;71920:43;;71970:25;72012:15;71998:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71970:58;;72040:9;72035:103;72055:15;72051:1;:19;72035:103;;;72100:30;72120:6;72128:1;72100:19;:30::i;:::-;72086:8;72095:1;72086:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;72072:3;;;;;:::i;:::-;;;;72035:103;;;;72151:8;72144:15;;;;71817:348;;;:::o;62315:233::-;62390:7;62426:30;:28;:30::i;:::-;62418:5;:38;62410:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;62523:10;62534:5;62523:17;;;;;;;;:::i;:::-;;;;;;;;;;62516:24;;62315:233;;;:::o;68476:27::-;;;;;;;;;;;;;:::o;72927:98::-;26442:12;:10;:12::i;:::-;26431:23;;:7;:5;:7::i;:::-;:23;;;26423:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73008:11:::1;72998:7;:21;;;;;;;;;;;;:::i;:::-;;72927:98:::0;:::o;68445:26::-;;;;;;;;;;;;;:::o;73366:182::-;26442:12;:10;:12::i;:::-;26431:23;;:7;:5;:7::i;:::-;:23;;;26423:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73447:6:::1;73442:93;73463:9;;:16;;73459:1;:20;73442:93;;;73523:4;73497:9;:23;73507:9;;73517:1;73507:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;73497:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;73481:3;;;;;:::i;:::-;;;;73442:93;;;;73366:182:::0;;:::o;47998:239::-;48070:7;48090:13;48106:7;:16;48114:7;48106:16;;;;;;;;;;;;;;;;;;;;;48090:32;;48158:1;48141:19;;:5;:19;;;;48133:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;48224:5;48217:12;;;47998:239;;;:::o;68205:37::-;;;;:::o;68143:26::-;;;;;;;;;;;;;:::o;67953:80::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47728:208::-;47800:7;47845:1;47828:19;;:5;:19;;;;47820:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;47912:9;:16;47922:5;47912:16;;;;;;;;;;;;;;;;47905:23;;47728:208;;;:::o;26862:103::-;26442:12;:10;:12::i;:::-;26431:23;;:7;:5;:7::i;:::-;:23;;;26423:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26927:30:::1;26954:1;26927:18;:30::i;:::-;26862:103::o:0;68174:26::-;;;;;;;;;;;;;:::o;68401:39::-;;;;;;;;;:::o;26211:87::-;26257:7;26284:6;;;;;;;;;;;26277:13;;26211:87;:::o;74153:90::-;26442:12;:10;:12::i;:::-;26431:23;;:7;:5;:7::i;:::-;:23;;;26423:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74232:5:::1;74218:11;:19;;;;74153:90:::0;:::o;68292:37::-;;;;:::o;48473:104::-;48529:13;48562:7;48555:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48473:104;:::o;22211:80::-;22254:7;22275:11;;22268:18;;22211:80;:::o;74249:96::-;26442:12;:10;:12::i;:::-;26431:23;;:7;:5;:7::i;:::-;:23;;;26423:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74334:5:::1;74317:14;:22;;;;74249:96:::0;:::o;70163:657::-;70224:6;;;;;;;;;;;70223:7;70215:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;70281:1;70272:6;:10;70264:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;70321:12;70347:20;70356:10;70347:8;:20::i;:::-;70340:27;;70394:7;:5;:7::i;:::-;70380:21;;:10;:21;;;70376:141;;70415:14;70439:6;70432:4;:13;;;;:::i;:::-;70415:30;;70477:9;70464;:22;;70456:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;70403:114;70376:141;70528:9;70540:1;70528:13;;70523:292;70548:6;70543:1;:11;70523:292;;70581:15;70611:27;:15;:25;:27::i;:::-;70664:25;:15;:23;:25::i;:::-;70654:35;;70724:9;;70713:7;:20;;70705:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;70777:30;70787:10;70799:7;70777:9;:30::i;:::-;70561:254;70556:3;;;;;:::i;:::-;;;;70523:292;;;;70208:612;70163:657;:::o;50157:155::-;50252:52;50271:12;:10;:12::i;:::-;50285:8;50295;50252:18;:52::i;:::-;50157:155;;:::o;72856:65::-;26442:12;:10;:12::i;:::-;26431:23;;:7;:5;:7::i;:::-;:23;;;26423:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72911:4:::1;72900:8;;:15;;;;;;;;;;;;;;;;;;72856:65::o:0;73813:238::-;73872:4;73889:23;73903:8;73889:13;:23::i;:::-;:44;;;;73916:17;73924:8;73916:7;:17::i;:::-;73889:44;:73;;;;73937:25;73953:8;73937:15;:25::i;:::-;73889:73;:96;;;;73966:19;73976:8;73966:9;:19::i;:::-;73889:96;73885:161;;;74001:4;73994:11;;;;73885:161;74033:5;74026:12;;73813:238;;;;:::o;68370:26::-;;;;:::o;51280:328::-;51455:41;51474:12;:10;:12::i;:::-;51488:7;51455:18;:41::i;:::-;51447:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;51561:39;51575:4;51581:2;51585:7;51594:5;51561:13;:39::i;:::-;51280:328;;;;:::o;68113:25::-;;;;;;;;;;;;;:::o;74057:90::-;26442:12;:10;:12::i;:::-;26431:23;;:7;:5;:7::i;:::-;:23;;;26423:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74136:5:::1;74122:11;:19;;;;74057:90:::0;:::o;68038:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;72337:497::-;72435:13;72476:16;72484:7;72476;:16::i;:::-;72460:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;72585:5;72573:17;;:8;;;;;;;;;;;:17;;;72570:62;;;72610:14;72603:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72570:62;72640:28;72671:10;:8;:10::i;:::-;72640:41;;72726:1;72701:14;72695:28;:32;:133;;;;;;;;;;;;;;;;;72763:14;72779:18;:7;:16;:18::i;:::-;72799:13;72746:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;72695:133;72688:140;;;72337:497;;;;:::o;68334:31::-;;;;:::o;73031:122::-;26442:12;:10;:12::i;:::-;26431:23;;:7;:5;:7::i;:::-;:23;;;26423:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73130:17:::1;73114:13;:33;;;;;;;;;;;;:::i;:::-;;73031:122:::0;:::o;22388:113::-;22440:7;22484:12;:10;:12::i;:::-;22461:20;:18;:20::i;:::-;:35;;;;:::i;:::-;22454:42;;22388:113;:::o;50383:164::-;50480:4;50504:18;:25;50523:5;50504:25;;;;;;;;;;;;;;;:35;50530:8;50504:35;;;;;;;;;;;;;;;;;;;;;;;;;50497:42;;50383:164;;;;:::o;73161:120::-;26442:12;:10;:12::i;:::-;26431:23;;:7;:5;:7::i;:::-;:23;;;26423:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73260:15:::1;73243:14;:32;;;;;;;;;;;;:::i;:::-;;73161:120:::0;:::o;27120:201::-;26442:12;:10;:12::i;:::-;26431:23;;:7;:5;:7::i;:::-;:23;;;26423:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27229:1:::1;27209:22;;:8;:22;;;;27201:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27285:28;27304:8;27285:18;:28::i;:::-;27120:201:::0;:::o;71707:104::-;71766:4;71786:9;:19;71796:8;71786:19;;;;;;;;;;;;;;;;;;;;;;;;;71779:26;;71707:104;;;:::o;68247:40::-;;;;:::o;47359:305::-;47461:4;47513:25;47498:40;;;:11;:40;;;;:105;;;;47570:33;47555:48;;;:11;:48;;;;47498:105;:158;;;;47620:36;47644:11;47620:23;:36::i;:::-;47498:158;47478:178;;47359:305;;;:::o;2323:98::-;2376:7;2403:10;2396:17;;2323:98;:::o;53118:127::-;53183:4;53235:1;53207:30;;:7;:16;53215:7;53207:16;;;;;;;;;;;;;;;;;;;;;:30;;;;53200:37;;53118:127;;;:::o;57264:174::-;57366:2;57339:15;:24;57355:7;57339:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;57422:7;57418:2;57384:46;;57393:23;57408:7;57393:14;:23::i;:::-;57384:46;;;;;;;;;;;;57264:174;;:::o;53412:348::-;53505:4;53530:16;53538:7;53530;:16::i;:::-;53522:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;53606:13;53622:23;53637:7;53622:14;:23::i;:::-;53606:39;;53675:5;53664:16;;:7;:16;;;:52;;;;53684:32;53701:5;53708:7;53684:16;:32::i;:::-;53664:52;:87;;;;53744:7;53720:31;;:20;53732:7;53720:11;:20::i;:::-;:31;;;53664:87;53656:96;;;53412:348;;;;:::o;56521:625::-;56680:4;56653:31;;:23;56668:7;56653:14;:23::i;:::-;:31;;;56645:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;56759:1;56745:16;;:2;:16;;;;56737:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;56815:39;56836:4;56842:2;56846:7;56815:20;:39::i;:::-;56919:29;56936:1;56940:7;56919:8;:29::i;:::-;56980:1;56961:9;:15;56971:4;56961:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;57009:1;56992:9;:13;57002:2;56992:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;57040:2;57021:7;:16;57029:7;57021:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;57079:7;57075:2;57060:27;;57069:4;57060:27;;;;;;;;;;;;57100:38;57120:4;57126:2;57130:7;57100:19;:38::i;:::-;56521:625;;;:::o;1173:127::-;1280:1;1262:7;:14;;;:19;;;;;;;;;;;1173:127;:::o;1051:114::-;1116:7;1143;:14;;;1136:21;;1051:114;;;:::o;54102:110::-;54178:26;54188:2;54192:7;54178:26;;;;;;;;;;;;:9;:26::i;:::-;54102:110;;:::o;27481:191::-;27555:16;27574:6;;;;;;;;;;;27555:25;;27600:8;27591:6;;:17;;;;;;;;;;;;;;;;;;27655:8;27624:40;;27645:8;27624:40;;;;;;;;;;;;27544:128;27481:191;:::o;57580:315::-;57735:8;57726:17;;:5;:17;;;;57718:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;57822:8;57784:18;:25;57803:5;57784:25;;;;;;;;;;;;;;;:35;57810:8;57784:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;57868:8;57846:41;;57861:5;57846:41;;;57878:8;57846:41;;;;;;:::i;:::-;;;;;;;;57580:315;;;:::o;69066:124::-;69129:4;69183:1;69149:11;;;;;;;;;;;:21;;;69171:8;69149:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:35;69142:42;;69066:124;;;:::o;74351:245::-;74409:4;74422:12;74443;;;;;;;;;;;74437:29;;;74467:8;74437:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74422:54;;74498:24;74487:7;:35;74483:108;;74542:4;74535:11;;;;;74483:108;74578:5;74571:12;;;74351:245;;;;:::o;69194:127::-;69259:4;69314:1;69279:12;;;;;;;;;;;:22;;;69302:8;69279:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:36;69272:43;;69194:127;;;:::o;69325:121::-;69384:4;69439:1;69404:12;;;;;;;;;;;:22;;;69427:8;69404:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:36;69397:43;;69325:121;;;:::o;52490:315::-;52647:28;52657:4;52663:2;52667:7;52647:9;:28::i;:::-;52694:48;52717:4;52723:2;52727:7;52736:5;52694:22;:48::i;:::-;52686:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;52490:315;;;;:::o;69469:102::-;69529:13;69558:7;69551:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69469:102;:::o;19491:723::-;19547:13;19777:1;19768:5;:10;19764:53;;;19795:10;;;;;;;;;;;;;;;;;;;;;19764:53;19827:12;19842:5;19827:20;;19858:14;19883:78;19898:1;19890:4;:9;19883:78;;19916:8;;;;;:::i;:::-;;;;19947:2;19939:10;;;;;:::i;:::-;;;19883:78;;;19971:19;20003:6;19993:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19971:39;;20021:154;20037:1;20028:5;:10;20021:154;;20065:1;20055:11;;;;;:::i;:::-;;;20132:2;20124:5;:10;;;;:::i;:::-;20111:2;:24;;;;:::i;:::-;20098:39;;20081:6;20088;20081:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;20161:2;20152:11;;;;;:::i;:::-;;;20021:154;;;20199:6;20185:21;;;;;19491:723;;;;:::o;39018:157::-;39103:4;39142:25;39127:40;;;:11;:40;;;;39120:47;;39018:157;;;:::o;63161:589::-;63305:45;63332:4;63338:2;63342:7;63305:26;:45::i;:::-;63383:1;63367:18;;:4;:18;;;63363:187;;;63402:40;63434:7;63402:31;:40::i;:::-;63363:187;;;63472:2;63464:10;;:4;:10;;;63460:90;;63491:47;63524:4;63530:7;63491:32;:47::i;:::-;63460:90;63363:187;63578:1;63564:16;;:2;:16;;;63560:183;;;63597:45;63634:7;63597:36;:45::i;:::-;63560:183;;;63670:4;63664:10;;:2;:10;;;63660:83;;63691:40;63719:2;63723:7;63691:27;:40::i;:::-;63660:83;63560:183;63161:589;;;:::o;60342:125::-;;;;:::o;54439:321::-;54569:18;54575:2;54579:7;54569:5;:18::i;:::-;54620:54;54651:1;54655:2;54659:7;54668:5;54620:22;:54::i;:::-;54598:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;54439:321;;;:::o;58460:799::-;58615:4;58636:15;:2;:13;;;:15::i;:::-;58632:620;;;58688:2;58672:36;;;58709:12;:10;:12::i;:::-;58723:4;58729:7;58738:5;58672:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;58668:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58931:1;58914:6;:13;:18;58910:272;;;58957:60;;;;;;;;;;:::i;:::-;;;;;;;;58910:272;59132:6;59126:13;59117:6;59113:2;59109:15;59102:38;58668:529;58805:41;;;58795:51;;;:6;:51;;;;58788:58;;;;;58632:620;59236:4;59229:11;;58460:799;;;;;;;:::o;59831:126::-;;;;:::o;64473:164::-;64577:10;:17;;;;64550:15;:24;64566:7;64550:24;;;;;;;;;;;:44;;;;64605:10;64621:7;64605:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64473:164;:::o;65264:988::-;65530:22;65580:1;65555:22;65572:4;65555:16;:22::i;:::-;:26;;;;:::i;:::-;65530:51;;65592:18;65613:17;:26;65631:7;65613:26;;;;;;;;;;;;65592:47;;65760:14;65746:10;:28;65742:328;;65791:19;65813:12;:18;65826:4;65813:18;;;;;;;;;;;;;;;:34;65832:14;65813:34;;;;;;;;;;;;65791:56;;65897:11;65864:12;:18;65877:4;65864:18;;;;;;;;;;;;;;;:30;65883:10;65864:30;;;;;;;;;;;:44;;;;66014:10;65981:17;:30;65999:11;65981:30;;;;;;;;;;;:43;;;;65776:294;65742:328;66166:17;:26;66184:7;66166:26;;;;;;;;;;;66159:33;;;66210:12;:18;66223:4;66210:18;;;;;;;;;;;;;;;:34;66229:14;66210:34;;;;;;;;;;;66203:41;;;65345:907;;65264:988;;:::o;66547:1079::-;66800:22;66845:1;66825:10;:17;;;;:21;;;;:::i;:::-;66800:46;;66857:18;66878:15;:24;66894:7;66878:24;;;;;;;;;;;;66857:45;;67229:19;67251:10;67262:14;67251:26;;;;;;;;:::i;:::-;;;;;;;;;;67229:48;;67315:11;67290:10;67301;67290:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;67426:10;67395:15;:28;67411:11;67395:28;;;;;;;;;;;:41;;;;67567:15;:24;67583:7;67567:24;;;;;;;;;;;67560:31;;;67602:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;66618:1008;;;66547:1079;:::o;64051:221::-;64136:14;64153:20;64170:2;64153:16;:20::i;:::-;64136:37;;64211:7;64184:12;:16;64197:2;64184:16;;;;;;;;;;;;;;;:24;64201:6;64184:24;;;;;;;;;;;:34;;;;64258:6;64229:17;:26;64247:7;64229:26;;;;;;;;;;;:35;;;;64125:147;64051:221;;:::o;55096:439::-;55190:1;55176:16;;:2;:16;;;;55168:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;55249:16;55257:7;55249;:16::i;:::-;55248:17;55240:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;55311:45;55340:1;55344:2;55348:7;55311:20;:45::i;:::-;55386:1;55369:9;:13;55379:2;55369:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;55417:2;55398:7;:16;55406:7;55398:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;55462:7;55458:2;55437:33;;55454:1;55437:33;;;;;;;;;;;;55483:44;55511:1;55515:2;55519:7;55483:19;:44::i;:::-;55096:439;;:::o;28912:326::-;28972:4;29229:1;29207:7;:19;;;:23;29200:30;;28912:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1594:::-;1667:8;1677:6;1727:3;1720:4;1712:6;1708:17;1704:27;1694:122;;1735:79;;:::i;:::-;1694:122;1848:6;1835:20;1825:30;;1878:18;1870:6;1867:30;1864:117;;;1900:79;;:::i;:::-;1864:117;2014:4;2006:6;2002:17;1990:29;;2068:3;2060:4;2052:6;2048:17;2038:8;2034:32;2031:41;2028:128;;;2075:79;;:::i;:::-;2028:128;1594:568;;;;;:::o;2168:133::-;2211:5;2249:6;2236:20;2227:29;;2265:30;2289:5;2265:30;:::i;:::-;2168:133;;;;:::o;2307:137::-;2352:5;2390:6;2377:20;2368:29;;2406:32;2432:5;2406:32;:::i;:::-;2307:137;;;;:::o;2450:141::-;2506:5;2537:6;2531:13;2522:22;;2553:32;2579:5;2553:32;:::i;:::-;2450:141;;;;:::o;2610:338::-;2665:5;2714:3;2707:4;2699:6;2695:17;2691:27;2681:122;;2722:79;;:::i;:::-;2681:122;2839:6;2826:20;2864:78;2938:3;2930:6;2923:4;2915:6;2911:17;2864:78;:::i;:::-;2855:87;;2671:277;2610:338;;;;:::o;2968:340::-;3024:5;3073:3;3066:4;3058:6;3054:17;3050:27;3040:122;;3081:79;;:::i;:::-;3040:122;3198:6;3185:20;3223:79;3298:3;3290:6;3283:4;3275:6;3271:17;3223:79;:::i;:::-;3214:88;;3030:278;2968:340;;;;:::o;3314:139::-;3360:5;3398:6;3385:20;3376:29;;3414:33;3441:5;3414:33;:::i;:::-;3314:139;;;;:::o;3459:143::-;3516:5;3547:6;3541:13;3532:22;;3563:33;3590:5;3563:33;:::i;:::-;3459:143;;;;:::o;3608:329::-;3667:6;3716:2;3704:9;3695:7;3691:23;3687:32;3684:119;;;3722:79;;:::i;:::-;3684:119;3842:1;3867:53;3912:7;3903:6;3892:9;3888:22;3867:53;:::i;:::-;3857:63;;3813:117;3608:329;;;;:::o;3943:474::-;4011:6;4019;4068:2;4056:9;4047:7;4043:23;4039:32;4036:119;;;4074:79;;:::i;:::-;4036:119;4194:1;4219:53;4264:7;4255:6;4244:9;4240:22;4219:53;:::i;:::-;4209:63;;4165:117;4321:2;4347:53;4392:7;4383:6;4372:9;4368:22;4347:53;:::i;:::-;4337:63;;4292:118;3943:474;;;;;:::o;4423:619::-;4500:6;4508;4516;4565:2;4553:9;4544:7;4540:23;4536:32;4533:119;;;4571:79;;:::i;:::-;4533:119;4691:1;4716:53;4761:7;4752:6;4741:9;4737:22;4716:53;:::i;:::-;4706:63;;4662:117;4818:2;4844:53;4889:7;4880:6;4869:9;4865:22;4844:53;:::i;:::-;4834:63;;4789:118;4946:2;4972:53;5017:7;5008:6;4997:9;4993:22;4972:53;:::i;:::-;4962:63;;4917:118;4423:619;;;;;:::o;5048:943::-;5143:6;5151;5159;5167;5216:3;5204:9;5195:7;5191:23;5187:33;5184:120;;;5223:79;;:::i;:::-;5184:120;5343:1;5368:53;5413:7;5404:6;5393:9;5389:22;5368:53;:::i;:::-;5358:63;;5314:117;5470:2;5496:53;5541:7;5532:6;5521:9;5517:22;5496:53;:::i;:::-;5486:63;;5441:118;5598:2;5624:53;5669:7;5660:6;5649:9;5645:22;5624:53;:::i;:::-;5614:63;;5569:118;5754:2;5743:9;5739:18;5726:32;5785:18;5777:6;5774:30;5771:117;;;5807:79;;:::i;:::-;5771:117;5912:62;5966:7;5957:6;5946:9;5942:22;5912:62;:::i;:::-;5902:72;;5697:287;5048:943;;;;;;;:::o;5997:468::-;6062:6;6070;6119:2;6107:9;6098:7;6094:23;6090:32;6087:119;;;6125:79;;:::i;:::-;6087:119;6245:1;6270:53;6315:7;6306:6;6295:9;6291:22;6270:53;:::i;:::-;6260:63;;6216:117;6372:2;6398:50;6440:7;6431:6;6420:9;6416:22;6398:50;:::i;:::-;6388:60;;6343:115;5997:468;;;;;:::o;6471:474::-;6539:6;6547;6596:2;6584:9;6575:7;6571:23;6567:32;6564:119;;;6602:79;;:::i;:::-;6564:119;6722:1;6747:53;6792:7;6783:6;6772:9;6768:22;6747:53;:::i;:::-;6737:63;;6693:117;6849:2;6875:53;6920:7;6911:6;6900:9;6896:22;6875:53;:::i;:::-;6865:63;;6820:118;6471:474;;;;;:::o;6951:559::-;7037:6;7045;7094:2;7082:9;7073:7;7069:23;7065:32;7062:119;;;7100:79;;:::i;:::-;7062:119;7248:1;7237:9;7233:17;7220:31;7278:18;7270:6;7267:30;7264:117;;;7300:79;;:::i;:::-;7264:117;7413:80;7485:7;7476:6;7465:9;7461:22;7413:80;:::i;:::-;7395:98;;;;7191:312;6951:559;;;;;:::o;7516:934::-;7638:6;7646;7654;7662;7711:2;7699:9;7690:7;7686:23;7682:32;7679:119;;;7717:79;;:::i;:::-;7679:119;7865:1;7854:9;7850:17;7837:31;7895:18;7887:6;7884:30;7881:117;;;7917:79;;:::i;:::-;7881:117;8030:80;8102:7;8093:6;8082:9;8078:22;8030:80;:::i;:::-;8012:98;;;;7808:312;8187:2;8176:9;8172:18;8159:32;8218:18;8210:6;8207:30;8204:117;;;8240:79;;:::i;:::-;8204:117;8353:80;8425:7;8416:6;8405:9;8401:22;8353:80;:::i;:::-;8335:98;;;;8130:313;7516:934;;;;;;;:::o;8456:323::-;8512:6;8561:2;8549:9;8540:7;8536:23;8532:32;8529:119;;;8567:79;;:::i;:::-;8529:119;8687:1;8712:50;8754:7;8745:6;8734:9;8730:22;8712:50;:::i;:::-;8702:60;;8658:114;8456:323;;;;:::o;8785:327::-;8843:6;8892:2;8880:9;8871:7;8867:23;8863:32;8860:119;;;8898:79;;:::i;:::-;8860:119;9018:1;9043:52;9087:7;9078:6;9067:9;9063:22;9043:52;:::i;:::-;9033:62;;8989:116;8785:327;;;;:::o;9118:349::-;9187:6;9236:2;9224:9;9215:7;9211:23;9207:32;9204:119;;;9242:79;;:::i;:::-;9204:119;9362:1;9387:63;9442:7;9433:6;9422:9;9418:22;9387:63;:::i;:::-;9377:73;;9333:127;9118:349;;;;:::o;9473:509::-;9542:6;9591:2;9579:9;9570:7;9566:23;9562:32;9559:119;;;9597:79;;:::i;:::-;9559:119;9745:1;9734:9;9730:17;9717:31;9775:18;9767:6;9764:30;9761:117;;;9797:79;;:::i;:::-;9761:117;9902:63;9957:7;9948:6;9937:9;9933:22;9902:63;:::i;:::-;9892:73;;9688:287;9473:509;;;;:::o;9988:329::-;10047:6;10096:2;10084:9;10075:7;10071:23;10067:32;10064:119;;;10102:79;;:::i;:::-;10064:119;10222:1;10247:53;10292:7;10283:6;10272:9;10268:22;10247:53;:::i;:::-;10237:63;;10193:117;9988:329;;;;:::o;10323:351::-;10393:6;10442:2;10430:9;10421:7;10417:23;10413:32;10410:119;;;10448:79;;:::i;:::-;10410:119;10568:1;10593:64;10649:7;10640:6;10629:9;10625:22;10593:64;:::i;:::-;10583:74;;10539:128;10323:351;;;;:::o;10680:179::-;10749:10;10770:46;10812:3;10804:6;10770:46;:::i;:::-;10848:4;10843:3;10839:14;10825:28;;10680:179;;;;:::o;10865:118::-;10952:24;10970:5;10952:24;:::i;:::-;10947:3;10940:37;10865:118;;:::o;11019:732::-;11138:3;11167:54;11215:5;11167:54;:::i;:::-;11237:86;11316:6;11311:3;11237:86;:::i;:::-;11230:93;;11347:56;11397:5;11347:56;:::i;:::-;11426:7;11457:1;11442:284;11467:6;11464:1;11461:13;11442:284;;;11543:6;11537:13;11570:63;11629:3;11614:13;11570:63;:::i;:::-;11563:70;;11656:60;11709:6;11656:60;:::i;:::-;11646:70;;11502:224;11489:1;11486;11482:9;11477:14;;11442:284;;;11446:14;11742:3;11735:10;;11143:608;;;11019:732;;;;:::o;11757:109::-;11838:21;11853:5;11838:21;:::i;:::-;11833:3;11826:34;11757:109;;:::o;11872:360::-;11958:3;11986:38;12018:5;11986:38;:::i;:::-;12040:70;12103:6;12098:3;12040:70;:::i;:::-;12033:77;;12119:52;12164:6;12159:3;12152:4;12145:5;12141:16;12119:52;:::i;:::-;12196:29;12218:6;12196:29;:::i;:::-;12191:3;12187:39;12180:46;;11962:270;11872:360;;;;:::o;12238:161::-;12340:52;12386:5;12340:52;:::i;:::-;12335:3;12328:65;12238:161;;:::o;12405:364::-;12493:3;12521:39;12554:5;12521:39;:::i;:::-;12576:71;12640:6;12635:3;12576:71;:::i;:::-;12569:78;;12656:52;12701:6;12696:3;12689:4;12682:5;12678:16;12656:52;:::i;:::-;12733:29;12755:6;12733:29;:::i;:::-;12728:3;12724:39;12717:46;;12497:272;12405:364;;;;:::o;12775:377::-;12881:3;12909:39;12942:5;12909:39;:::i;:::-;12964:89;13046:6;13041:3;12964:89;:::i;:::-;12957:96;;13062:52;13107:6;13102:3;13095:4;13088:5;13084:16;13062:52;:::i;:::-;13139:6;13134:3;13130:16;13123:23;;12885:267;12775:377;;;;:::o;13182:845::-;13285:3;13322:5;13316:12;13351:36;13377:9;13351:36;:::i;:::-;13403:89;13485:6;13480:3;13403:89;:::i;:::-;13396:96;;13523:1;13512:9;13508:17;13539:1;13534:137;;;;13685:1;13680:341;;;;13501:520;;13534:137;13618:4;13614:9;13603;13599:25;13594:3;13587:38;13654:6;13649:3;13645:16;13638:23;;13534:137;;13680:341;13747:38;13779:5;13747:38;:::i;:::-;13807:1;13821:154;13835:6;13832:1;13829:13;13821:154;;;13909:7;13903:14;13899:1;13894:3;13890:11;13883:35;13959:1;13950:7;13946:15;13935:26;;13857:4;13854:1;13850:12;13845:17;;13821:154;;;14004:6;13999:3;13995:16;13988:23;;13687:334;;13501:520;;13289:738;;13182:845;;;;:::o;14033:366::-;14175:3;14196:67;14260:2;14255:3;14196:67;:::i;:::-;14189:74;;14272:93;14361:3;14272:93;:::i;:::-;14390:2;14385:3;14381:12;14374:19;;14033:366;;;:::o;14405:::-;14547:3;14568:67;14632:2;14627:3;14568:67;:::i;:::-;14561:74;;14644:93;14733:3;14644:93;:::i;:::-;14762:2;14757:3;14753:12;14746:19;;14405:366;;;:::o;14777:::-;14919:3;14940:67;15004:2;14999:3;14940:67;:::i;:::-;14933:74;;15016:93;15105:3;15016:93;:::i;:::-;15134:2;15129:3;15125:12;15118:19;;14777:366;;;:::o;15149:::-;15291:3;15312:67;15376:2;15371:3;15312:67;:::i;:::-;15305:74;;15388:93;15477:3;15388:93;:::i;:::-;15506:2;15501:3;15497:12;15490:19;;15149:366;;;:::o;15521:::-;15663:3;15684:67;15748:2;15743:3;15684:67;:::i;:::-;15677:74;;15760:93;15849:3;15760:93;:::i;:::-;15878:2;15873:3;15869:12;15862:19;;15521:366;;;:::o;15893:::-;16035:3;16056:67;16120:2;16115:3;16056:67;:::i;:::-;16049:74;;16132:93;16221:3;16132:93;:::i;:::-;16250:2;16245:3;16241:12;16234:19;;15893:366;;;:::o;16265:::-;16407:3;16428:67;16492:2;16487:3;16428:67;:::i;:::-;16421:74;;16504:93;16593:3;16504:93;:::i;:::-;16622:2;16617:3;16613:12;16606:19;;16265:366;;;:::o;16637:::-;16779:3;16800:67;16864:2;16859:3;16800:67;:::i;:::-;16793:74;;16876:93;16965:3;16876:93;:::i;:::-;16994:2;16989:3;16985:12;16978:19;;16637:366;;;:::o;17009:::-;17151:3;17172:67;17236:2;17231:3;17172:67;:::i;:::-;17165:74;;17248:93;17337:3;17248:93;:::i;:::-;17366:2;17361:3;17357:12;17350:19;;17009:366;;;:::o;17381:::-;17523:3;17544:67;17608:2;17603:3;17544:67;:::i;:::-;17537:74;;17620:93;17709:3;17620:93;:::i;:::-;17738:2;17733:3;17729:12;17722:19;;17381:366;;;:::o;17753:::-;17895:3;17916:67;17980:2;17975:3;17916:67;:::i;:::-;17909:74;;17992:93;18081:3;17992:93;:::i;:::-;18110:2;18105:3;18101:12;18094:19;;17753:366;;;:::o;18125:::-;18267:3;18288:67;18352:2;18347:3;18288:67;:::i;:::-;18281:74;;18364:93;18453:3;18364:93;:::i;:::-;18482:2;18477:3;18473:12;18466:19;;18125:366;;;:::o;18497:::-;18639:3;18660:67;18724:2;18719:3;18660:67;:::i;:::-;18653:74;;18736:93;18825:3;18736:93;:::i;:::-;18854:2;18849:3;18845:12;18838:19;;18497:366;;;:::o;18869:::-;19011:3;19032:67;19096:2;19091:3;19032:67;:::i;:::-;19025:74;;19108:93;19197:3;19108:93;:::i;:::-;19226:2;19221:3;19217:12;19210:19;;18869:366;;;:::o;19241:::-;19383:3;19404:67;19468:2;19463:3;19404:67;:::i;:::-;19397:74;;19480:93;19569:3;19480:93;:::i;:::-;19598:2;19593:3;19589:12;19582:19;;19241:366;;;:::o;19613:::-;19755:3;19776:67;19840:2;19835:3;19776:67;:::i;:::-;19769:74;;19852:93;19941:3;19852:93;:::i;:::-;19970:2;19965:3;19961:12;19954:19;;19613:366;;;:::o;19985:::-;20127:3;20148:67;20212:2;20207:3;20148:67;:::i;:::-;20141:74;;20224:93;20313:3;20224:93;:::i;:::-;20342:2;20337:3;20333:12;20326:19;;19985:366;;;:::o;20357:::-;20499:3;20520:67;20584:2;20579:3;20520:67;:::i;:::-;20513:74;;20596:93;20685:3;20596:93;:::i;:::-;20714:2;20709:3;20705:12;20698:19;;20357:366;;;:::o;20729:::-;20871:3;20892:67;20956:2;20951:3;20892:67;:::i;:::-;20885:74;;20968:93;21057:3;20968:93;:::i;:::-;21086:2;21081:3;21077:12;21070:19;;20729:366;;;:::o;21101:398::-;21260:3;21281:83;21362:1;21357:3;21281:83;:::i;:::-;21274:90;;21373:93;21462:3;21373:93;:::i;:::-;21491:1;21486:3;21482:11;21475:18;;21101:398;;;:::o;21505:366::-;21647:3;21668:67;21732:2;21727:3;21668:67;:::i;:::-;21661:74;;21744:93;21833:3;21744:93;:::i;:::-;21862:2;21857:3;21853:12;21846:19;;21505:366;;;:::o;21877:::-;22019:3;22040:67;22104:2;22099:3;22040:67;:::i;:::-;22033:74;;22116:93;22205:3;22116:93;:::i;:::-;22234:2;22229:3;22225:12;22218:19;;21877:366;;;:::o;22249:::-;22391:3;22412:67;22476:2;22471:3;22412:67;:::i;:::-;22405:74;;22488:93;22577:3;22488:93;:::i;:::-;22606:2;22601:3;22597:12;22590:19;;22249:366;;;:::o;22621:::-;22763:3;22784:67;22848:2;22843:3;22784:67;:::i;:::-;22777:74;;22860:93;22949:3;22860:93;:::i;:::-;22978:2;22973:3;22969:12;22962:19;;22621:366;;;:::o;22993:108::-;23070:24;23088:5;23070:24;:::i;:::-;23065:3;23058:37;22993:108;;:::o;23107:118::-;23194:24;23212:5;23194:24;:::i;:::-;23189:3;23182:37;23107:118;;:::o;23231:589::-;23456:3;23478:95;23569:3;23560:6;23478:95;:::i;:::-;23471:102;;23590:95;23681:3;23672:6;23590:95;:::i;:::-;23583:102;;23702:92;23790:3;23781:6;23702:92;:::i;:::-;23695:99;;23811:3;23804:10;;23231:589;;;;;;:::o;23826:379::-;24010:3;24032:147;24175:3;24032:147;:::i;:::-;24025:154;;24196:3;24189:10;;23826:379;;;:::o;24211:222::-;24304:4;24342:2;24331:9;24327:18;24319:26;;24355:71;24423:1;24412:9;24408:17;24399:6;24355:71;:::i;:::-;24211:222;;;;:::o;24439:640::-;24634:4;24672:3;24661:9;24657:19;24649:27;;24686:71;24754:1;24743:9;24739:17;24730:6;24686:71;:::i;:::-;24767:72;24835:2;24824:9;24820:18;24811:6;24767:72;:::i;:::-;24849;24917:2;24906:9;24902:18;24893:6;24849:72;:::i;:::-;24968:9;24962:4;24958:20;24953:2;24942:9;24938:18;24931:48;24996:76;25067:4;25058:6;24996:76;:::i;:::-;24988:84;;24439:640;;;;;;;:::o;25085:373::-;25228:4;25266:2;25255:9;25251:18;25243:26;;25315:9;25309:4;25305:20;25301:1;25290:9;25286:17;25279:47;25343:108;25446:4;25437:6;25343:108;:::i;:::-;25335:116;;25085:373;;;;:::o;25464:210::-;25551:4;25589:2;25578:9;25574:18;25566:26;;25602:65;25664:1;25653:9;25649:17;25640:6;25602:65;:::i;:::-;25464:210;;;;:::o;25680:252::-;25788:4;25826:2;25815:9;25811:18;25803:26;;25839:86;25922:1;25911:9;25907:17;25898:6;25839:86;:::i;:::-;25680:252;;;;:::o;25938:313::-;26051:4;26089:2;26078:9;26074:18;26066:26;;26138:9;26132:4;26128:20;26124:1;26113:9;26109:17;26102:47;26166:78;26239:4;26230:6;26166:78;:::i;:::-;26158:86;;25938:313;;;;:::o;26257:419::-;26423:4;26461:2;26450:9;26446:18;26438:26;;26510:9;26504:4;26500:20;26496:1;26485:9;26481:17;26474:47;26538:131;26664:4;26538:131;:::i;:::-;26530:139;;26257:419;;;:::o;26682:::-;26848:4;26886:2;26875:9;26871:18;26863:26;;26935:9;26929:4;26925:20;26921:1;26910:9;26906:17;26899:47;26963:131;27089:4;26963:131;:::i;:::-;26955:139;;26682:419;;;:::o;27107:::-;27273:4;27311:2;27300:9;27296:18;27288:26;;27360:9;27354:4;27350:20;27346:1;27335:9;27331:17;27324:47;27388:131;27514:4;27388:131;:::i;:::-;27380:139;;27107:419;;;:::o;27532:::-;27698:4;27736:2;27725:9;27721:18;27713:26;;27785:9;27779:4;27775:20;27771:1;27760:9;27756:17;27749:47;27813:131;27939:4;27813:131;:::i;:::-;27805:139;;27532:419;;;:::o;27957:::-;28123:4;28161:2;28150:9;28146:18;28138:26;;28210:9;28204:4;28200:20;28196:1;28185:9;28181:17;28174:47;28238:131;28364:4;28238:131;:::i;:::-;28230:139;;27957:419;;;:::o;28382:::-;28548:4;28586:2;28575:9;28571:18;28563:26;;28635:9;28629:4;28625:20;28621:1;28610:9;28606:17;28599:47;28663:131;28789:4;28663:131;:::i;:::-;28655:139;;28382:419;;;:::o;28807:::-;28973:4;29011:2;29000:9;28996:18;28988:26;;29060:9;29054:4;29050:20;29046:1;29035:9;29031:17;29024:47;29088:131;29214:4;29088:131;:::i;:::-;29080:139;;28807:419;;;:::o;29232:::-;29398:4;29436:2;29425:9;29421:18;29413:26;;29485:9;29479:4;29475:20;29471:1;29460:9;29456:17;29449:47;29513:131;29639:4;29513:131;:::i;:::-;29505:139;;29232:419;;;:::o;29657:::-;29823:4;29861:2;29850:9;29846:18;29838:26;;29910:9;29904:4;29900:20;29896:1;29885:9;29881:17;29874:47;29938:131;30064:4;29938:131;:::i;:::-;29930:139;;29657:419;;;:::o;30082:::-;30248:4;30286:2;30275:9;30271:18;30263:26;;30335:9;30329:4;30325:20;30321:1;30310:9;30306:17;30299:47;30363:131;30489:4;30363:131;:::i;:::-;30355:139;;30082:419;;;:::o;30507:::-;30673:4;30711:2;30700:9;30696:18;30688:26;;30760:9;30754:4;30750:20;30746:1;30735:9;30731:17;30724:47;30788:131;30914:4;30788:131;:::i;:::-;30780:139;;30507:419;;;:::o;30932:::-;31098:4;31136:2;31125:9;31121:18;31113:26;;31185:9;31179:4;31175:20;31171:1;31160:9;31156:17;31149:47;31213:131;31339:4;31213:131;:::i;:::-;31205:139;;30932:419;;;:::o;31357:::-;31523:4;31561:2;31550:9;31546:18;31538:26;;31610:9;31604:4;31600:20;31596:1;31585:9;31581:17;31574:47;31638:131;31764:4;31638:131;:::i;:::-;31630:139;;31357:419;;;:::o;31782:::-;31948:4;31986:2;31975:9;31971:18;31963:26;;32035:9;32029:4;32025:20;32021:1;32010:9;32006:17;31999:47;32063:131;32189:4;32063:131;:::i;:::-;32055:139;;31782:419;;;:::o;32207:::-;32373:4;32411:2;32400:9;32396:18;32388:26;;32460:9;32454:4;32450:20;32446:1;32435:9;32431:17;32424:47;32488:131;32614:4;32488:131;:::i;:::-;32480:139;;32207:419;;;:::o;32632:::-;32798:4;32836:2;32825:9;32821:18;32813:26;;32885:9;32879:4;32875:20;32871:1;32860:9;32856:17;32849:47;32913:131;33039:4;32913:131;:::i;:::-;32905:139;;32632:419;;;:::o;33057:::-;33223:4;33261:2;33250:9;33246:18;33238:26;;33310:9;33304:4;33300:20;33296:1;33285:9;33281:17;33274:47;33338:131;33464:4;33338:131;:::i;:::-;33330:139;;33057:419;;;:::o;33482:::-;33648:4;33686:2;33675:9;33671:18;33663:26;;33735:9;33729:4;33725:20;33721:1;33710:9;33706:17;33699:47;33763:131;33889:4;33763:131;:::i;:::-;33755:139;;33482:419;;;:::o;33907:::-;34073:4;34111:2;34100:9;34096:18;34088:26;;34160:9;34154:4;34150:20;34146:1;34135:9;34131:17;34124:47;34188:131;34314:4;34188:131;:::i;:::-;34180:139;;33907:419;;;:::o;34332:::-;34498:4;34536:2;34525:9;34521:18;34513:26;;34585:9;34579:4;34575:20;34571:1;34560:9;34556:17;34549:47;34613:131;34739:4;34613:131;:::i;:::-;34605:139;;34332:419;;;:::o;34757:::-;34923:4;34961:2;34950:9;34946:18;34938:26;;35010:9;35004:4;35000:20;34996:1;34985:9;34981:17;34974:47;35038:131;35164:4;35038:131;:::i;:::-;35030:139;;34757:419;;;:::o;35182:::-;35348:4;35386:2;35375:9;35371:18;35363:26;;35435:9;35429:4;35425:20;35421:1;35410:9;35406:17;35399:47;35463:131;35589:4;35463:131;:::i;:::-;35455:139;;35182:419;;;:::o;35607:::-;35773:4;35811:2;35800:9;35796:18;35788:26;;35860:9;35854:4;35850:20;35846:1;35835:9;35831:17;35824:47;35888:131;36014:4;35888:131;:::i;:::-;35880:139;;35607:419;;;:::o;36032:222::-;36125:4;36163:2;36152:9;36148:18;36140:26;;36176:71;36244:1;36233:9;36229:17;36220:6;36176:71;:::i;:::-;36032:222;;;;:::o;36260:129::-;36294:6;36321:20;;:::i;:::-;36311:30;;36350:33;36378:4;36370:6;36350:33;:::i;:::-;36260:129;;;:::o;36395:75::-;36428:6;36461:2;36455:9;36445:19;;36395:75;:::o;36476:307::-;36537:4;36627:18;36619:6;36616:30;36613:56;;;36649:18;;:::i;:::-;36613:56;36687:29;36709:6;36687:29;:::i;:::-;36679:37;;36771:4;36765;36761:15;36753:23;;36476:307;;;:::o;36789:308::-;36851:4;36941:18;36933:6;36930:30;36927:56;;;36963:18;;:::i;:::-;36927:56;37001:29;37023:6;37001:29;:::i;:::-;36993:37;;37085:4;37079;37075:15;37067:23;;36789:308;;;:::o;37103:132::-;37170:4;37193:3;37185:11;;37223:4;37218:3;37214:14;37206:22;;37103:132;;;:::o;37241:141::-;37290:4;37313:3;37305:11;;37336:3;37333:1;37326:14;37370:4;37367:1;37357:18;37349:26;;37241:141;;;:::o;37388:114::-;37455:6;37489:5;37483:12;37473:22;;37388:114;;;:::o;37508:98::-;37559:6;37593:5;37587:12;37577:22;;37508:98;;;:::o;37612:99::-;37664:6;37698:5;37692:12;37682:22;;37612:99;;;:::o;37717:113::-;37787:4;37819;37814:3;37810:14;37802:22;;37717:113;;;:::o;37836:184::-;37935:11;37969:6;37964:3;37957:19;38009:4;38004:3;38000:14;37985:29;;37836:184;;;;:::o;38026:168::-;38109:11;38143:6;38138:3;38131:19;38183:4;38178:3;38174:14;38159:29;;38026:168;;;;:::o;38200:147::-;38301:11;38338:3;38323:18;;38200:147;;;;:::o;38353:169::-;38437:11;38471:6;38466:3;38459:19;38511:4;38506:3;38502:14;38487:29;;38353:169;;;;:::o;38528:148::-;38630:11;38667:3;38652:18;;38528:148;;;;:::o;38682:305::-;38722:3;38741:20;38759:1;38741:20;:::i;:::-;38736:25;;38775:20;38793:1;38775:20;:::i;:::-;38770:25;;38929:1;38861:66;38857:74;38854:1;38851:81;38848:107;;;38935:18;;:::i;:::-;38848:107;38979:1;38976;38972:9;38965:16;;38682:305;;;;:::o;38993:185::-;39033:1;39050:20;39068:1;39050:20;:::i;:::-;39045:25;;39084:20;39102:1;39084:20;:::i;:::-;39079:25;;39123:1;39113:35;;39128:18;;:::i;:::-;39113:35;39170:1;39167;39163:9;39158:14;;38993:185;;;;:::o;39184:348::-;39224:7;39247:20;39265:1;39247:20;:::i;:::-;39242:25;;39281:20;39299:1;39281:20;:::i;:::-;39276:25;;39469:1;39401:66;39397:74;39394:1;39391:81;39386:1;39379:9;39372:17;39368:105;39365:131;;;39476:18;;:::i;:::-;39365:131;39524:1;39521;39517:9;39506:20;;39184:348;;;;:::o;39538:191::-;39578:4;39598:20;39616:1;39598:20;:::i;:::-;39593:25;;39632:20;39650:1;39632:20;:::i;:::-;39627:25;;39671:1;39668;39665:8;39662:34;;;39676:18;;:::i;:::-;39662:34;39721:1;39718;39714:9;39706:17;;39538:191;;;;:::o;39735:96::-;39772:7;39801:24;39819:5;39801:24;:::i;:::-;39790:35;;39735:96;;;:::o;39837:90::-;39871:7;39914:5;39907:13;39900:21;39889:32;;39837:90;;;:::o;39933:149::-;39969:7;40009:66;40002:5;39998:78;39987:89;;39933:149;;;:::o;40088:126::-;40125:7;40165:42;40158:5;40154:54;40143:65;;40088:126;;;:::o;40220:77::-;40257:7;40286:5;40275:16;;40220:77;;;:::o;40303:141::-;40368:9;40401:37;40432:5;40401:37;:::i;:::-;40388:50;;40303:141;;;:::o;40450:126::-;40500:9;40533:37;40564:5;40533:37;:::i;:::-;40520:50;;40450:126;;;:::o;40582:113::-;40632:9;40665:24;40683:5;40665:24;:::i;:::-;40652:37;;40582:113;;;:::o;40701:154::-;40785:6;40780:3;40775;40762:30;40847:1;40838:6;40833:3;40829:16;40822:27;40701:154;;;:::o;40861:307::-;40929:1;40939:113;40953:6;40950:1;40947:13;40939:113;;;41038:1;41033:3;41029:11;41023:18;41019:1;41014:3;41010:11;41003:39;40975:2;40972:1;40968:10;40963:15;;40939:113;;;41070:6;41067:1;41064:13;41061:101;;;41150:1;41141:6;41136:3;41132:16;41125:27;41061:101;40910:258;40861:307;;;:::o;41174:320::-;41218:6;41255:1;41249:4;41245:12;41235:22;;41302:1;41296:4;41292:12;41323:18;41313:81;;41379:4;41371:6;41367:17;41357:27;;41313:81;41441:2;41433:6;41430:14;41410:18;41407:38;41404:84;;;41460:18;;:::i;:::-;41404:84;41225:269;41174:320;;;:::o;41500:281::-;41583:27;41605:4;41583:27;:::i;:::-;41575:6;41571:40;41713:6;41701:10;41698:22;41677:18;41665:10;41662:34;41659:62;41656:88;;;41724:18;;:::i;:::-;41656:88;41764:10;41760:2;41753:22;41543:238;41500:281;;:::o;41787:233::-;41826:3;41849:24;41867:5;41849:24;:::i;:::-;41840:33;;41895:66;41888:5;41885:77;41882:103;;;41965:18;;:::i;:::-;41882:103;42012:1;42005:5;42001:13;41994:20;;41787:233;;;:::o;42026:176::-;42058:1;42075:20;42093:1;42075:20;:::i;:::-;42070:25;;42109:20;42127:1;42109:20;:::i;:::-;42104:25;;42148:1;42138:35;;42153:18;;:::i;:::-;42138:35;42194:1;42191;42187:9;42182:14;;42026:176;;;;:::o;42208:180::-;42256:77;42253:1;42246:88;42353:4;42350:1;42343:15;42377:4;42374:1;42367:15;42394:180;42442:77;42439:1;42432:88;42539:4;42536:1;42529:15;42563:4;42560:1;42553:15;42580:180;42628:77;42625:1;42618:88;42725:4;42722:1;42715:15;42749:4;42746:1;42739:15;42766:180;42814:77;42811:1;42804:88;42911:4;42908:1;42901:15;42935:4;42932:1;42925:15;42952:180;43000:77;42997:1;42990:88;43097:4;43094:1;43087:15;43121:4;43118:1;43111:15;43138:180;43186:77;43183:1;43176:88;43283:4;43280:1;43273:15;43307:4;43304:1;43297:15;43324:117;43433:1;43430;43423:12;43447:117;43556:1;43553;43546:12;43570:117;43679:1;43676;43669:12;43693:117;43802:1;43799;43792:12;43816:117;43925:1;43922;43915:12;43939:117;44048:1;44045;44038:12;44062:102;44103:6;44154:2;44150:7;44145:2;44138:5;44134:14;44130:28;44120:38;;44062:102;;;:::o;44170:230::-;44310:34;44306:1;44298:6;44294:14;44287:58;44379:13;44374:2;44366:6;44362:15;44355:38;44170:230;:::o;44406:237::-;44546:34;44542:1;44534:6;44530:14;44523:58;44615:20;44610:2;44602:6;44598:15;44591:45;44406:237;:::o;44649:225::-;44789:34;44785:1;44777:6;44773:14;44766:58;44858:8;44853:2;44845:6;44841:15;44834:33;44649:225;:::o;44880:224::-;45020:34;45016:1;45008:6;45004:14;44997:58;45089:7;45084:2;45076:6;45072:15;45065:32;44880:224;:::o;45110:178::-;45250:30;45246:1;45238:6;45234:14;45227:54;45110:178;:::o;45294:223::-;45434:34;45430:1;45422:6;45418:14;45411:58;45503:6;45498:2;45490:6;45486:15;45479:31;45294:223;:::o;45523:175::-;45663:27;45659:1;45651:6;45647:14;45640:51;45523:175;:::o;45704:231::-;45844:34;45840:1;45832:6;45828:14;45821:58;45913:14;45908:2;45900:6;45896:15;45889:39;45704:231;:::o;45941:243::-;46081:34;46077:1;46069:6;46065:14;46058:58;46150:26;46145:2;46137:6;46133:15;46126:51;45941:243;:::o;46190:229::-;46330:34;46326:1;46318:6;46314:14;46307:58;46399:12;46394:2;46386:6;46382:15;46375:37;46190:229;:::o;46425:228::-;46565:34;46561:1;46553:6;46549:14;46542:58;46634:11;46629:2;46621:6;46617:15;46610:36;46425:228;:::o;46659:172::-;46799:24;46795:1;46787:6;46783:14;46776:48;46659:172;:::o;46837:182::-;46977:34;46973:1;46965:6;46961:14;46954:58;46837:182;:::o;47025:231::-;47165:34;47161:1;47153:6;47149:14;47142:58;47234:14;47229:2;47221:6;47217:15;47210:39;47025:231;:::o;47262:182::-;47402:34;47398:1;47390:6;47386:14;47379:58;47262:182;:::o;47450:172::-;47590:24;47586:1;47578:6;47574:14;47567:48;47450:172;:::o;47628:234::-;47768:34;47764:1;47756:6;47752:14;47745:58;47837:17;47832:2;47824:6;47820:15;47813:42;47628:234;:::o;47868:163::-;48008:15;48004:1;47996:6;47992:14;47985:39;47868:163;:::o;48037:220::-;48177:34;48173:1;48165:6;48161:14;48154:58;48246:3;48241:2;48233:6;48229:15;48222:28;48037:220;:::o;48263:114::-;;:::o;48383:168::-;48523:20;48519:1;48511:6;48507:14;48500:44;48383:168;:::o;48557:236::-;48697:34;48693:1;48685:6;48681:14;48674:58;48766:19;48761:2;48753:6;48749:15;48742:44;48557:236;:::o;48799:231::-;48939:34;48935:1;48927:6;48923:14;48916:58;49008:14;49003:2;48995:6;48991:15;48984:39;48799:231;:::o;49036:177::-;49176:29;49172:1;49164:6;49160:14;49153:53;49036:177;:::o;49219:122::-;49292:24;49310:5;49292:24;:::i;:::-;49285:5;49282:35;49272:63;;49331:1;49328;49321:12;49272:63;49219:122;:::o;49347:116::-;49417:21;49432:5;49417:21;:::i;:::-;49410:5;49407:32;49397:60;;49453:1;49450;49443:12;49397:60;49347:116;:::o;49469:120::-;49541:23;49558:5;49541:23;:::i;:::-;49534:5;49531:34;49521:62;;49579:1;49576;49569:12;49521:62;49469:120;:::o;49595:122::-;49668:24;49686:5;49668:24;:::i;:::-;49661:5;49658:35;49648:63;;49707:1;49704;49697:12;49648:63;49595:122;:::o
Swarm Source
ipfs://2959e0b709cea55d3ab47a98e9e8bd3e9d4d40d2ac42d44d97bd663d1d3e686c