More Info
Private Name Tags
ContractCreator
TokenTracker
Multichain Info
No addresses found
Latest 25 from a total of 951 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 17999791 | 40 days ago | IN | 0 CRO | 0.2358148 | ||||
Set Approval For... | 17998695 | 40 days ago | IN | 0 CRO | 0.23574475 | ||||
Set Approval For... | 17586574 | 67 days ago | IN | 0 CRO | 0.2381496 | ||||
Safe Transfer Fr... | 17197209 | 93 days ago | IN | 0 CRO | 0.49214292 | ||||
Set Approval For... | 17061582 | 102 days ago | IN | 0 CRO | 0.2358148 | ||||
Set Approval For... | 16343446 | 149 days ago | IN | 0 CRO | 0.2358148 | ||||
Set Approval For... | 16281656 | 153 days ago | IN | 0 CRO | 0.2358148 | ||||
Set Approval For... | 15950167 | 175 days ago | IN | 0 CRO | 0.23574475 | ||||
Transfer From | 15946657 | 175 days ago | IN | 0 CRO | 0.49066362 | ||||
Set Approval For... | 15587843 | 199 days ago | IN | 0 CRO | 0.2358148 | ||||
Safe Transfer Fr... | 15323462 | 216 days ago | IN | 0 CRO | 0.50171821 | ||||
Set Approval For... | 15027911 | 236 days ago | IN | 0 CRO | 0.2358148 | ||||
Safe Transfer Fr... | 14957750 | 240 days ago | IN | 0 CRO | 0.50619337 | ||||
Set Approval For... | 14875380 | 246 days ago | IN | 0 CRO | 0.2358148 | ||||
Set Approval For... | 14071850 | 298 days ago | IN | 0 CRO | 0.1353198 | ||||
Set Approval For... | 14071848 | 298 days ago | IN | 0 CRO | 0.2358148 | ||||
Set Approval For... | 13732383 | 321 days ago | IN | 0 CRO | 0.2358148 | ||||
Set Approval For... | 13625805 | 328 days ago | IN | 0 CRO | 0.2358148 | ||||
Set Approval For... | 13291258 | 350 days ago | IN | 0 CRO | 0.23574475 | ||||
Set Approval For... | 13234437 | 353 days ago | IN | 0 CRO | 0.2358148 | ||||
Set Approval For... | 13185291 | 357 days ago | IN | 0 CRO | 0.23574475 | ||||
Set Approval For... | 13113245 | 361 days ago | IN | 0 CRO | 0.2358148 | ||||
Set Approval For... | 12931449 | 373 days ago | IN | 0 CRO | 0.47148951 | ||||
Set Approval For... | 12649371 | 391 days ago | IN | 0 CRO | 0.4716296 | ||||
Safe Transfer Fr... | 12646874 | 392 days ago | IN | 0 CRO | 1.02131155 |
Loading...
Loading
Contract Name:
ArmyTokenNFT
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2023-03-10 */ /** *Submitted for verification at Etherscan.io on 2023-02-06 */ /** *Submitted for verification at cronoscan.com on 2023-02-06 */ /** *Submitted for verification at testnet.cronoscan.com on 2022-10-02 */ /** *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 ArmyTokenNFT is ERC721Enumerable, Ownable, RandomlyAssigned { using Strings for uint256; using Counters for Counters.Counter; string public baseURI = "ipfs://tochange/"; string public baseExtension = ".json"; string public notRevealedUri; uint256 public memberPrice = 2000 ether; uint256 public whitelistPrice = 3000 ether; uint256 public normalPrice = 4000 ether; uint256 public maxSupply = 2600; uint256 public numReserved; Counters.Counter public _tokenIdCounter; bool public paused = true; bool public revealed = true; mapping(address => bool) whitelist; IERC20 public TokenAddress; uint256 public TokenCost = 100000 * 10 **18; // Pass the token address constructor( address _TokenAddress) ERC721("100K Army Token NFT", "100k $Army NFT") RandomlyAssigned(maxSupply, numReserved){ TokenAddress = IERC20(_TokenAddress); } // 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 <= normalPrice) { if (isWhiteList(_address)) { return whitelistPrice; } else { return normalPrice; } } 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++) { _mintRandomId(msg.sender); } } 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]); } } } //mint with army function mintwithtoken(uint256 nftamount) public payable{ require(!paused, "the contract is paused"); require(nftamount > 0, "need to mint at least 1 NFT"); uint256 senderbalance = TokenAddress.balanceOf(msg.sender); uint256 TokenFullCost; TokenFullCost = TokenCost * nftamount; //IERC20(armytoken).approve(address(this), armycost); require(senderbalance>= TokenFullCost, "insufficient funds"); TokenAddress.transferFrom(msg.sender, address(this),TokenFullCost); for (uint256 i = 1; i <= nftamount; i++) { _mintRandomId(msg.sender); } } 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) { } function setnormalPrice(uint256 _cost) external onlyOwner { normalPrice = _cost; } function setTokenCost(uint256 _cost) external onlyOwner { TokenCost = _cost; } function setmemberPrice(uint256 _cost) external onlyOwner { memberPrice = _cost; } function setwhitelistPrice(uint256 _cost) external onlyOwner { whitelistPrice = _cost; } 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); // ============================================================================= } function withdrawToken(address _tokenContract, uint256 _amount) external onlyOwner{ IERC20 tokenContract = IERC20(_tokenContract); // transfer the token from address of this contract // to address of the user (executing the withdrawToken() function) tokenContract.transfer(msg.sender, _amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_TokenAddress","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":"TokenAddress","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TokenCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"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":[{"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":[{"internalType":"uint256","name":"nftamount","type":"uint256"}],"name":"mintwithtoken","outputs":[],"stateMutability":"payable","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":"setTokenCost","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"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040526040518060400160405280601081526020017f697066733a2f2f746f6368616e67652f00000000000000000000000000000000815250600d90805190602001906200005192919062000351565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600e90805190602001906200009f92919062000351565b50686c6b935b8bbd40000060105568a2a15d09519be0000060115568d8d726b7177a800000601255610a286013556001601660006101000a81548160ff0219169083151502179055506001601660016101000a81548160ff02191690831515021790555069152d02c7e14af68000006019553480156200011e57600080fd5b50604051620061b0380380620061b0833981810160405281019062000144919062000418565b60135460145481816040518060400160405280601381526020017f3130304b2041726d7920546f6b656e204e4654000000000000000000000000008152506040518060400160405280600e81526020017f3130306b202441726d79204e46540000000000000000000000000000000000008152508160009080519060200190620001d092919062000351565b508060019080519060200190620001e992919062000351565b5050506200020c620002006200028360201b60201c565b6200028b60201b60201c565b80826200021a9190620004a7565b6080818152505050506001816200023291906200044a565b60a08181525050505080601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620005d3565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200035f9062000520565b90600052602060002090601f016020900481019282620003835760008555620003cf565b82601f106200039e57805160ff1916838001178555620003cf565b82800160010185558215620003cf579182015b82811115620003ce578251825591602001919060010190620003b1565b5b509050620003de9190620003e2565b5090565b5b80821115620003fd576000816000905550600101620003e3565b5090565b6000815190506200041281620005b9565b92915050565b600060208284031215620004315762000430620005b4565b5b6000620004418482850162000401565b91505092915050565b6000620004578262000516565b9150620004648362000516565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156200049c576200049b62000556565b5b828201905092915050565b6000620004b48262000516565b9150620004c18362000516565b925082821015620004d757620004d662000556565b5b828203905092915050565b6000620004ef82620004f6565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060028204905060018216806200053957607f821691505b6020821081141562000550576200054f62000585565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b620005c481620004e2565b8114620005d057600080fd5b50565b60805160a051615bb7620005f9600039600061369e015260006110b30152615bb76000f3fe6080604052600436106103505760003560e01c806384c4bd4b116101c6578063b88d4fde116100f7578063da3ef23f11610095578063f2c4ce1e1161006f578063f2c4ce1e14610c25578063f2fde38b14610c4e578063f99031a714610c77578063fc1a1c3614610cb457610350565b8063da3ef23f14610b94578063e14ca35314610bbd578063e985e9c514610be857610350565b8063c2cba306116100d1578063c2cba30614610ad6578063c668286214610b01578063c87b56dd14610b2c578063d5abeb0114610b6957610350565b8063b88d4fde14610a5b578063bb9e354714610a84578063bcb96f5214610aad57610350565b80639f181b5e11610164578063a22cb4651161013e578063a22cb465146109b3578063a475b5dd146109dc578063a526c5d9146109f3578063b150a6f614610a3057610350565b80639f181b5e14610943578063a02956441461096e578063a0712d681461099757610350565b80638dd94bba116101a05780638dd94bba1461089b578063945ec9dd146108c457806395d89b41146108ef5780639e281a981461091a57610350565b806384c4bd4b146108295780638c80f23a146108545780638da5cb5b1461087057610350565b80633ccfd60b116102a05780635e1045ec1161023e5780636c0360eb116102185780636c0360eb1461077f5780636eee6274146107aa57806370a08231146107d5578063715018a61461081257610350565b80635e1045ec146106ee5780636352211e14610717578063636e746b1461075457610350565b80634f6ccce71161027a5780634f6ccce714610632578063518302271461066f57806355f804b31461069a5780635c975abb146106c357610350565b80633ccfd60b146105c257806342842e0e146105cc578063438b6300146105f557610350565b806315f91c181161030d578063279a669e116102e7578063279a669e146104f65780632acc659e1461051f5780632f745c591461055c578063397457911461059957610350565b806315f91c181461047757806318160ddd146104a257806323b872dd146104cd57610350565b806301ffc9a71461035557806302329a291461039257806306fdde03146103bb578063081812fc146103e6578063081c8c4414610423578063095ea7b31461044e575b600080fd5b34801561036157600080fd5b5061037c600480360381019061037791906143fc565b610cdf565b6040516103899190614c1a565b60405180910390f35b34801561039e57600080fd5b506103b960048036038101906103b491906143a2565b610d59565b005b3480156103c757600080fd5b506103d0610df2565b6040516103dd9190614c50565b60405180910390f35b3480156103f257600080fd5b5061040d6004803603810190610408919061449f565b610e84565b60405161041a9190614b31565b60405180910390f35b34801561042f57600080fd5b50610438610f09565b6040516104459190614c50565b60405180910390f35b34801561045a57600080fd5b5061047560048036038101906104709190614294565b610f97565b005b34801561048357600080fd5b5061048c6110af565b6040516104999190614f72565b60405180910390f35b3480156104ae57600080fd5b506104b76110d7565b6040516104c49190614f72565b60405180910390f35b3480156104d957600080fd5b506104f460048036038101906104ef919061417e565b6110e4565b005b34801561050257600080fd5b5061051d60048036038101906105189190614321565b611144565b005b34801561052b57600080fd5b5061054660048036038101906105419190614111565b611256565b6040516105539190614f72565b60405180910390f35b34801561056857600080fd5b50610583600480360381019061057e9190614294565b6112ff565b6040516105909190614f72565b60405180910390f35b3480156105a557600080fd5b506105c060048036038101906105bb91906142d4565b6113a4565b005b6105ca6114c5565b005b3480156105d857600080fd5b506105f360048036038101906105ee919061417e565b6115c1565b005b34801561060157600080fd5b5061061c60048036038101906106179190614111565b6115e1565b6040516106299190614bf8565b60405180910390f35b34801561063e57600080fd5b506106596004803603810190610654919061449f565b61168f565b6040516106669190614f72565b60405180910390f35b34801561067b57600080fd5b50610684611700565b6040516106919190614c1a565b60405180910390f35b3480156106a657600080fd5b506106c160048036038101906106bc9190614456565b611713565b005b3480156106cf57600080fd5b506106d86117a9565b6040516106e59190614c1a565b60405180910390f35b3480156106fa57600080fd5b50610715600480360381019061071091906142d4565b6117bc565b005b34801561072357600080fd5b5061073e6004803603810190610739919061449f565b6118dd565b60405161074b9190614b31565b60405180910390f35b34801561076057600080fd5b5061076961198f565b6040516107769190614f72565b60405180910390f35b34801561078b57600080fd5b50610794611995565b6040516107a19190614c50565b60405180910390f35b3480156107b657600080fd5b506107bf611a23565b6040516107cc9190614f72565b60405180910390f35b3480156107e157600080fd5b506107fc60048036038101906107f79190614111565b611a29565b6040516108099190614f72565b60405180910390f35b34801561081e57600080fd5b50610827611ae1565b005b34801561083557600080fd5b5061083e611b69565b60405161084b9190614f72565b60405180910390f35b61086e6004803603810190610869919061449f565b611b75565b005b34801561087c57600080fd5b50610885611dee565b6040516108929190614b31565b60405180910390f35b3480156108a757600080fd5b506108c260048036038101906108bd919061449f565b611e18565b005b3480156108d057600080fd5b506108d9611e9e565b6040516108e69190614f72565b60405180910390f35b3480156108fb57600080fd5b50610904611ea4565b6040516109119190614c50565b60405180910390f35b34801561092657600080fd5b50610941600480360381019061093c9190614294565b611f36565b005b34801561094f57600080fd5b5061095861204a565b6040516109659190614f72565b60405180910390f35b34801561097a57600080fd5b506109956004803603810190610990919061449f565b612054565b005b6109b160048036038101906109ac919061449f565b6120da565b005b3480156109bf57600080fd5b506109da60048036038101906109d59190614254565b612238565b005b3480156109e857600080fd5b506109f161224e565b005b3480156109ff57600080fd5b50610a1a6004803603810190610a159190614111565b6122e7565b604051610a279190614c1a565b60405180910390f35b348015610a3c57600080fd5b50610a456122ee565b604051610a529190614f72565b60405180910390f35b348015610a6757600080fd5b50610a826004803603810190610a7d91906141d1565b6122f4565b005b348015610a9057600080fd5b50610aab6004803603810190610aa6919061449f565b612356565b005b348015610ab957600080fd5b50610ad46004803603810190610acf919061449f565b6123dc565b005b348015610ae257600080fd5b50610aeb612462565b604051610af89190614c35565b60405180910390f35b348015610b0d57600080fd5b50610b16612488565b604051610b239190614c50565b60405180910390f35b348015610b3857600080fd5b50610b536004803603810190610b4e919061449f565b612516565b604051610b609190614c50565b60405180910390f35b348015610b7557600080fd5b50610b7e61266f565b604051610b8b9190614f72565b60405180910390f35b348015610ba057600080fd5b50610bbb6004803603810190610bb69190614456565b612675565b005b348015610bc957600080fd5b50610bd261270b565b604051610bdf9190614f72565b60405180910390f35b348015610bf457600080fd5b50610c0f6004803603810190610c0a919061413e565b61272c565b604051610c1c9190614c1a565b60405180910390f35b348015610c3157600080fd5b50610c4c6004803603810190610c479190614456565b6127c0565b005b348015610c5a57600080fd5b50610c756004803603810190610c709190614111565b612856565b005b348015610c8357600080fd5b50610c9e6004803603810190610c999190614111565b61294e565b604051610cab9190614c1a565b60405180910390f35b348015610cc057600080fd5b50610cc96129a4565b604051610cd69190614f72565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d525750610d51826129aa565b5b9050919050565b610d61612a8c565b73ffffffffffffffffffffffffffffffffffffffff16610d7f611dee565b73ffffffffffffffffffffffffffffffffffffffff1614610dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcc90614e52565b60405180910390fd5b80601660006101000a81548160ff02191690831515021790555050565b606060008054610e01906152c3565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2d906152c3565b8015610e7a5780601f10610e4f57610100808354040283529160200191610e7a565b820191906000526020600020905b815481529060010190602001808311610e5d57829003601f168201915b5050505050905090565b6000610e8f82612a94565b610ece576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec590614e32565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600f8054610f16906152c3565b80601f0160208091040260200160405190810160405280929190818152602001828054610f42906152c3565b8015610f8f5780601f10610f6457610100808354040283529160200191610f8f565b820191906000526020600020905b815481529060010190602001808311610f7257829003601f168201915b505050505081565b6000610fa2826118dd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100a90614ed2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611032612a8c565b73ffffffffffffffffffffffffffffffffffffffff16148061106157506110608161105b612a8c565b61272c565b5b6110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614d92565b60405180910390fd5b6110aa8383612b00565b505050565b60007f0000000000000000000000000000000000000000000000000000000000000000905090565b6000600880549050905090565b6110f56110ef612a8c565b82612bb9565b611134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112b90614f12565b60405180910390fd5b61113f838383612c97565b505050565b61114c612a8c565b73ffffffffffffffffffffffffffffffffffffffff1661116a611dee565b73ffffffffffffffffffffffffffffffffffffffff16146111c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b790614e52565b60405180910390fd5b60005b8484905081101561124f5760008383838181106111e3576111e261549c565b5b90506020020135905060005b8181101561123a5761122787878581811061120d5761120c61549c565b5b90506020020160208101906112229190614111565b612efe565b808061123290615326565b9150506111ef565b5050808061124790615326565b9150506111c3565b5050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112be90614eb2565b60405180910390fd5b601254601154116112f4576112db8261294e565b156112ea5760115490506112fa565b60125490506112fa565b60125490505b919050565b600061130a83611a29565b821061134b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134290614c72565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6113ac612a8c565b73ffffffffffffffffffffffffffffffffffffffff166113ca611dee565b73ffffffffffffffffffffffffffffffffffffffff1614611420576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141790614e52565b60405180910390fd5b60005b828290508110156114c0576000601760008585858181106114475761144661549c565b5b905060200201602081019061145c9190614111565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806114b890615326565b915050611423565b505050565b6114cd612a8c565b73ffffffffffffffffffffffffffffffffffffffff166114eb611dee565b73ffffffffffffffffffffffffffffffffffffffff1614611541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153890614e52565b60405180910390fd5b600061154b611dee565b73ffffffffffffffffffffffffffffffffffffffff164760405161156e90614b1c565b60006040518083038185875af1925050503d80600081146115ab576040519150601f19603f3d011682016040523d82523d6000602084013e6115b0565b606091505b50509050806115be57600080fd5b50565b6115dc838383604051806020016040528060008152506122f4565b505050565b606060006115ee83611a29565b905060008167ffffffffffffffff81111561160c5761160b6154cb565b5b60405190808252806020026020018201604052801561163a5781602001602082028036833780820191505090505b50905060005b828110156116845761165285826112ff565b8282815181106116655761166461549c565b5b602002602001018181525050808061167c90615326565b915050611640565b508092505050919050565b60006116996110d7565b82106116da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d190614f32565b60405180910390fd5b600882815481106116ee576116ed61549c565b5b90600052602060002001549050919050565b601660019054906101000a900460ff1681565b61171b612a8c565b73ffffffffffffffffffffffffffffffffffffffff16611739611dee565b73ffffffffffffffffffffffffffffffffffffffff161461178f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178690614e52565b60405180910390fd5b80600d90805190602001906117a5929190613e4f565b5050565b601660009054906101000a900460ff1681565b6117c4612a8c565b73ffffffffffffffffffffffffffffffffffffffff166117e2611dee565b73ffffffffffffffffffffffffffffffffffffffff1614611838576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182f90614e52565b60405180910390fd5b60005b828290508110156118d85760016017600085858581811061185f5761185e61549c565b5b90506020020160208101906118749190614111565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806118d090615326565b91505061183b565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614df2565b60405180910390fd5b80915050919050565b60105481565b600d80546119a2906152c3565b80601f01602080910402602001604051908101604052809291908181526020018280546119ce906152c3565b8015611a1b5780601f106119f057610100808354040283529160200191611a1b565b820191906000526020600020905b8154815290600101906020018083116119fe57829003601f168201915b505050505081565b60195481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9190614dd2565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611ae9612a8c565b73ffffffffffffffffffffffffffffffffffffffff16611b07611dee565b73ffffffffffffffffffffffffffffffffffffffff1614611b5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5490614e52565b60405180910390fd5b611b676000612f69565b565b60158060000154905081565b601660009054906101000a900460ff1615611bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbc90614e72565b60405180910390fd5b60008111611c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bff90614f52565b60405180910390fd5b6000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611c659190614b31565b60206040518083038186803b158015611c7d57600080fd5b505afa158015611c91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb591906144cc565b9050600082601954611cc79190615137565b905080821015611d0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0390614ef2565b60405180910390fd5b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401611d6b93929190614b4c565b602060405180830381600087803b158015611d8557600080fd5b505af1158015611d99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dbd91906143cf565b506000600190505b838111611de857611dd533612efe565b8080611de090615326565b915050611dc5565b50505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611e20612a8c565b73ffffffffffffffffffffffffffffffffffffffff16611e3e611dee565b73ffffffffffffffffffffffffffffffffffffffff1614611e94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8b90614e52565b60405180910390fd5b8060108190555050565b60125481565b606060018054611eb3906152c3565b80601f0160208091040260200160405190810160405280929190818152602001828054611edf906152c3565b8015611f2c5780601f10611f0157610100808354040283529160200191611f2c565b820191906000526020600020905b815481529060010190602001808311611f0f57829003601f168201915b5050505050905090565b611f3e612a8c565b73ffffffffffffffffffffffffffffffffffffffff16611f5c611dee565b73ffffffffffffffffffffffffffffffffffffffff1614611fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa990614e52565b60405180910390fd5b60008290508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401611ff2929190614bcf565b602060405180830381600087803b15801561200c57600080fd5b505af1158015612020573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061204491906143cf565b50505050565b6000600b54905090565b61205c612a8c565b73ffffffffffffffffffffffffffffffffffffffff1661207a611dee565b73ffffffffffffffffffffffffffffffffffffffff16146120d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c790614e52565b60405180910390fd5b8060118190555050565b601660009054906101000a900460ff161561212a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212190614e72565b60405180910390fd5b6000811161216d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216490614f52565b60405180910390fd5b600061217833611256565b9050612182611dee565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461220957600082826121c29190615137565b905080341015612207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fe90614ef2565b60405180910390fd5b505b6000600190505b8281116122335761222033612efe565b808061222b90615326565b915050612210565b505050565b61224a612243612a8c565b838361302f565b5050565b612256612a8c565b73ffffffffffffffffffffffffffffffffffffffff16612274611dee565b73ffffffffffffffffffffffffffffffffffffffff16146122ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c190614e52565b60405180910390fd5b6001601660016101000a81548160ff021916908315150217905550565b6000919050565b60145481565b6123056122ff612a8c565b83612bb9565b612344576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233b90614f12565b60405180910390fd5b6123508484848461319c565b50505050565b61235e612a8c565b73ffffffffffffffffffffffffffffffffffffffff1661237c611dee565b73ffffffffffffffffffffffffffffffffffffffff16146123d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c990614e52565b60405180910390fd5b8060198190555050565b6123e4612a8c565b73ffffffffffffffffffffffffffffffffffffffff16612402611dee565b73ffffffffffffffffffffffffffffffffffffffff1614612458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244f90614e52565b60405180910390fd5b8060128190555050565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e8054612495906152c3565b80601f01602080910402602001604051908101604052809291908181526020018280546124c1906152c3565b801561250e5780601f106124e35761010080835404028352916020019161250e565b820191906000526020600020905b8154815290600101906020018083116124f157829003601f168201915b505050505081565b606061252182612a94565b612560576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255790614e92565b60405180910390fd5b60001515601660019054906101000a900460ff161515141561260e57600f8054612589906152c3565b80601f01602080910402602001604051908101604052809291908181526020018280546125b5906152c3565b80156126025780601f106125d757610100808354040283529160200191612602565b820191906000526020600020905b8154815290600101906020018083116125e557829003601f168201915b5050505050905061266a565b60006126186131f8565b905060008151116126385760405180602001604052806000815250612666565b806126428461328a565b600e60405160200161265693929190614aeb565b6040516020818303038152906040525b9150505b919050565b60135481565b61267d612a8c565b73ffffffffffffffffffffffffffffffffffffffff1661269b611dee565b73ffffffffffffffffffffffffffffffffffffffff16146126f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e890614e52565b60405180910390fd5b80600e9080519060200190612707929190613e4f565b5050565b600061271561204a565b61271d6110af565b6127279190615191565b905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6127c8612a8c565b73ffffffffffffffffffffffffffffffffffffffff166127e6611dee565b73ffffffffffffffffffffffffffffffffffffffff161461283c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283390614e52565b60405180910390fd5b80600f9080519060200190612852929190613e4f565b5050565b61285e612a8c565b73ffffffffffffffffffffffffffffffffffffffff1661287c611dee565b73ffffffffffffffffffffffffffffffffffffffff16146128d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c990614e52565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612942576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293990614cb2565b60405180910390fd5b61294b81612f69565b50565b6000601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60115481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612a7557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612a855750612a84826133eb565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612b73836118dd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612bc482612a94565b612c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfa90614d72565b60405180910390fd5b6000612c0e836118dd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612c505750612c4f818561272c565b5b80612c8e57508373ffffffffffffffffffffffffffffffffffffffff16612c7684610e84565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612cb7826118dd565b73ffffffffffffffffffffffffffffffffffffffff1614612d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0490614cd2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7490614d12565b60405180910390fd5b612d88838383613455565b612d93600082612b00565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612de39190615191565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e3a91906150b0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ef9838383613569565b505050565b6000612f0861356e565b9050600081118015612f1c57506013548111155b612f5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5290614db2565b60405180910390fd5b612f6582826136d0565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561309e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161309590614d32565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161318f9190614c1a565b60405180910390a3505050565b6131a7848484612c97565b6131b3848484846136ee565b6131f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131e990614c92565b60405180910390fd5b50505050565b6060600d8054613207906152c3565b80601f0160208091040260200160405190810160405280929190818152602001828054613233906152c3565b80156132805780601f1061325557610100808354040283529160200191613280565b820191906000526020600020905b81548152906001019060200180831161326357829003601f168201915b5050505050905090565b606060008214156132d2576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506133e6565b600082905060005b600082146133045780806132ed90615326565b915050600a826132fd9190615106565b91506132da565b60008167ffffffffffffffff8111156133205761331f6154cb565b5b6040519080825280601f01601f1916602001820160405280156133525781602001600182028036833780820191505090505b5090505b600085146133df5760018261336b9190615191565b9150600a8561337a91906153af565b603061338691906150b0565b60f81b81838151811061339c5761339b61549c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133d89190615106565b9450613356565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613460838383613885565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156134a35761349e8161388a565b6134e2565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146134e1576134e083826138d3565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135255761352081613a40565b613564565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613563576135628282613b11565b5b5b505050565b505050565b60008061357961204a565b6135816110af565b61358b9190615191565b905060008133414445426040516020016135a9959493929190614a8c565b6040516020818303038152906040528051906020012060001c6135cc91906153af565b9050600080600c60008481526020019081526020016000205414156135f35781905061360a565b600c60008381526020019081526020016000205490505b6000600c600060018661361d9190615191565b815260200190815260200160002054141561365b5760018361363f9190615191565b600c600084815260200190815260200160002081905550613693565b600c600060018561366c9190615191565b815260200190815260200160002054600c6000848152602001908152602001600020819055505b61369b613b90565b507f0000000000000000000000000000000000000000000000000000000000000000816136c891906150b0565b935050505090565b6136ea828260405180602001604052806000815250613bf7565b5050565b600061370f8473ffffffffffffffffffffffffffffffffffffffff16613c52565b15613878578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613738612a8c565b8786866040518563ffffffff1660e01b815260040161375a9493929190614b83565b602060405180830381600087803b15801561377457600080fd5b505af19250505080156137a557506040513d601f19601f820116820180604052508101906137a29190614429565b60015b613828573d80600081146137d5576040519150601f19603f3d011682016040523d82523d6000602084013e6137da565b606091505b50600081511415613820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161381790614c92565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061387d565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016138e084611a29565b6138ea9190615191565b90506000600760008481526020019081526020016000205490508181146139cf576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613a549190615191565b9050600060096000848152602001908152602001600020549050600060088381548110613a8457613a8361549c565b5b906000526020600020015490508060088381548110613aa657613aa561549c565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613af557613af461546d565b5b6001900381819060005260206000200160009055905550505050565b6000613b1c83611a29565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080613b9b61270b565b11613bdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bd290614d52565b60405180910390fd5b600b6000815480929190613bee90615326565b91905055905090565b613c018383613c75565b613c0e60008484846136ee565b613c4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c4490614c92565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613ce5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613cdc90614e12565b60405180910390fd5b613cee81612a94565b15613d2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d2590614cf2565b60405180910390fd5b613d3a60008383613455565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613d8a91906150b0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613e4b60008383613569565b5050565b828054613e5b906152c3565b90600052602060002090601f016020900481019282613e7d5760008555613ec4565b82601f10613e9657805160ff1916838001178555613ec4565b82800160010185558215613ec4579182015b82811115613ec3578251825591602001919060010190613ea8565b5b509050613ed19190613ed5565b5090565b5b80821115613eee576000816000905550600101613ed6565b5090565b6000613f05613f0084614fb2565b614f8d565b905082815260208101848484011115613f2157613f20615509565b5b613f2c848285615281565b509392505050565b6000613f47613f4284614fe3565b614f8d565b905082815260208101848484011115613f6357613f62615509565b5b613f6e848285615281565b509392505050565b600081359050613f8581615b25565b92915050565b60008083601f840112613fa157613fa06154ff565b5b8235905067ffffffffffffffff811115613fbe57613fbd6154fa565b5b602083019150836020820283011115613fda57613fd9615504565b5b9250929050565b60008083601f840112613ff757613ff66154ff565b5b8235905067ffffffffffffffff811115614014576140136154fa565b5b6020830191508360208202830111156140305761402f615504565b5b9250929050565b60008135905061404681615b3c565b92915050565b60008151905061405b81615b3c565b92915050565b60008135905061407081615b53565b92915050565b60008151905061408581615b53565b92915050565b600082601f8301126140a05761409f6154ff565b5b81356140b0848260208601613ef2565b91505092915050565b600082601f8301126140ce576140cd6154ff565b5b81356140de848260208601613f34565b91505092915050565b6000813590506140f681615b6a565b92915050565b60008151905061410b81615b6a565b92915050565b60006020828403121561412757614126615513565b5b600061413584828501613f76565b91505092915050565b6000806040838503121561415557614154615513565b5b600061416385828601613f76565b925050602061417485828601613f76565b9150509250929050565b60008060006060848603121561419757614196615513565b5b60006141a586828701613f76565b93505060206141b686828701613f76565b92505060406141c7868287016140e7565b9150509250925092565b600080600080608085870312156141eb576141ea615513565b5b60006141f987828801613f76565b945050602061420a87828801613f76565b935050604061421b878288016140e7565b925050606085013567ffffffffffffffff81111561423c5761423b61550e565b5b6142488782880161408b565b91505092959194509250565b6000806040838503121561426b5761426a615513565b5b600061427985828601613f76565b925050602061428a85828601614037565b9150509250929050565b600080604083850312156142ab576142aa615513565b5b60006142b985828601613f76565b92505060206142ca858286016140e7565b9150509250929050565b600080602083850312156142eb576142ea615513565b5b600083013567ffffffffffffffff8111156143095761430861550e565b5b61431585828601613f8b565b92509250509250929050565b6000806000806040858703121561433b5761433a615513565b5b600085013567ffffffffffffffff8111156143595761435861550e565b5b61436587828801613f8b565b9450945050602085013567ffffffffffffffff8111156143885761438761550e565b5b61439487828801613fe1565b925092505092959194509250565b6000602082840312156143b8576143b7615513565b5b60006143c684828501614037565b91505092915050565b6000602082840312156143e5576143e4615513565b5b60006143f38482850161404c565b91505092915050565b60006020828403121561441257614411615513565b5b600061442084828501614061565b91505092915050565b60006020828403121561443f5761443e615513565b5b600061444d84828501614076565b91505092915050565b60006020828403121561446c5761446b615513565b5b600082013567ffffffffffffffff81111561448a5761448961550e565b5b614496848285016140b9565b91505092915050565b6000602082840312156144b5576144b4615513565b5b60006144c3848285016140e7565b91505092915050565b6000602082840312156144e2576144e1615513565b5b60006144f0848285016140fc565b91505092915050565b60006145058383614a57565b60208301905092915050565b61452261451d826151d7565b615381565b82525050565b614531816151c5565b82525050565b614548614543826151c5565b61536f565b82525050565b600061455982615039565b6145638185615067565b935061456e83615014565b8060005b8381101561459f57815161458688826144f9565b97506145918361505a565b925050600181019050614572565b5085935050505092915050565b6145b5816151e9565b82525050565b60006145c682615044565b6145d08185615078565b93506145e0818560208601615290565b6145e981615518565b840191505092915050565b6145fd8161524b565b82525050565b600061460e8261504f565b6146188185615094565b9350614628818560208601615290565b61463181615518565b840191505092915050565b60006146478261504f565b61465181856150a5565b9350614661818560208601615290565b80840191505092915050565b6000815461467a816152c3565b61468481866150a5565b9450600182166000811461469f57600181146146b0576146e3565b60ff198316865281860193506146e3565b6146b985615024565b60005b838110156146db578154818901526001820191506020810190506146bc565b838801955050505b50505092915050565b60006146f9602b83615094565b915061470482615536565b604082019050919050565b600061471c603283615094565b915061472782615585565b604082019050919050565b600061473f602683615094565b915061474a826155d4565b604082019050919050565b6000614762602583615094565b915061476d82615623565b604082019050919050565b6000614785601c83615094565b915061479082615672565b602082019050919050565b60006147a8602483615094565b91506147b38261569b565b604082019050919050565b60006147cb601983615094565b91506147d6826156ea565b602082019050919050565b60006147ee601883615094565b91506147f982615713565b602082019050919050565b6000614811602c83615094565b915061481c8261573c565b604082019050919050565b6000614834603883615094565b915061483f8261578b565b604082019050919050565b6000614857601183615094565b9150614862826157da565b602082019050919050565b600061487a602a83615094565b915061488582615803565b604082019050919050565b600061489d602983615094565b91506148a882615852565b604082019050919050565b60006148c0602083615094565b91506148cb826158a1565b602082019050919050565b60006148e3602c83615094565b91506148ee826158ca565b604082019050919050565b6000614906602083615094565b915061491182615919565b602082019050919050565b6000614929601683615094565b915061493482615942565b602082019050919050565b600061494c602f83615094565b91506149578261596b565b604082019050919050565b600061496f600d83615094565b915061497a826159ba565b602082019050919050565b6000614992602183615094565b915061499d826159e3565b604082019050919050565b60006149b5600083615089565b91506149c082615a32565b600082019050919050565b60006149d8601283615094565b91506149e382615a35565b602082019050919050565b60006149fb603183615094565b9150614a0682615a5e565b604082019050919050565b6000614a1e602c83615094565b9150614a2982615aad565b604082019050919050565b6000614a41601b83615094565b9150614a4c82615afc565b602082019050919050565b614a6081615241565b82525050565b614a6f81615241565b82525050565b614a86614a8182615241565b6153a5565b82525050565b6000614a988288614537565b601482019150614aa88287614511565b601482019150614ab88286614a75565b602082019150614ac88285614a75565b602082019150614ad88284614a75565b6020820191508190509695505050505050565b6000614af7828661463c565b9150614b03828561463c565b9150614b0f828461466d565b9150819050949350505050565b6000614b27826149a8565b9150819050919050565b6000602082019050614b466000830184614528565b92915050565b6000606082019050614b616000830186614528565b614b6e6020830185614528565b614b7b6040830184614a66565b949350505050565b6000608082019050614b986000830187614528565b614ba56020830186614528565b614bb26040830185614a66565b8181036060830152614bc481846145bb565b905095945050505050565b6000604082019050614be46000830185614528565b614bf16020830184614a66565b9392505050565b60006020820190508181036000830152614c12818461454e565b905092915050565b6000602082019050614c2f60008301846145ac565b92915050565b6000602082019050614c4a60008301846145f4565b92915050565b60006020820190508181036000830152614c6a8184614603565b905092915050565b60006020820190508181036000830152614c8b816146ec565b9050919050565b60006020820190508181036000830152614cab8161470f565b9050919050565b60006020820190508181036000830152614ccb81614732565b9050919050565b60006020820190508181036000830152614ceb81614755565b9050919050565b60006020820190508181036000830152614d0b81614778565b9050919050565b60006020820190508181036000830152614d2b8161479b565b9050919050565b60006020820190508181036000830152614d4b816147be565b9050919050565b60006020820190508181036000830152614d6b816147e1565b9050919050565b60006020820190508181036000830152614d8b81614804565b9050919050565b60006020820190508181036000830152614dab81614827565b9050919050565b60006020820190508181036000830152614dcb8161484a565b9050919050565b60006020820190508181036000830152614deb8161486d565b9050919050565b60006020820190508181036000830152614e0b81614890565b9050919050565b60006020820190508181036000830152614e2b816148b3565b9050919050565b60006020820190508181036000830152614e4b816148d6565b9050919050565b60006020820190508181036000830152614e6b816148f9565b9050919050565b60006020820190508181036000830152614e8b8161491c565b9050919050565b60006020820190508181036000830152614eab8161493f565b9050919050565b60006020820190508181036000830152614ecb81614962565b9050919050565b60006020820190508181036000830152614eeb81614985565b9050919050565b60006020820190508181036000830152614f0b816149cb565b9050919050565b60006020820190508181036000830152614f2b816149ee565b9050919050565b60006020820190508181036000830152614f4b81614a11565b9050919050565b60006020820190508181036000830152614f6b81614a34565b9050919050565b6000602082019050614f876000830184614a66565b92915050565b6000614f97614fa8565b9050614fa382826152f5565b919050565b6000604051905090565b600067ffffffffffffffff821115614fcd57614fcc6154cb565b5b614fd682615518565b9050602081019050919050565b600067ffffffffffffffff821115614ffe57614ffd6154cb565b5b61500782615518565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006150bb82615241565b91506150c683615241565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156150fb576150fa6153e0565b5b828201905092915050565b600061511182615241565b915061511c83615241565b92508261512c5761512b61540f565b5b828204905092915050565b600061514282615241565b915061514d83615241565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615186576151856153e0565b5b828202905092915050565b600061519c82615241565b91506151a783615241565b9250828210156151ba576151b96153e0565b5b828203905092915050565b60006151d082615221565b9050919050565b60006151e282615221565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006152568261525d565b9050919050565b60006152688261526f565b9050919050565b600061527a82615221565b9050919050565b82818337600083830152505050565b60005b838110156152ae578082015181840152602081019050615293565b838111156152bd576000848401525b50505050565b600060028204905060018216806152db57607f821691505b602082108114156152ef576152ee61543e565b5b50919050565b6152fe82615518565b810181811067ffffffffffffffff8211171561531d5761531c6154cb565b5b80604052505050565b600061533182615241565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615364576153636153e0565b5b600182019050919050565b600061537a82615393565b9050919050565b600061538c82615393565b9050919050565b600061539e82615529565b9050919050565b6000819050919050565b60006153ba82615241565b91506153c583615241565b9250826153d5576153d461540f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e6f206d6f726520746f6b656e7320617661696c61626c650000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4d696e74206e6f7420706f737369626c65000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f74686520636f6e74726163742069732070617573656400000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f6e6f742061646472657373203000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f6e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b615b2e816151c5565b8114615b3957600080fd5b50565b615b45816151e9565b8114615b5057600080fd5b50565b615b5c816151f5565b8114615b6757600080fd5b50565b615b7381615241565b8114615b7e57600080fd5b5056fea2646970667358221220a96aa74a098f8cb43232cffc0e5c2f5cbd03c23afc5784df0fe719e52de7562964736f6c63430008070033000000000000000000000000b20115b8b176d72f077c4f93e95492870240a0b2
Deployed Bytecode
0x6080604052600436106103505760003560e01c806384c4bd4b116101c6578063b88d4fde116100f7578063da3ef23f11610095578063f2c4ce1e1161006f578063f2c4ce1e14610c25578063f2fde38b14610c4e578063f99031a714610c77578063fc1a1c3614610cb457610350565b8063da3ef23f14610b94578063e14ca35314610bbd578063e985e9c514610be857610350565b8063c2cba306116100d1578063c2cba30614610ad6578063c668286214610b01578063c87b56dd14610b2c578063d5abeb0114610b6957610350565b8063b88d4fde14610a5b578063bb9e354714610a84578063bcb96f5214610aad57610350565b80639f181b5e11610164578063a22cb4651161013e578063a22cb465146109b3578063a475b5dd146109dc578063a526c5d9146109f3578063b150a6f614610a3057610350565b80639f181b5e14610943578063a02956441461096e578063a0712d681461099757610350565b80638dd94bba116101a05780638dd94bba1461089b578063945ec9dd146108c457806395d89b41146108ef5780639e281a981461091a57610350565b806384c4bd4b146108295780638c80f23a146108545780638da5cb5b1461087057610350565b80633ccfd60b116102a05780635e1045ec1161023e5780636c0360eb116102185780636c0360eb1461077f5780636eee6274146107aa57806370a08231146107d5578063715018a61461081257610350565b80635e1045ec146106ee5780636352211e14610717578063636e746b1461075457610350565b80634f6ccce71161027a5780634f6ccce714610632578063518302271461066f57806355f804b31461069a5780635c975abb146106c357610350565b80633ccfd60b146105c257806342842e0e146105cc578063438b6300146105f557610350565b806315f91c181161030d578063279a669e116102e7578063279a669e146104f65780632acc659e1461051f5780632f745c591461055c578063397457911461059957610350565b806315f91c181461047757806318160ddd146104a257806323b872dd146104cd57610350565b806301ffc9a71461035557806302329a291461039257806306fdde03146103bb578063081812fc146103e6578063081c8c4414610423578063095ea7b31461044e575b600080fd5b34801561036157600080fd5b5061037c600480360381019061037791906143fc565b610cdf565b6040516103899190614c1a565b60405180910390f35b34801561039e57600080fd5b506103b960048036038101906103b491906143a2565b610d59565b005b3480156103c757600080fd5b506103d0610df2565b6040516103dd9190614c50565b60405180910390f35b3480156103f257600080fd5b5061040d6004803603810190610408919061449f565b610e84565b60405161041a9190614b31565b60405180910390f35b34801561042f57600080fd5b50610438610f09565b6040516104459190614c50565b60405180910390f35b34801561045a57600080fd5b5061047560048036038101906104709190614294565b610f97565b005b34801561048357600080fd5b5061048c6110af565b6040516104999190614f72565b60405180910390f35b3480156104ae57600080fd5b506104b76110d7565b6040516104c49190614f72565b60405180910390f35b3480156104d957600080fd5b506104f460048036038101906104ef919061417e565b6110e4565b005b34801561050257600080fd5b5061051d60048036038101906105189190614321565b611144565b005b34801561052b57600080fd5b5061054660048036038101906105419190614111565b611256565b6040516105539190614f72565b60405180910390f35b34801561056857600080fd5b50610583600480360381019061057e9190614294565b6112ff565b6040516105909190614f72565b60405180910390f35b3480156105a557600080fd5b506105c060048036038101906105bb91906142d4565b6113a4565b005b6105ca6114c5565b005b3480156105d857600080fd5b506105f360048036038101906105ee919061417e565b6115c1565b005b34801561060157600080fd5b5061061c60048036038101906106179190614111565b6115e1565b6040516106299190614bf8565b60405180910390f35b34801561063e57600080fd5b506106596004803603810190610654919061449f565b61168f565b6040516106669190614f72565b60405180910390f35b34801561067b57600080fd5b50610684611700565b6040516106919190614c1a565b60405180910390f35b3480156106a657600080fd5b506106c160048036038101906106bc9190614456565b611713565b005b3480156106cf57600080fd5b506106d86117a9565b6040516106e59190614c1a565b60405180910390f35b3480156106fa57600080fd5b50610715600480360381019061071091906142d4565b6117bc565b005b34801561072357600080fd5b5061073e6004803603810190610739919061449f565b6118dd565b60405161074b9190614b31565b60405180910390f35b34801561076057600080fd5b5061076961198f565b6040516107769190614f72565b60405180910390f35b34801561078b57600080fd5b50610794611995565b6040516107a19190614c50565b60405180910390f35b3480156107b657600080fd5b506107bf611a23565b6040516107cc9190614f72565b60405180910390f35b3480156107e157600080fd5b506107fc60048036038101906107f79190614111565b611a29565b6040516108099190614f72565b60405180910390f35b34801561081e57600080fd5b50610827611ae1565b005b34801561083557600080fd5b5061083e611b69565b60405161084b9190614f72565b60405180910390f35b61086e6004803603810190610869919061449f565b611b75565b005b34801561087c57600080fd5b50610885611dee565b6040516108929190614b31565b60405180910390f35b3480156108a757600080fd5b506108c260048036038101906108bd919061449f565b611e18565b005b3480156108d057600080fd5b506108d9611e9e565b6040516108e69190614f72565b60405180910390f35b3480156108fb57600080fd5b50610904611ea4565b6040516109119190614c50565b60405180910390f35b34801561092657600080fd5b50610941600480360381019061093c9190614294565b611f36565b005b34801561094f57600080fd5b5061095861204a565b6040516109659190614f72565b60405180910390f35b34801561097a57600080fd5b506109956004803603810190610990919061449f565b612054565b005b6109b160048036038101906109ac919061449f565b6120da565b005b3480156109bf57600080fd5b506109da60048036038101906109d59190614254565b612238565b005b3480156109e857600080fd5b506109f161224e565b005b3480156109ff57600080fd5b50610a1a6004803603810190610a159190614111565b6122e7565b604051610a279190614c1a565b60405180910390f35b348015610a3c57600080fd5b50610a456122ee565b604051610a529190614f72565b60405180910390f35b348015610a6757600080fd5b50610a826004803603810190610a7d91906141d1565b6122f4565b005b348015610a9057600080fd5b50610aab6004803603810190610aa6919061449f565b612356565b005b348015610ab957600080fd5b50610ad46004803603810190610acf919061449f565b6123dc565b005b348015610ae257600080fd5b50610aeb612462565b604051610af89190614c35565b60405180910390f35b348015610b0d57600080fd5b50610b16612488565b604051610b239190614c50565b60405180910390f35b348015610b3857600080fd5b50610b536004803603810190610b4e919061449f565b612516565b604051610b609190614c50565b60405180910390f35b348015610b7557600080fd5b50610b7e61266f565b604051610b8b9190614f72565b60405180910390f35b348015610ba057600080fd5b50610bbb6004803603810190610bb69190614456565b612675565b005b348015610bc957600080fd5b50610bd261270b565b604051610bdf9190614f72565b60405180910390f35b348015610bf457600080fd5b50610c0f6004803603810190610c0a919061413e565b61272c565b604051610c1c9190614c1a565b60405180910390f35b348015610c3157600080fd5b50610c4c6004803603810190610c479190614456565b6127c0565b005b348015610c5a57600080fd5b50610c756004803603810190610c709190614111565b612856565b005b348015610c8357600080fd5b50610c9e6004803603810190610c999190614111565b61294e565b604051610cab9190614c1a565b60405180910390f35b348015610cc057600080fd5b50610cc96129a4565b604051610cd69190614f72565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d525750610d51826129aa565b5b9050919050565b610d61612a8c565b73ffffffffffffffffffffffffffffffffffffffff16610d7f611dee565b73ffffffffffffffffffffffffffffffffffffffff1614610dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcc90614e52565b60405180910390fd5b80601660006101000a81548160ff02191690831515021790555050565b606060008054610e01906152c3565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2d906152c3565b8015610e7a5780601f10610e4f57610100808354040283529160200191610e7a565b820191906000526020600020905b815481529060010190602001808311610e5d57829003601f168201915b5050505050905090565b6000610e8f82612a94565b610ece576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec590614e32565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600f8054610f16906152c3565b80601f0160208091040260200160405190810160405280929190818152602001828054610f42906152c3565b8015610f8f5780601f10610f6457610100808354040283529160200191610f8f565b820191906000526020600020905b815481529060010190602001808311610f7257829003601f168201915b505050505081565b6000610fa2826118dd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100a90614ed2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611032612a8c565b73ffffffffffffffffffffffffffffffffffffffff16148061106157506110608161105b612a8c565b61272c565b5b6110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614d92565b60405180910390fd5b6110aa8383612b00565b505050565b60007f0000000000000000000000000000000000000000000000000000000000000a28905090565b6000600880549050905090565b6110f56110ef612a8c565b82612bb9565b611134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112b90614f12565b60405180910390fd5b61113f838383612c97565b505050565b61114c612a8c565b73ffffffffffffffffffffffffffffffffffffffff1661116a611dee565b73ffffffffffffffffffffffffffffffffffffffff16146111c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b790614e52565b60405180910390fd5b60005b8484905081101561124f5760008383838181106111e3576111e261549c565b5b90506020020135905060005b8181101561123a5761122787878581811061120d5761120c61549c565b5b90506020020160208101906112229190614111565b612efe565b808061123290615326565b9150506111ef565b5050808061124790615326565b9150506111c3565b5050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112be90614eb2565b60405180910390fd5b601254601154116112f4576112db8261294e565b156112ea5760115490506112fa565b60125490506112fa565b60125490505b919050565b600061130a83611a29565b821061134b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134290614c72565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6113ac612a8c565b73ffffffffffffffffffffffffffffffffffffffff166113ca611dee565b73ffffffffffffffffffffffffffffffffffffffff1614611420576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141790614e52565b60405180910390fd5b60005b828290508110156114c0576000601760008585858181106114475761144661549c565b5b905060200201602081019061145c9190614111565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806114b890615326565b915050611423565b505050565b6114cd612a8c565b73ffffffffffffffffffffffffffffffffffffffff166114eb611dee565b73ffffffffffffffffffffffffffffffffffffffff1614611541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153890614e52565b60405180910390fd5b600061154b611dee565b73ffffffffffffffffffffffffffffffffffffffff164760405161156e90614b1c565b60006040518083038185875af1925050503d80600081146115ab576040519150601f19603f3d011682016040523d82523d6000602084013e6115b0565b606091505b50509050806115be57600080fd5b50565b6115dc838383604051806020016040528060008152506122f4565b505050565b606060006115ee83611a29565b905060008167ffffffffffffffff81111561160c5761160b6154cb565b5b60405190808252806020026020018201604052801561163a5781602001602082028036833780820191505090505b50905060005b828110156116845761165285826112ff565b8282815181106116655761166461549c565b5b602002602001018181525050808061167c90615326565b915050611640565b508092505050919050565b60006116996110d7565b82106116da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d190614f32565b60405180910390fd5b600882815481106116ee576116ed61549c565b5b90600052602060002001549050919050565b601660019054906101000a900460ff1681565b61171b612a8c565b73ffffffffffffffffffffffffffffffffffffffff16611739611dee565b73ffffffffffffffffffffffffffffffffffffffff161461178f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178690614e52565b60405180910390fd5b80600d90805190602001906117a5929190613e4f565b5050565b601660009054906101000a900460ff1681565b6117c4612a8c565b73ffffffffffffffffffffffffffffffffffffffff166117e2611dee565b73ffffffffffffffffffffffffffffffffffffffff1614611838576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182f90614e52565b60405180910390fd5b60005b828290508110156118d85760016017600085858581811061185f5761185e61549c565b5b90506020020160208101906118749190614111565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806118d090615326565b91505061183b565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614df2565b60405180910390fd5b80915050919050565b60105481565b600d80546119a2906152c3565b80601f01602080910402602001604051908101604052809291908181526020018280546119ce906152c3565b8015611a1b5780601f106119f057610100808354040283529160200191611a1b565b820191906000526020600020905b8154815290600101906020018083116119fe57829003601f168201915b505050505081565b60195481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9190614dd2565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611ae9612a8c565b73ffffffffffffffffffffffffffffffffffffffff16611b07611dee565b73ffffffffffffffffffffffffffffffffffffffff1614611b5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5490614e52565b60405180910390fd5b611b676000612f69565b565b60158060000154905081565b601660009054906101000a900460ff1615611bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbc90614e72565b60405180910390fd5b60008111611c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bff90614f52565b60405180910390fd5b6000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611c659190614b31565b60206040518083038186803b158015611c7d57600080fd5b505afa158015611c91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb591906144cc565b9050600082601954611cc79190615137565b905080821015611d0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0390614ef2565b60405180910390fd5b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401611d6b93929190614b4c565b602060405180830381600087803b158015611d8557600080fd5b505af1158015611d99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dbd91906143cf565b506000600190505b838111611de857611dd533612efe565b8080611de090615326565b915050611dc5565b50505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611e20612a8c565b73ffffffffffffffffffffffffffffffffffffffff16611e3e611dee565b73ffffffffffffffffffffffffffffffffffffffff1614611e94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8b90614e52565b60405180910390fd5b8060108190555050565b60125481565b606060018054611eb3906152c3565b80601f0160208091040260200160405190810160405280929190818152602001828054611edf906152c3565b8015611f2c5780601f10611f0157610100808354040283529160200191611f2c565b820191906000526020600020905b815481529060010190602001808311611f0f57829003601f168201915b5050505050905090565b611f3e612a8c565b73ffffffffffffffffffffffffffffffffffffffff16611f5c611dee565b73ffffffffffffffffffffffffffffffffffffffff1614611fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa990614e52565b60405180910390fd5b60008290508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401611ff2929190614bcf565b602060405180830381600087803b15801561200c57600080fd5b505af1158015612020573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061204491906143cf565b50505050565b6000600b54905090565b61205c612a8c565b73ffffffffffffffffffffffffffffffffffffffff1661207a611dee565b73ffffffffffffffffffffffffffffffffffffffff16146120d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c790614e52565b60405180910390fd5b8060118190555050565b601660009054906101000a900460ff161561212a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212190614e72565b60405180910390fd5b6000811161216d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216490614f52565b60405180910390fd5b600061217833611256565b9050612182611dee565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461220957600082826121c29190615137565b905080341015612207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fe90614ef2565b60405180910390fd5b505b6000600190505b8281116122335761222033612efe565b808061222b90615326565b915050612210565b505050565b61224a612243612a8c565b838361302f565b5050565b612256612a8c565b73ffffffffffffffffffffffffffffffffffffffff16612274611dee565b73ffffffffffffffffffffffffffffffffffffffff16146122ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c190614e52565b60405180910390fd5b6001601660016101000a81548160ff021916908315150217905550565b6000919050565b60145481565b6123056122ff612a8c565b83612bb9565b612344576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233b90614f12565b60405180910390fd5b6123508484848461319c565b50505050565b61235e612a8c565b73ffffffffffffffffffffffffffffffffffffffff1661237c611dee565b73ffffffffffffffffffffffffffffffffffffffff16146123d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c990614e52565b60405180910390fd5b8060198190555050565b6123e4612a8c565b73ffffffffffffffffffffffffffffffffffffffff16612402611dee565b73ffffffffffffffffffffffffffffffffffffffff1614612458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244f90614e52565b60405180910390fd5b8060128190555050565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e8054612495906152c3565b80601f01602080910402602001604051908101604052809291908181526020018280546124c1906152c3565b801561250e5780601f106124e35761010080835404028352916020019161250e565b820191906000526020600020905b8154815290600101906020018083116124f157829003601f168201915b505050505081565b606061252182612a94565b612560576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255790614e92565b60405180910390fd5b60001515601660019054906101000a900460ff161515141561260e57600f8054612589906152c3565b80601f01602080910402602001604051908101604052809291908181526020018280546125b5906152c3565b80156126025780601f106125d757610100808354040283529160200191612602565b820191906000526020600020905b8154815290600101906020018083116125e557829003601f168201915b5050505050905061266a565b60006126186131f8565b905060008151116126385760405180602001604052806000815250612666565b806126428461328a565b600e60405160200161265693929190614aeb565b6040516020818303038152906040525b9150505b919050565b60135481565b61267d612a8c565b73ffffffffffffffffffffffffffffffffffffffff1661269b611dee565b73ffffffffffffffffffffffffffffffffffffffff16146126f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e890614e52565b60405180910390fd5b80600e9080519060200190612707929190613e4f565b5050565b600061271561204a565b61271d6110af565b6127279190615191565b905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6127c8612a8c565b73ffffffffffffffffffffffffffffffffffffffff166127e6611dee565b73ffffffffffffffffffffffffffffffffffffffff161461283c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283390614e52565b60405180910390fd5b80600f9080519060200190612852929190613e4f565b5050565b61285e612a8c565b73ffffffffffffffffffffffffffffffffffffffff1661287c611dee565b73ffffffffffffffffffffffffffffffffffffffff16146128d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c990614e52565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612942576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293990614cb2565b60405180910390fd5b61294b81612f69565b50565b6000601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60115481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612a7557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612a855750612a84826133eb565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612b73836118dd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612bc482612a94565b612c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfa90614d72565b60405180910390fd5b6000612c0e836118dd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612c505750612c4f818561272c565b5b80612c8e57508373ffffffffffffffffffffffffffffffffffffffff16612c7684610e84565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612cb7826118dd565b73ffffffffffffffffffffffffffffffffffffffff1614612d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0490614cd2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7490614d12565b60405180910390fd5b612d88838383613455565b612d93600082612b00565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612de39190615191565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e3a91906150b0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ef9838383613569565b505050565b6000612f0861356e565b9050600081118015612f1c57506013548111155b612f5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5290614db2565b60405180910390fd5b612f6582826136d0565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561309e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161309590614d32565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161318f9190614c1a565b60405180910390a3505050565b6131a7848484612c97565b6131b3848484846136ee565b6131f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131e990614c92565b60405180910390fd5b50505050565b6060600d8054613207906152c3565b80601f0160208091040260200160405190810160405280929190818152602001828054613233906152c3565b80156132805780601f1061325557610100808354040283529160200191613280565b820191906000526020600020905b81548152906001019060200180831161326357829003601f168201915b5050505050905090565b606060008214156132d2576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506133e6565b600082905060005b600082146133045780806132ed90615326565b915050600a826132fd9190615106565b91506132da565b60008167ffffffffffffffff8111156133205761331f6154cb565b5b6040519080825280601f01601f1916602001820160405280156133525781602001600182028036833780820191505090505b5090505b600085146133df5760018261336b9190615191565b9150600a8561337a91906153af565b603061338691906150b0565b60f81b81838151811061339c5761339b61549c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133d89190615106565b9450613356565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613460838383613885565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156134a35761349e8161388a565b6134e2565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146134e1576134e083826138d3565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135255761352081613a40565b613564565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613563576135628282613b11565b5b5b505050565b505050565b60008061357961204a565b6135816110af565b61358b9190615191565b905060008133414445426040516020016135a9959493929190614a8c565b6040516020818303038152906040528051906020012060001c6135cc91906153af565b9050600080600c60008481526020019081526020016000205414156135f35781905061360a565b600c60008381526020019081526020016000205490505b6000600c600060018661361d9190615191565b815260200190815260200160002054141561365b5760018361363f9190615191565b600c600084815260200190815260200160002081905550613693565b600c600060018561366c9190615191565b815260200190815260200160002054600c6000848152602001908152602001600020819055505b61369b613b90565b507f0000000000000000000000000000000000000000000000000000000000000001816136c891906150b0565b935050505090565b6136ea828260405180602001604052806000815250613bf7565b5050565b600061370f8473ffffffffffffffffffffffffffffffffffffffff16613c52565b15613878578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613738612a8c565b8786866040518563ffffffff1660e01b815260040161375a9493929190614b83565b602060405180830381600087803b15801561377457600080fd5b505af19250505080156137a557506040513d601f19601f820116820180604052508101906137a29190614429565b60015b613828573d80600081146137d5576040519150601f19603f3d011682016040523d82523d6000602084013e6137da565b606091505b50600081511415613820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161381790614c92565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061387d565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016138e084611a29565b6138ea9190615191565b90506000600760008481526020019081526020016000205490508181146139cf576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613a549190615191565b9050600060096000848152602001908152602001600020549050600060088381548110613a8457613a8361549c565b5b906000526020600020015490508060088381548110613aa657613aa561549c565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613af557613af461546d565b5b6001900381819060005260206000200160009055905550505050565b6000613b1c83611a29565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080613b9b61270b565b11613bdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bd290614d52565b60405180910390fd5b600b6000815480929190613bee90615326565b91905055905090565b613c018383613c75565b613c0e60008484846136ee565b613c4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c4490614c92565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613ce5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613cdc90614e12565b60405180910390fd5b613cee81612a94565b15613d2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d2590614cf2565b60405180910390fd5b613d3a60008383613455565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613d8a91906150b0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613e4b60008383613569565b5050565b828054613e5b906152c3565b90600052602060002090601f016020900481019282613e7d5760008555613ec4565b82601f10613e9657805160ff1916838001178555613ec4565b82800160010185558215613ec4579182015b82811115613ec3578251825591602001919060010190613ea8565b5b509050613ed19190613ed5565b5090565b5b80821115613eee576000816000905550600101613ed6565b5090565b6000613f05613f0084614fb2565b614f8d565b905082815260208101848484011115613f2157613f20615509565b5b613f2c848285615281565b509392505050565b6000613f47613f4284614fe3565b614f8d565b905082815260208101848484011115613f6357613f62615509565b5b613f6e848285615281565b509392505050565b600081359050613f8581615b25565b92915050565b60008083601f840112613fa157613fa06154ff565b5b8235905067ffffffffffffffff811115613fbe57613fbd6154fa565b5b602083019150836020820283011115613fda57613fd9615504565b5b9250929050565b60008083601f840112613ff757613ff66154ff565b5b8235905067ffffffffffffffff811115614014576140136154fa565b5b6020830191508360208202830111156140305761402f615504565b5b9250929050565b60008135905061404681615b3c565b92915050565b60008151905061405b81615b3c565b92915050565b60008135905061407081615b53565b92915050565b60008151905061408581615b53565b92915050565b600082601f8301126140a05761409f6154ff565b5b81356140b0848260208601613ef2565b91505092915050565b600082601f8301126140ce576140cd6154ff565b5b81356140de848260208601613f34565b91505092915050565b6000813590506140f681615b6a565b92915050565b60008151905061410b81615b6a565b92915050565b60006020828403121561412757614126615513565b5b600061413584828501613f76565b91505092915050565b6000806040838503121561415557614154615513565b5b600061416385828601613f76565b925050602061417485828601613f76565b9150509250929050565b60008060006060848603121561419757614196615513565b5b60006141a586828701613f76565b93505060206141b686828701613f76565b92505060406141c7868287016140e7565b9150509250925092565b600080600080608085870312156141eb576141ea615513565b5b60006141f987828801613f76565b945050602061420a87828801613f76565b935050604061421b878288016140e7565b925050606085013567ffffffffffffffff81111561423c5761423b61550e565b5b6142488782880161408b565b91505092959194509250565b6000806040838503121561426b5761426a615513565b5b600061427985828601613f76565b925050602061428a85828601614037565b9150509250929050565b600080604083850312156142ab576142aa615513565b5b60006142b985828601613f76565b92505060206142ca858286016140e7565b9150509250929050565b600080602083850312156142eb576142ea615513565b5b600083013567ffffffffffffffff8111156143095761430861550e565b5b61431585828601613f8b565b92509250509250929050565b6000806000806040858703121561433b5761433a615513565b5b600085013567ffffffffffffffff8111156143595761435861550e565b5b61436587828801613f8b565b9450945050602085013567ffffffffffffffff8111156143885761438761550e565b5b61439487828801613fe1565b925092505092959194509250565b6000602082840312156143b8576143b7615513565b5b60006143c684828501614037565b91505092915050565b6000602082840312156143e5576143e4615513565b5b60006143f38482850161404c565b91505092915050565b60006020828403121561441257614411615513565b5b600061442084828501614061565b91505092915050565b60006020828403121561443f5761443e615513565b5b600061444d84828501614076565b91505092915050565b60006020828403121561446c5761446b615513565b5b600082013567ffffffffffffffff81111561448a5761448961550e565b5b614496848285016140b9565b91505092915050565b6000602082840312156144b5576144b4615513565b5b60006144c3848285016140e7565b91505092915050565b6000602082840312156144e2576144e1615513565b5b60006144f0848285016140fc565b91505092915050565b60006145058383614a57565b60208301905092915050565b61452261451d826151d7565b615381565b82525050565b614531816151c5565b82525050565b614548614543826151c5565b61536f565b82525050565b600061455982615039565b6145638185615067565b935061456e83615014565b8060005b8381101561459f57815161458688826144f9565b97506145918361505a565b925050600181019050614572565b5085935050505092915050565b6145b5816151e9565b82525050565b60006145c682615044565b6145d08185615078565b93506145e0818560208601615290565b6145e981615518565b840191505092915050565b6145fd8161524b565b82525050565b600061460e8261504f565b6146188185615094565b9350614628818560208601615290565b61463181615518565b840191505092915050565b60006146478261504f565b61465181856150a5565b9350614661818560208601615290565b80840191505092915050565b6000815461467a816152c3565b61468481866150a5565b9450600182166000811461469f57600181146146b0576146e3565b60ff198316865281860193506146e3565b6146b985615024565b60005b838110156146db578154818901526001820191506020810190506146bc565b838801955050505b50505092915050565b60006146f9602b83615094565b915061470482615536565b604082019050919050565b600061471c603283615094565b915061472782615585565b604082019050919050565b600061473f602683615094565b915061474a826155d4565b604082019050919050565b6000614762602583615094565b915061476d82615623565b604082019050919050565b6000614785601c83615094565b915061479082615672565b602082019050919050565b60006147a8602483615094565b91506147b38261569b565b604082019050919050565b60006147cb601983615094565b91506147d6826156ea565b602082019050919050565b60006147ee601883615094565b91506147f982615713565b602082019050919050565b6000614811602c83615094565b915061481c8261573c565b604082019050919050565b6000614834603883615094565b915061483f8261578b565b604082019050919050565b6000614857601183615094565b9150614862826157da565b602082019050919050565b600061487a602a83615094565b915061488582615803565b604082019050919050565b600061489d602983615094565b91506148a882615852565b604082019050919050565b60006148c0602083615094565b91506148cb826158a1565b602082019050919050565b60006148e3602c83615094565b91506148ee826158ca565b604082019050919050565b6000614906602083615094565b915061491182615919565b602082019050919050565b6000614929601683615094565b915061493482615942565b602082019050919050565b600061494c602f83615094565b91506149578261596b565b604082019050919050565b600061496f600d83615094565b915061497a826159ba565b602082019050919050565b6000614992602183615094565b915061499d826159e3565b604082019050919050565b60006149b5600083615089565b91506149c082615a32565b600082019050919050565b60006149d8601283615094565b91506149e382615a35565b602082019050919050565b60006149fb603183615094565b9150614a0682615a5e565b604082019050919050565b6000614a1e602c83615094565b9150614a2982615aad565b604082019050919050565b6000614a41601b83615094565b9150614a4c82615afc565b602082019050919050565b614a6081615241565b82525050565b614a6f81615241565b82525050565b614a86614a8182615241565b6153a5565b82525050565b6000614a988288614537565b601482019150614aa88287614511565b601482019150614ab88286614a75565b602082019150614ac88285614a75565b602082019150614ad88284614a75565b6020820191508190509695505050505050565b6000614af7828661463c565b9150614b03828561463c565b9150614b0f828461466d565b9150819050949350505050565b6000614b27826149a8565b9150819050919050565b6000602082019050614b466000830184614528565b92915050565b6000606082019050614b616000830186614528565b614b6e6020830185614528565b614b7b6040830184614a66565b949350505050565b6000608082019050614b986000830187614528565b614ba56020830186614528565b614bb26040830185614a66565b8181036060830152614bc481846145bb565b905095945050505050565b6000604082019050614be46000830185614528565b614bf16020830184614a66565b9392505050565b60006020820190508181036000830152614c12818461454e565b905092915050565b6000602082019050614c2f60008301846145ac565b92915050565b6000602082019050614c4a60008301846145f4565b92915050565b60006020820190508181036000830152614c6a8184614603565b905092915050565b60006020820190508181036000830152614c8b816146ec565b9050919050565b60006020820190508181036000830152614cab8161470f565b9050919050565b60006020820190508181036000830152614ccb81614732565b9050919050565b60006020820190508181036000830152614ceb81614755565b9050919050565b60006020820190508181036000830152614d0b81614778565b9050919050565b60006020820190508181036000830152614d2b8161479b565b9050919050565b60006020820190508181036000830152614d4b816147be565b9050919050565b60006020820190508181036000830152614d6b816147e1565b9050919050565b60006020820190508181036000830152614d8b81614804565b9050919050565b60006020820190508181036000830152614dab81614827565b9050919050565b60006020820190508181036000830152614dcb8161484a565b9050919050565b60006020820190508181036000830152614deb8161486d565b9050919050565b60006020820190508181036000830152614e0b81614890565b9050919050565b60006020820190508181036000830152614e2b816148b3565b9050919050565b60006020820190508181036000830152614e4b816148d6565b9050919050565b60006020820190508181036000830152614e6b816148f9565b9050919050565b60006020820190508181036000830152614e8b8161491c565b9050919050565b60006020820190508181036000830152614eab8161493f565b9050919050565b60006020820190508181036000830152614ecb81614962565b9050919050565b60006020820190508181036000830152614eeb81614985565b9050919050565b60006020820190508181036000830152614f0b816149cb565b9050919050565b60006020820190508181036000830152614f2b816149ee565b9050919050565b60006020820190508181036000830152614f4b81614a11565b9050919050565b60006020820190508181036000830152614f6b81614a34565b9050919050565b6000602082019050614f876000830184614a66565b92915050565b6000614f97614fa8565b9050614fa382826152f5565b919050565b6000604051905090565b600067ffffffffffffffff821115614fcd57614fcc6154cb565b5b614fd682615518565b9050602081019050919050565b600067ffffffffffffffff821115614ffe57614ffd6154cb565b5b61500782615518565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006150bb82615241565b91506150c683615241565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156150fb576150fa6153e0565b5b828201905092915050565b600061511182615241565b915061511c83615241565b92508261512c5761512b61540f565b5b828204905092915050565b600061514282615241565b915061514d83615241565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615186576151856153e0565b5b828202905092915050565b600061519c82615241565b91506151a783615241565b9250828210156151ba576151b96153e0565b5b828203905092915050565b60006151d082615221565b9050919050565b60006151e282615221565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006152568261525d565b9050919050565b60006152688261526f565b9050919050565b600061527a82615221565b9050919050565b82818337600083830152505050565b60005b838110156152ae578082015181840152602081019050615293565b838111156152bd576000848401525b50505050565b600060028204905060018216806152db57607f821691505b602082108114156152ef576152ee61543e565b5b50919050565b6152fe82615518565b810181811067ffffffffffffffff8211171561531d5761531c6154cb565b5b80604052505050565b600061533182615241565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615364576153636153e0565b5b600182019050919050565b600061537a82615393565b9050919050565b600061538c82615393565b9050919050565b600061539e82615529565b9050919050565b6000819050919050565b60006153ba82615241565b91506153c583615241565b9250826153d5576153d461540f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e6f206d6f726520746f6b656e7320617661696c61626c650000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4d696e74206e6f7420706f737369626c65000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f74686520636f6e74726163742069732070617573656400000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f6e6f742061646472657373203000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f6e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b615b2e816151c5565b8114615b3957600080fd5b50565b615b45816151e9565b8114615b5057600080fd5b50565b615b5c816151f5565b8114615b6757600080fd5b50565b615b7381615241565b8114615b7e57600080fd5b5056fea2646970667358221220a96aa74a098f8cb43232cffc0e5c2f5cbd03c23afc5784df0fe719e52de7562964736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b20115b8b176d72f077c4f93e95492870240a0b2
-----Decoded View---------------
Arg [0] : _TokenAddress (address): 0xB20115B8B176D72F077C4f93e95492870240a0b2
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000b20115b8b176d72f077c4f93e95492870240a0b2
Deployed Bytecode Sourcemap
67957:6515:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61636:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72667:73;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48455:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50015:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68190:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49538:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22088:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62276:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50765:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69815:315;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68992:347;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61944:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72936:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73659:455;;;:::i;:::-;;51175:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71197:348;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62466:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68499:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72307:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68469:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72746:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48149:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68223:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68101:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68601:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47879:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27013:103;;;;;;;;;;;;;:::i;:::-;;68425:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70156:606;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26362:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73459:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68314:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48624:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74122:347;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22362:80;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73557:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69362:445;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50308:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72236:65;;;;;;;;;;;;;:::i;:::-;;73193:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68394:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51431:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73367:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73273:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68570:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68148:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71717:497;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68358:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72411:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22539:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50534:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72541:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27271:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71087:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68267:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61636:224;61738:4;61777:35;61762:50;;;:11;:50;;;;:90;;;;61816:36;61840:11;61816:23;:36::i;:::-;61762:90;61755:97;;61636:224;;;:::o;72667:73::-;26593:12;:10;:12::i;:::-;26582:23;;:7;:5;:7::i;:::-;:23;;;26574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72728:6:::1;72719;;:15;;;;;;;;;;;;;;;;;;72667:73:::0;:::o;48455:100::-;48509:13;48542:5;48535:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48455:100;:::o;50015:221::-;50091:7;50119:16;50127:7;50119;:16::i;:::-;50111:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;50204:15;:24;50220:7;50204:24;;;;;;;;;;;;;;;;;;;;;50197:31;;50015:221;;;:::o;68190:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49538:411::-;49619:13;49635:23;49650:7;49635:14;:23::i;:::-;49619:39;;49683:5;49677:11;;:2;:11;;;;49669:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;49777:5;49761:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;49786:37;49803:5;49810:12;:10;:12::i;:::-;49786:16;:37::i;:::-;49761:62;49739:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;49920:21;49929:2;49933:7;49920:8;:21::i;:::-;49608:341;49538:411;;:::o;22088:96::-;22139:7;22160:19;22153:26;;22088:96;:::o;62276:113::-;62337:7;62364:10;:17;;;;62357:24;;62276:113;:::o;50765:339::-;50960:41;50979:12;:10;:12::i;:::-;50993:7;50960:18;:41::i;:::-;50952:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;51068:28;51078:4;51084:2;51088:7;51068:9;:28::i;:::-;50765:339;;;:::o;69815:315::-;26593:12;:10;:12::i;:::-;26582:23;;:7;:5;:7::i;:::-;:23;;;26574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69923:9:::1;69918:205;69942:7;;:14;;69938:1;:18;69918:205;;;69974:20;69997:6;;70004:1;69997:9;;;;;;;:::i;:::-;;;;;;;;69974:32;;70022:9;70017:99;70041:12;70037:1;:16;70017:99;;;70075:25;70089:7;;70097:1;70089:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;70075:13;:25::i;:::-;70055:3;;;;;:::i;:::-;;;;70017:99;;;;69963:160;69958:3;;;;;:::i;:::-;;;;69918:205;;;;69815:315:::0;;;;:::o;68992:347::-;69049:7;69093:1;69073:22;;:8;:22;;;;69065:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;69142:11;;69124:14;;:29;69120:214;;69170:21;69182:8;69170:11;:21::i;:::-;69166:118;;;69211:14;;69204:21;;;;69166:118;69261:11;;69254:18;;;;69120:214;69315:11;;69308:18;;68992:347;;;;:::o;61944:256::-;62041:7;62077:23;62094:5;62077:16;:23::i;:::-;62069:5;:31;62061:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;62166:12;:19;62179:5;62166:19;;;;;;;;;;;;;;;:26;62186:5;62166:26;;;;;;;;;;;;62159:33;;61944:256;;;;:::o;72936:186::-;26593:12;:10;:12::i;:::-;26582:23;;:7;:5;:7::i;:::-;:23;;;26574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73020:6:::1;73015:94;73036:9;;:16;;73032:1;:20;73015:94;;;73096:5;73070:9;:23;73080:9;;73090:1;73080:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;73070:23;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;73054:3;;;;;:::i;:::-;;;;73015:94;;;;72936:186:::0;;:::o;73659:455::-;26593:12;:10;:12::i;:::-;26582:23;;:7;:5;:7::i;:::-;:23;;;26574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73936:7:::1;73957;:5;:7::i;:::-;73949:21;;73978;73949:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73935:69;;;74019:2;74011:11;;;::::0;::::1;;73704:410;73659:455::o:0;51175:185::-;51313:39;51330:4;51336:2;51340:7;51313:39;;;;;;;;;;;;:16;:39::i;:::-;51175:185;;;:::o;71197:348::-;71272:16;71300:23;71326:17;71336:6;71326:9;:17::i;:::-;71300:43;;71350:25;71392:15;71378:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71350:58;;71420:9;71415:103;71435:15;71431:1;:19;71415:103;;;71480:30;71500:6;71508:1;71480:19;:30::i;:::-;71466:8;71475:1;71466:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;71452:3;;;;;:::i;:::-;;;;71415:103;;;;71531:8;71524:15;;;;71197:348;;;:::o;62466:233::-;62541:7;62577:30;:28;:30::i;:::-;62569:5;:38;62561:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;62674:10;62685:5;62674:17;;;;;;;;:::i;:::-;;;;;;;;;;62667:24;;62466:233;;;:::o;68499:27::-;;;;;;;;;;;;;:::o;72307:98::-;26593:12;:10;:12::i;:::-;26582:23;;:7;:5;:7::i;:::-;:23;;;26574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72388:11:::1;72378:7;:21;;;;;;;;;;;;:::i;:::-;;72307:98:::0;:::o;68469:25::-;;;;;;;;;;;;;:::o;72746:182::-;26593:12;:10;:12::i;:::-;26582:23;;:7;:5;:7::i;:::-;:23;;;26574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72827:6:::1;72822:93;72843:9;;:16;;72839:1;:20;72822:93;;;72903:4;72877:9;:23;72887:9;;72897:1;72887:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;72877:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;72861:3;;;;;:::i;:::-;;;;72822:93;;;;72746:182:::0;;:::o;48149:239::-;48221:7;48241:13;48257:7;:16;48265:7;48257:16;;;;;;;;;;;;;;;;;;;;;48241:32;;48309:1;48292:19;;:5;:19;;;;48284:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;48375:5;48368:12;;;48149:239;;;:::o;68223:39::-;;;;:::o;68101:42::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;68601:43::-;;;;:::o;47879:208::-;47951:7;47996:1;47979:19;;:5;:19;;;;47971:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;48063:9;:16;48073:5;48063:16;;;;;;;;;;;;;;;;48056:23;;47879:208;;;:::o;27013:103::-;26593:12;:10;:12::i;:::-;26582:23;;:7;:5;:7::i;:::-;:23;;;26574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27078:30:::1;27105:1;27078:18;:30::i;:::-;27013:103::o:0;68425:39::-;;;;;;;;;:::o;70156:606::-;70228:6;;;;;;;;;;;70227:7;70219:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;70288:1;70276:9;:13;70268:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;70328:21;70352:12;;;;;;;;;;;:22;;;70375:10;70352:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70328:58;;70393:21;70449:9;70437;;:21;;;;:::i;:::-;70421:37;;70550:13;70534;:29;;70526:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;70597:12;;;;;;;;;;;:25;;;70623:10;70643:4;70649:13;70597:66;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;70679:9;70691:1;70679:13;;70674:83;70699:9;70694:1;:14;70674:83;;70724:25;70738:10;70724:13;:25::i;:::-;70710:3;;;;;:::i;:::-;;;;70674:83;;;;70212:550;;70156:606;:::o;26362:87::-;26408:7;26435:6;;;;;;;;;;;26428:13;;26362:87;:::o;73459:90::-;26593:12;:10;:12::i;:::-;26582:23;;:7;:5;:7::i;:::-;:23;;;26574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73538:5:::1;73524:11;:19;;;;73459:90:::0;:::o;68314:39::-;;;;:::o;48624:104::-;48680:13;48713:7;48706:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48624:104;:::o;74122:347::-;26593:12;:10;:12::i;:::-;26582:23;;:7;:5;:7::i;:::-;:23;;;26574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74215:20:::1;74245:14;74215:45;;74418:13;:22;;;74441:10;74453:7;74418:43;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;74204:265;74122:347:::0;;:::o;22362:80::-;22405:7;22426:11;;22419:18;;22362:80;:::o;73557:96::-;26593:12;:10;:12::i;:::-;26582:23;;:7;:5;:7::i;:::-;:23;;;26574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73642:5:::1;73625:14;:22;;;;73557:96:::0;:::o;69362:445::-;69423:6;;;;;;;;;;;69422:7;69414:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;69480:1;69471:6;:10;69463:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;69520:12;69546:20;69555:10;69546:8;:20::i;:::-;69539:27;;69593:7;:5;:7::i;:::-;69579:21;;:10;:21;;;69575:141;;69614:14;69638:6;69631:4;:13;;;;:::i;:::-;69614:30;;69676:9;69663;:22;;69655:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;69602:114;69575:141;69727:9;69739:1;69727:13;;69722:80;69747:6;69742:1;:11;69722:80;;69769:25;69783:10;69769:13;:25::i;:::-;69755:3;;;;;:::i;:::-;;;;69722:80;;;;69407:400;69362:445;:::o;50308:155::-;50403:52;50422:12;:10;:12::i;:::-;50436:8;50446;50403:18;:52::i;:::-;50308:155;;:::o;72236:65::-;26593:12;:10;:12::i;:::-;26582:23;;:7;:5;:7::i;:::-;:23;;;26574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72291:4:::1;72280:8;;:15;;;;;;;;;;;;;;;;;;72236:65::o:0;73193:74::-;73252:4;73193:74;;;:::o;68394:26::-;;;;:::o;51431:328::-;51606:41;51625:12;:10;:12::i;:::-;51639:7;51606:18;:41::i;:::-;51598:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;51712:39;51726:4;51732:2;51736:7;51745:5;51712:13;:39::i;:::-;51431:328;;;;:::o;73367:86::-;26593:12;:10;:12::i;:::-;26582:23;;:7;:5;:7::i;:::-;:23;;;26574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73442:5:::1;73430:9;:17;;;;73367:86:::0;:::o;73273:90::-;26593:12;:10;:12::i;:::-;26582:23;;:7;:5;:7::i;:::-;:23;;;26574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73352:5:::1;73338:11;:19;;;;73273:90:::0;:::o;68570:26::-;;;;;;;;;;;;;:::o;68148:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;71717:497::-;71815:13;71856:16;71864:7;71856;:16::i;:::-;71840:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;71965:5;71953:17;;:8;;;;;;;;;;;:17;;;71950:62;;;71990:14;71983:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71950:62;72020:28;72051:10;:8;:10::i;:::-;72020:41;;72106:1;72081:14;72075:28;:32;:133;;;;;;;;;;;;;;;;;72143:14;72159:18;:7;:16;:18::i;:::-;72179:13;72126:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;72075:133;72068:140;;;71717:497;;;;:::o;68358:31::-;;;;:::o;72411:122::-;26593:12;:10;:12::i;:::-;26582:23;;:7;:5;:7::i;:::-;:23;;;26574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72510:17:::1;72494:13;:33;;;;;;;;;;;;:::i;:::-;;72411:122:::0;:::o;22539:113::-;22591:7;22635:12;:10;:12::i;:::-;22612:20;:18;:20::i;:::-;:35;;;;:::i;:::-;22605:42;;22539:113;:::o;50534:164::-;50631:4;50655:18;:25;50674:5;50655:25;;;;;;;;;;;;;;;:35;50681:8;50655:35;;;;;;;;;;;;;;;;;;;;;;;;;50648:42;;50534:164;;;;:::o;72541:120::-;26593:12;:10;:12::i;:::-;26582:23;;:7;:5;:7::i;:::-;:23;;;26574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72640:15:::1;72623:14;:32;;;;;;;;;;;;:::i;:::-;;72541:120:::0;:::o;27271:201::-;26593:12;:10;:12::i;:::-;26582:23;;:7;:5;:7::i;:::-;:23;;;26574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27380:1:::1;27360:22;;:8;:22;;;;27352:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27436:28;27455:8;27436:18;:28::i;:::-;27271:201:::0;:::o;71087:104::-;71146:4;71166:9;:19;71176:8;71166:19;;;;;;;;;;;;;;;;;;;;;;;;;71159:26;;71087:104;;;:::o;68267:42::-;;;;:::o;47510:305::-;47612:4;47664:25;47649:40;;;:11;:40;;;;:105;;;;47721:33;47706:48;;;:11;:48;;;;47649:105;:158;;;;47771:36;47795:11;47771:23;:36::i;:::-;47649:158;47629:178;;47510:305;;;:::o;2474:98::-;2527:7;2554:10;2547:17;;2474:98;:::o;53269:127::-;53334:4;53386:1;53358:30;;:7;:16;53366:7;53358:16;;;;;;;;;;;;;;;;;;;;;:30;;;;53351:37;;53269:127;;;:::o;57415:174::-;57517:2;57490:15;:24;57506:7;57490:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;57573:7;57569:2;57535:46;;57544:23;57559:7;57544:14;:23::i;:::-;57535:46;;;;;;;;;;;;57415:174;;:::o;53563:348::-;53656:4;53681:16;53689:7;53681;:16::i;:::-;53673:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;53757:13;53773:23;53788:7;53773:14;:23::i;:::-;53757:39;;53826:5;53815:16;;:7;:16;;;:52;;;;53835:32;53852:5;53859:7;53835:16;:32::i;:::-;53815:52;:87;;;;53895:7;53871:31;;:20;53883:7;53871:11;:20::i;:::-;:31;;;53815:87;53807:96;;;53563:348;;;;:::o;56672:625::-;56831:4;56804:31;;:23;56819:7;56804:14;:23::i;:::-;:31;;;56796:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;56910:1;56896:16;;:2;:16;;;;56888:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;56966:39;56987:4;56993:2;56997:7;56966:20;:39::i;:::-;57070:29;57087:1;57091:7;57070:8;:29::i;:::-;57131:1;57112:9;:15;57122:4;57112:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;57160:1;57143:9;:13;57153:2;57143:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;57191:2;57172:7;:16;57180:7;57172:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;57230:7;57226:2;57211:27;;57220:4;57211:27;;;;;;;;;;;;57251:38;57271:4;57277:2;57281:7;57251:19;:38::i;:::-;56672:625;;;:::o;71551:157::-;71598:10;71611:11;:9;:11::i;:::-;71598:24;;71639:1;71634:2;:6;:25;;;;;71650:9;;71644:2;:15;;71634:25;71626:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;71685:17;71695:2;71699;71685:9;:17::i;:::-;71594:114;71551:157;:::o;27632:191::-;27706:16;27725:6;;;;;;;;;;;27706:25;;27751:8;27742:6;;:17;;;;;;;;;;;;;;;;;;27806:8;27775:40;;27796:8;27775:40;;;;;;;;;;;;27695:128;27632:191;:::o;57731:315::-;57886:8;57877:17;;:5;:17;;;;57869:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;57973:8;57935:18;:25;57954:5;57935:25;;;;;;;;;;;;;;;:35;57961:8;57935:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;58019:8;57997:41;;58012:5;57997:41;;;58029:8;57997:41;;;;;;:::i;:::-;;;;;;;;57731:315;;;:::o;52641:::-;52798:28;52808:4;52814:2;52818:7;52798:9;:28::i;:::-;52845:48;52868:4;52874:2;52878:7;52887:5;52845:22;:48::i;:::-;52837:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;52641:315;;;;:::o;68884:102::-;68944:13;68973:7;68966:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68884:102;:::o;19642:723::-;19698:13;19928:1;19919:5;:10;19915:53;;;19946:10;;;;;;;;;;;;;;;;;;;;;19915:53;19978:12;19993:5;19978:20;;20009:14;20034:78;20049:1;20041:4;:9;20034:78;;20067:8;;;;;:::i;:::-;;;;20098:2;20090:10;;;;;:::i;:::-;;;20034:78;;;20122:19;20154:6;20144:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20122:39;;20172:154;20188:1;20179:5;:10;20172:154;;20216:1;20206:11;;;;;:::i;:::-;;;20283:2;20275:5;:10;;;;:::i;:::-;20262:2;:24;;;;:::i;:::-;20249:39;;20232:6;20239;20232:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;20312:2;20303:11;;;;;:::i;:::-;;;20172:154;;;20350:6;20336:21;;;;;19642:723;;;;:::o;39169:157::-;39254:4;39293:25;39278:40;;;:11;:40;;;;39271:47;;39169:157;;;:::o;63312:589::-;63456:45;63483:4;63489:2;63493:7;63456:26;:45::i;:::-;63534:1;63518:18;;:4;:18;;;63514:187;;;63553:40;63585:7;63553:31;:40::i;:::-;63514:187;;;63623:2;63615:10;;:4;:10;;;63611:90;;63642:47;63675:4;63681:7;63642:32;:47::i;:::-;63611:90;63514:187;63729:1;63715:16;;:2;:16;;;63711:183;;;63748:45;63785:7;63748:36;:45::i;:::-;63711:183;;;63821:4;63815:10;;:2;:10;;;63811:83;;63842:40;63870:2;63874:7;63842:27;:40::i;:::-;63811:83;63711:183;63312:589;;;:::o;60493:125::-;;;;:::o;24242:1049::-;24290:7;24304:16;24346:12;:10;:12::i;:::-;24323:20;:18;:20::i;:::-;:35;;;;:::i;:::-;24304:54;;24363:14;24555:8;24433:10;24451:14;24473:16;24497:14;24519:15;24409:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24393:154;;;;;;24380:172;;:183;;;;:::i;:::-;24363:200;;24570:13;24619:1;24596:11;:19;24608:6;24596:19;;;;;;;;;;;;:24;24592:256;;;24723:6;24715:14;;24592:256;;;24823:11;:19;24835:6;24823:19;;;;;;;;;;;;24815:27;;24592:256;24942:1;24913:11;:25;24936:1;24925:8;:12;;;;:::i;:::-;24913:25;;;;;;;;;;;;:30;24909:283;;;25040:1;25029:8;:12;;;;:::i;:::-;25007:11;:19;25019:6;25007:19;;;;;;;;;;;:34;;;;24909:283;;;25161:11;:25;25184:1;25173:8;:12;;;;:::i;:::-;25161:25;;;;;;;;;;;;25139:11;:19;25151:6;25139:19;;;;;;;;;;;:47;;;;24909:283;25238:17;:15;:17::i;:::-;;25277:9;25269:5;:17;;;;:::i;:::-;25262:24;;;;;24242:1049;:::o;54253:110::-;54329:26;54339:2;54343:7;54329:26;;;;;;;;;;;;:9;:26::i;:::-;54253:110;;:::o;58611:799::-;58766:4;58787:15;:2;:13;;;:15::i;:::-;58783:620;;;58839:2;58823:36;;;58860:12;:10;:12::i;:::-;58874:4;58880:7;58889:5;58823:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;58819:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59082:1;59065:6;:13;:18;59061:272;;;59108:60;;;;;;;;;;:::i;:::-;;;;;;;;59061:272;59283:6;59277:13;59268:6;59264:2;59260:15;59253:38;58819:529;58956:41;;;58946:51;;;:6;:51;;;;58939:58;;;;;58783:620;59387:4;59380:11;;58611:799;;;;;;;:::o;59982:126::-;;;;:::o;64624:164::-;64728:10;:17;;;;64701:15;:24;64717:7;64701:24;;;;;;;;;;;:44;;;;64756:10;64772:7;64756:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64624:164;:::o;65415:988::-;65681:22;65731:1;65706:22;65723:4;65706:16;:22::i;:::-;:26;;;;:::i;:::-;65681:51;;65743:18;65764:17;:26;65782:7;65764:26;;;;;;;;;;;;65743:47;;65911:14;65897:10;:28;65893:328;;65942:19;65964:12;:18;65977:4;65964:18;;;;;;;;;;;;;;;:34;65983:14;65964:34;;;;;;;;;;;;65942:56;;66048:11;66015:12;:18;66028:4;66015:18;;;;;;;;;;;;;;;:30;66034:10;66015:30;;;;;;;;;;;:44;;;;66165:10;66132:17;:30;66150:11;66132:30;;;;;;;;;;;:43;;;;65927:294;65893:328;66317:17;:26;66335:7;66317:26;;;;;;;;;;;66310:33;;;66361:12;:18;66374:4;66361:18;;;;;;;;;;;;;;;:34;66380:14;66361:34;;;;;;;;;;;66354:41;;;65496:907;;65415:988;;:::o;66698:1079::-;66951:22;66996:1;66976:10;:17;;;;:21;;;;:::i;:::-;66951:46;;67008:18;67029:15;:24;67045:7;67029:24;;;;;;;;;;;;67008:45;;67380:19;67402:10;67413:14;67402:26;;;;;;;;:::i;:::-;;;;;;;;;;67380:48;;67466:11;67441:10;67452;67441:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;67577:10;67546:15;:28;67562:11;67546:28;;;;;;;;;;;:41;;;;67718:15;:24;67734:7;67718:24;;;;;;;;;;;67711:31;;;67753:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;66769:1008;;;66698:1079;:::o;64202:221::-;64287:14;64304:20;64321:2;64304:16;:20::i;:::-;64287:37;;64362:7;64335:12;:16;64348:2;64335:16;;;;;;;;;;;;;;;:24;64352:6;64335:24;;;;;;;;;;;:34;;;;64409:6;64380:17;:26;64398:7;64380:26;;;;;;;;;;;:35;;;;64276:147;64202:221;;:::o;22753:105::-;22819:7;22988:1;22964:21;:19;:21::i;:::-;:25;22956:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;22840:11:::1;;:13;;;;;;;;;:::i;:::-;;;;;22833:20;;22753:105:::0;:::o;54590:321::-;54720:18;54726:2;54730:7;54720:5;:18::i;:::-;54771:54;54802:1;54806:2;54810:7;54819:5;54771:22;:54::i;:::-;54749:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;54590:321;;;:::o;29063:326::-;29123:4;29380:1;29358:7;:19;;;:23;29351:30;;29063:326;;;:::o;55247:439::-;55341:1;55327:16;;:2;:16;;;;55319:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;55400:16;55408:7;55400;:16::i;:::-;55399:17;55391:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;55462:45;55491:1;55495:2;55499:7;55462:20;:45::i;:::-;55537:1;55520:9;:13;55530:2;55520:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;55568:2;55549:7;:16;55557:7;55549:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;55613:7;55609:2;55588:33;;55605:1;55588:33;;;;;;;;;;;;55634:44;55662:1;55666:2;55670:7;55634:19;:44::i;:::-;55247:439;;:::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::-;2361:5;2392:6;2386:13;2377:22;;2408:30;2432:5;2408:30;:::i;:::-;2307:137;;;;:::o;2450:::-;2495:5;2533:6;2520:20;2511:29;;2549:32;2575:5;2549:32;:::i;:::-;2450:137;;;;:::o;2593:141::-;2649:5;2680:6;2674:13;2665:22;;2696:32;2722:5;2696:32;:::i;:::-;2593:141;;;;:::o;2753:338::-;2808:5;2857:3;2850:4;2842:6;2838:17;2834:27;2824:122;;2865:79;;:::i;:::-;2824:122;2982:6;2969:20;3007:78;3081:3;3073:6;3066:4;3058:6;3054:17;3007:78;:::i;:::-;2998:87;;2814:277;2753:338;;;;:::o;3111:340::-;3167:5;3216:3;3209:4;3201:6;3197:17;3193:27;3183:122;;3224:79;;:::i;:::-;3183:122;3341:6;3328:20;3366:79;3441:3;3433:6;3426:4;3418:6;3414:17;3366:79;:::i;:::-;3357:88;;3173:278;3111:340;;;;:::o;3457:139::-;3503:5;3541:6;3528:20;3519:29;;3557:33;3584:5;3557:33;:::i;:::-;3457:139;;;;:::o;3602:143::-;3659:5;3690:6;3684:13;3675:22;;3706:33;3733:5;3706:33;:::i;:::-;3602:143;;;;:::o;3751:329::-;3810:6;3859:2;3847:9;3838:7;3834:23;3830:32;3827:119;;;3865:79;;:::i;:::-;3827:119;3985:1;4010:53;4055:7;4046:6;4035:9;4031:22;4010:53;:::i;:::-;4000:63;;3956:117;3751:329;;;;:::o;4086:474::-;4154:6;4162;4211:2;4199:9;4190:7;4186:23;4182:32;4179:119;;;4217:79;;:::i;:::-;4179:119;4337:1;4362:53;4407:7;4398:6;4387:9;4383:22;4362:53;:::i;:::-;4352:63;;4308:117;4464:2;4490:53;4535:7;4526:6;4515:9;4511:22;4490:53;:::i;:::-;4480:63;;4435:118;4086:474;;;;;:::o;4566:619::-;4643:6;4651;4659;4708:2;4696:9;4687:7;4683:23;4679:32;4676:119;;;4714:79;;:::i;:::-;4676:119;4834:1;4859:53;4904:7;4895:6;4884:9;4880:22;4859:53;:::i;:::-;4849:63;;4805:117;4961:2;4987:53;5032:7;5023:6;5012:9;5008:22;4987:53;:::i;:::-;4977:63;;4932:118;5089:2;5115:53;5160:7;5151:6;5140:9;5136:22;5115:53;:::i;:::-;5105:63;;5060:118;4566:619;;;;;:::o;5191:943::-;5286:6;5294;5302;5310;5359:3;5347:9;5338:7;5334:23;5330:33;5327:120;;;5366:79;;:::i;:::-;5327:120;5486:1;5511:53;5556:7;5547:6;5536:9;5532:22;5511:53;:::i;:::-;5501:63;;5457:117;5613:2;5639:53;5684:7;5675:6;5664:9;5660:22;5639:53;:::i;:::-;5629:63;;5584:118;5741:2;5767:53;5812:7;5803:6;5792:9;5788:22;5767:53;:::i;:::-;5757:63;;5712:118;5897:2;5886:9;5882:18;5869:32;5928:18;5920:6;5917:30;5914:117;;;5950:79;;:::i;:::-;5914:117;6055:62;6109:7;6100:6;6089:9;6085:22;6055:62;:::i;:::-;6045:72;;5840:287;5191:943;;;;;;;:::o;6140:468::-;6205:6;6213;6262:2;6250:9;6241:7;6237:23;6233:32;6230:119;;;6268:79;;:::i;:::-;6230:119;6388:1;6413:53;6458:7;6449:6;6438:9;6434:22;6413:53;:::i;:::-;6403:63;;6359:117;6515:2;6541:50;6583:7;6574:6;6563:9;6559:22;6541:50;:::i;:::-;6531:60;;6486:115;6140:468;;;;;:::o;6614:474::-;6682:6;6690;6739:2;6727:9;6718:7;6714:23;6710:32;6707:119;;;6745:79;;:::i;:::-;6707:119;6865:1;6890:53;6935:7;6926:6;6915:9;6911:22;6890:53;:::i;:::-;6880:63;;6836:117;6992:2;7018:53;7063:7;7054:6;7043:9;7039:22;7018:53;:::i;:::-;7008:63;;6963:118;6614:474;;;;;:::o;7094:559::-;7180:6;7188;7237:2;7225:9;7216:7;7212:23;7208:32;7205:119;;;7243:79;;:::i;:::-;7205:119;7391:1;7380:9;7376:17;7363:31;7421:18;7413:6;7410:30;7407:117;;;7443:79;;:::i;:::-;7407:117;7556:80;7628:7;7619:6;7608:9;7604:22;7556:80;:::i;:::-;7538:98;;;;7334:312;7094:559;;;;;:::o;7659:934::-;7781:6;7789;7797;7805;7854:2;7842:9;7833:7;7829:23;7825:32;7822:119;;;7860:79;;:::i;:::-;7822:119;8008:1;7997:9;7993:17;7980:31;8038:18;8030:6;8027:30;8024:117;;;8060:79;;:::i;:::-;8024:117;8173:80;8245:7;8236:6;8225:9;8221:22;8173:80;:::i;:::-;8155:98;;;;7951:312;8330:2;8319:9;8315:18;8302:32;8361:18;8353:6;8350:30;8347:117;;;8383:79;;:::i;:::-;8347:117;8496:80;8568:7;8559:6;8548:9;8544:22;8496:80;:::i;:::-;8478:98;;;;8273:313;7659:934;;;;;;;:::o;8599:323::-;8655:6;8704:2;8692:9;8683:7;8679:23;8675:32;8672:119;;;8710:79;;:::i;:::-;8672:119;8830:1;8855:50;8897:7;8888:6;8877:9;8873:22;8855:50;:::i;:::-;8845:60;;8801:114;8599:323;;;;:::o;8928:345::-;8995:6;9044:2;9032:9;9023:7;9019:23;9015:32;9012:119;;;9050:79;;:::i;:::-;9012:119;9170:1;9195:61;9248:7;9239:6;9228:9;9224:22;9195:61;:::i;:::-;9185:71;;9141:125;8928:345;;;;:::o;9279:327::-;9337:6;9386:2;9374:9;9365:7;9361:23;9357:32;9354:119;;;9392:79;;:::i;:::-;9354:119;9512:1;9537:52;9581:7;9572:6;9561:9;9557:22;9537:52;:::i;:::-;9527:62;;9483:116;9279:327;;;;:::o;9612:349::-;9681:6;9730:2;9718:9;9709:7;9705:23;9701:32;9698:119;;;9736:79;;:::i;:::-;9698:119;9856:1;9881:63;9936:7;9927:6;9916:9;9912:22;9881:63;:::i;:::-;9871:73;;9827:127;9612:349;;;;:::o;9967:509::-;10036:6;10085:2;10073:9;10064:7;10060:23;10056:32;10053:119;;;10091:79;;:::i;:::-;10053:119;10239:1;10228:9;10224:17;10211:31;10269:18;10261:6;10258:30;10255:117;;;10291:79;;:::i;:::-;10255:117;10396:63;10451:7;10442:6;10431:9;10427:22;10396:63;:::i;:::-;10386:73;;10182:287;9967:509;;;;:::o;10482:329::-;10541:6;10590:2;10578:9;10569:7;10565:23;10561:32;10558:119;;;10596:79;;:::i;:::-;10558:119;10716:1;10741:53;10786:7;10777:6;10766:9;10762:22;10741:53;:::i;:::-;10731:63;;10687:117;10482:329;;;;:::o;10817:351::-;10887:6;10936:2;10924:9;10915:7;10911:23;10907:32;10904:119;;;10942:79;;:::i;:::-;10904:119;11062:1;11087:64;11143:7;11134:6;11123:9;11119:22;11087:64;:::i;:::-;11077:74;;11033:128;10817:351;;;;:::o;11174:179::-;11243:10;11264:46;11306:3;11298:6;11264:46;:::i;:::-;11342:4;11337:3;11333:14;11319:28;;11174:179;;;;:::o;11359:189::-;11480:61;11508:32;11534:5;11508:32;:::i;:::-;11480:61;:::i;:::-;11475:3;11468:74;11359:189;;:::o;11554:118::-;11641:24;11659:5;11641:24;:::i;:::-;11636:3;11629:37;11554:118;;:::o;11678:157::-;11783:45;11803:24;11821:5;11803:24;:::i;:::-;11783:45;:::i;:::-;11778:3;11771:58;11678:157;;:::o;11871:732::-;11990:3;12019:54;12067:5;12019:54;:::i;:::-;12089:86;12168:6;12163:3;12089:86;:::i;:::-;12082:93;;12199:56;12249:5;12199:56;:::i;:::-;12278:7;12309:1;12294:284;12319:6;12316:1;12313:13;12294:284;;;12395:6;12389:13;12422:63;12481:3;12466:13;12422:63;:::i;:::-;12415:70;;12508:60;12561:6;12508:60;:::i;:::-;12498:70;;12354:224;12341:1;12338;12334:9;12329:14;;12294:284;;;12298:14;12594:3;12587:10;;11995:608;;;11871:732;;;;:::o;12609:109::-;12690:21;12705:5;12690:21;:::i;:::-;12685:3;12678:34;12609:109;;:::o;12724:360::-;12810:3;12838:38;12870:5;12838:38;:::i;:::-;12892:70;12955:6;12950:3;12892:70;:::i;:::-;12885:77;;12971:52;13016:6;13011:3;13004:4;12997:5;12993:16;12971:52;:::i;:::-;13048:29;13070:6;13048:29;:::i;:::-;13043:3;13039:39;13032:46;;12814:270;12724:360;;;;:::o;13090:159::-;13191:51;13236:5;13191:51;:::i;:::-;13186:3;13179:64;13090:159;;:::o;13255:364::-;13343:3;13371:39;13404:5;13371:39;:::i;:::-;13426:71;13490:6;13485:3;13426:71;:::i;:::-;13419:78;;13506:52;13551:6;13546:3;13539:4;13532:5;13528:16;13506:52;:::i;:::-;13583:29;13605:6;13583:29;:::i;:::-;13578:3;13574:39;13567:46;;13347:272;13255:364;;;;:::o;13625:377::-;13731:3;13759:39;13792:5;13759:39;:::i;:::-;13814:89;13896:6;13891:3;13814:89;:::i;:::-;13807:96;;13912:52;13957:6;13952:3;13945:4;13938:5;13934:16;13912:52;:::i;:::-;13989:6;13984:3;13980:16;13973:23;;13735:267;13625:377;;;;:::o;14032:845::-;14135:3;14172:5;14166:12;14201:36;14227:9;14201:36;:::i;:::-;14253:89;14335:6;14330:3;14253:89;:::i;:::-;14246:96;;14373:1;14362:9;14358:17;14389:1;14384:137;;;;14535:1;14530:341;;;;14351:520;;14384:137;14468:4;14464:9;14453;14449:25;14444:3;14437:38;14504:6;14499:3;14495:16;14488:23;;14384:137;;14530:341;14597:38;14629:5;14597:38;:::i;:::-;14657:1;14671:154;14685:6;14682:1;14679:13;14671:154;;;14759:7;14753:14;14749:1;14744:3;14740:11;14733:35;14809:1;14800:7;14796:15;14785:26;;14707:4;14704:1;14700:12;14695:17;;14671:154;;;14854:6;14849:3;14845:16;14838:23;;14537:334;;14351:520;;14139:738;;14032:845;;;;:::o;14883:366::-;15025:3;15046:67;15110:2;15105:3;15046:67;:::i;:::-;15039:74;;15122:93;15211:3;15122:93;:::i;:::-;15240:2;15235:3;15231:12;15224:19;;14883:366;;;:::o;15255:::-;15397:3;15418:67;15482:2;15477:3;15418:67;:::i;:::-;15411:74;;15494:93;15583:3;15494:93;:::i;:::-;15612:2;15607:3;15603:12;15596:19;;15255:366;;;:::o;15627:::-;15769:3;15790:67;15854:2;15849:3;15790:67;:::i;:::-;15783:74;;15866:93;15955:3;15866:93;:::i;:::-;15984:2;15979:3;15975:12;15968:19;;15627:366;;;:::o;15999:::-;16141:3;16162:67;16226:2;16221:3;16162:67;:::i;:::-;16155:74;;16238:93;16327:3;16238:93;:::i;:::-;16356:2;16351:3;16347:12;16340:19;;15999:366;;;:::o;16371:::-;16513:3;16534:67;16598:2;16593:3;16534:67;:::i;:::-;16527:74;;16610:93;16699:3;16610:93;:::i;:::-;16728:2;16723:3;16719:12;16712:19;;16371:366;;;:::o;16743:::-;16885:3;16906:67;16970:2;16965:3;16906:67;:::i;:::-;16899:74;;16982:93;17071:3;16982:93;:::i;:::-;17100:2;17095:3;17091:12;17084:19;;16743:366;;;:::o;17115:::-;17257:3;17278:67;17342:2;17337:3;17278:67;:::i;:::-;17271:74;;17354:93;17443:3;17354:93;:::i;:::-;17472:2;17467:3;17463:12;17456:19;;17115:366;;;:::o;17487:::-;17629:3;17650:67;17714:2;17709:3;17650:67;:::i;:::-;17643:74;;17726:93;17815:3;17726:93;:::i;:::-;17844:2;17839:3;17835:12;17828:19;;17487:366;;;:::o;17859:::-;18001:3;18022:67;18086:2;18081:3;18022:67;:::i;:::-;18015:74;;18098:93;18187:3;18098:93;:::i;:::-;18216:2;18211:3;18207:12;18200:19;;17859:366;;;:::o;18231:::-;18373:3;18394:67;18458:2;18453:3;18394:67;:::i;:::-;18387:74;;18470:93;18559:3;18470:93;:::i;:::-;18588:2;18583:3;18579:12;18572:19;;18231:366;;;:::o;18603:::-;18745:3;18766:67;18830:2;18825:3;18766:67;:::i;:::-;18759:74;;18842:93;18931:3;18842:93;:::i;:::-;18960:2;18955:3;18951:12;18944:19;;18603:366;;;:::o;18975:::-;19117:3;19138:67;19202:2;19197:3;19138:67;:::i;:::-;19131:74;;19214:93;19303:3;19214:93;:::i;:::-;19332:2;19327:3;19323:12;19316:19;;18975:366;;;:::o;19347:::-;19489:3;19510:67;19574:2;19569:3;19510:67;:::i;:::-;19503:74;;19586:93;19675:3;19586:93;:::i;:::-;19704:2;19699:3;19695:12;19688:19;;19347:366;;;:::o;19719:::-;19861:3;19882:67;19946:2;19941:3;19882:67;:::i;:::-;19875:74;;19958:93;20047:3;19958:93;:::i;:::-;20076:2;20071:3;20067:12;20060:19;;19719:366;;;:::o;20091:::-;20233:3;20254:67;20318:2;20313:3;20254:67;:::i;:::-;20247:74;;20330:93;20419:3;20330:93;:::i;:::-;20448:2;20443:3;20439:12;20432:19;;20091:366;;;:::o;20463:::-;20605:3;20626:67;20690:2;20685:3;20626:67;:::i;:::-;20619:74;;20702:93;20791:3;20702:93;:::i;:::-;20820:2;20815:3;20811:12;20804:19;;20463:366;;;:::o;20835:::-;20977:3;20998:67;21062:2;21057:3;20998:67;:::i;:::-;20991:74;;21074:93;21163:3;21074:93;:::i;:::-;21192:2;21187:3;21183:12;21176:19;;20835:366;;;:::o;21207:::-;21349:3;21370:67;21434:2;21429:3;21370:67;:::i;:::-;21363:74;;21446:93;21535:3;21446:93;:::i;:::-;21564:2;21559:3;21555:12;21548:19;;21207:366;;;:::o;21579:::-;21721:3;21742:67;21806:2;21801:3;21742:67;:::i;:::-;21735:74;;21818:93;21907:3;21818:93;:::i;:::-;21936:2;21931:3;21927:12;21920:19;;21579:366;;;:::o;21951:::-;22093:3;22114:67;22178:2;22173:3;22114:67;:::i;:::-;22107:74;;22190:93;22279:3;22190:93;:::i;:::-;22308:2;22303:3;22299:12;22292:19;;21951:366;;;:::o;22323:398::-;22482:3;22503:83;22584:1;22579:3;22503:83;:::i;:::-;22496:90;;22595:93;22684:3;22595:93;:::i;:::-;22713:1;22708:3;22704:11;22697:18;;22323:398;;;:::o;22727:366::-;22869:3;22890:67;22954:2;22949:3;22890:67;:::i;:::-;22883:74;;22966:93;23055:3;22966:93;:::i;:::-;23084:2;23079:3;23075:12;23068:19;;22727:366;;;:::o;23099:::-;23241:3;23262:67;23326:2;23321:3;23262:67;:::i;:::-;23255:74;;23338:93;23427:3;23338:93;:::i;:::-;23456:2;23451:3;23447:12;23440:19;;23099:366;;;:::o;23471:::-;23613:3;23634:67;23698:2;23693:3;23634:67;:::i;:::-;23627:74;;23710:93;23799:3;23710:93;:::i;:::-;23828:2;23823:3;23819:12;23812:19;;23471:366;;;:::o;23843:::-;23985:3;24006:67;24070:2;24065:3;24006:67;:::i;:::-;23999:74;;24082:93;24171:3;24082:93;:::i;:::-;24200:2;24195:3;24191:12;24184:19;;23843:366;;;:::o;24215:108::-;24292:24;24310:5;24292:24;:::i;:::-;24287:3;24280:37;24215:108;;:::o;24329:118::-;24416:24;24434:5;24416:24;:::i;:::-;24411:3;24404:37;24329:118;;:::o;24453:157::-;24558:45;24578:24;24596:5;24578:24;:::i;:::-;24558:45;:::i;:::-;24553:3;24546:58;24453:157;;:::o;24616:852::-;24856:3;24871:75;24942:3;24933:6;24871:75;:::i;:::-;24971:2;24966:3;24962:12;24955:19;;24984:91;25071:3;25062:6;24984:91;:::i;:::-;25100:2;25095:3;25091:12;25084:19;;25113:75;25184:3;25175:6;25113:75;:::i;:::-;25213:2;25208:3;25204:12;25197:19;;25226:75;25297:3;25288:6;25226:75;:::i;:::-;25326:2;25321:3;25317:12;25310:19;;25339:75;25410:3;25401:6;25339:75;:::i;:::-;25439:2;25434:3;25430:12;25423:19;;25459:3;25452:10;;24616:852;;;;;;;;:::o;25474:589::-;25699:3;25721:95;25812:3;25803:6;25721:95;:::i;:::-;25714:102;;25833:95;25924:3;25915:6;25833:95;:::i;:::-;25826:102;;25945:92;26033:3;26024:6;25945:92;:::i;:::-;25938:99;;26054:3;26047:10;;25474:589;;;;;;:::o;26069:379::-;26253:3;26275:147;26418:3;26275:147;:::i;:::-;26268:154;;26439:3;26432:10;;26069:379;;;:::o;26454:222::-;26547:4;26585:2;26574:9;26570:18;26562:26;;26598:71;26666:1;26655:9;26651:17;26642:6;26598:71;:::i;:::-;26454:222;;;;:::o;26682:442::-;26831:4;26869:2;26858:9;26854:18;26846:26;;26882:71;26950:1;26939:9;26935:17;26926:6;26882:71;:::i;:::-;26963:72;27031:2;27020:9;27016:18;27007:6;26963:72;:::i;:::-;27045;27113:2;27102:9;27098:18;27089:6;27045:72;:::i;:::-;26682:442;;;;;;:::o;27130:640::-;27325:4;27363:3;27352:9;27348:19;27340:27;;27377:71;27445:1;27434:9;27430:17;27421:6;27377:71;:::i;:::-;27458:72;27526:2;27515:9;27511:18;27502:6;27458:72;:::i;:::-;27540;27608:2;27597:9;27593:18;27584:6;27540:72;:::i;:::-;27659:9;27653:4;27649:20;27644:2;27633:9;27629:18;27622:48;27687:76;27758:4;27749:6;27687:76;:::i;:::-;27679:84;;27130:640;;;;;;;:::o;27776:332::-;27897:4;27935:2;27924:9;27920:18;27912:26;;27948:71;28016:1;28005:9;28001:17;27992:6;27948:71;:::i;:::-;28029:72;28097:2;28086:9;28082:18;28073:6;28029:72;:::i;:::-;27776:332;;;;;:::o;28114:373::-;28257:4;28295:2;28284:9;28280:18;28272:26;;28344:9;28338:4;28334:20;28330:1;28319:9;28315:17;28308:47;28372:108;28475:4;28466:6;28372:108;:::i;:::-;28364:116;;28114:373;;;;:::o;28493:210::-;28580:4;28618:2;28607:9;28603:18;28595:26;;28631:65;28693:1;28682:9;28678:17;28669:6;28631:65;:::i;:::-;28493:210;;;;:::o;28709:250::-;28816:4;28854:2;28843:9;28839:18;28831:26;;28867:85;28949:1;28938:9;28934:17;28925:6;28867:85;:::i;:::-;28709:250;;;;:::o;28965:313::-;29078:4;29116:2;29105:9;29101:18;29093:26;;29165:9;29159:4;29155:20;29151:1;29140:9;29136:17;29129:47;29193:78;29266:4;29257:6;29193:78;:::i;:::-;29185:86;;28965:313;;;;:::o;29284:419::-;29450:4;29488:2;29477:9;29473:18;29465:26;;29537:9;29531:4;29527:20;29523:1;29512:9;29508:17;29501:47;29565:131;29691:4;29565:131;:::i;:::-;29557:139;;29284:419;;;:::o;29709:::-;29875:4;29913:2;29902:9;29898:18;29890:26;;29962:9;29956:4;29952:20;29948:1;29937:9;29933:17;29926:47;29990:131;30116:4;29990:131;:::i;:::-;29982:139;;29709:419;;;:::o;30134:::-;30300:4;30338:2;30327:9;30323:18;30315:26;;30387:9;30381:4;30377:20;30373:1;30362:9;30358:17;30351:47;30415:131;30541:4;30415:131;:::i;:::-;30407:139;;30134:419;;;:::o;30559:::-;30725:4;30763:2;30752:9;30748:18;30740:26;;30812:9;30806:4;30802:20;30798:1;30787:9;30783:17;30776:47;30840:131;30966:4;30840:131;:::i;:::-;30832:139;;30559:419;;;:::o;30984:::-;31150:4;31188:2;31177:9;31173:18;31165:26;;31237:9;31231:4;31227:20;31223:1;31212:9;31208:17;31201:47;31265:131;31391:4;31265:131;:::i;:::-;31257:139;;30984:419;;;:::o;31409:::-;31575:4;31613:2;31602:9;31598:18;31590:26;;31662:9;31656:4;31652:20;31648:1;31637:9;31633:17;31626:47;31690:131;31816:4;31690:131;:::i;:::-;31682:139;;31409:419;;;:::o;31834:::-;32000:4;32038:2;32027:9;32023:18;32015:26;;32087:9;32081:4;32077:20;32073:1;32062:9;32058:17;32051:47;32115:131;32241:4;32115:131;:::i;:::-;32107:139;;31834:419;;;:::o;32259:::-;32425:4;32463:2;32452:9;32448:18;32440:26;;32512:9;32506:4;32502:20;32498:1;32487:9;32483:17;32476:47;32540:131;32666:4;32540:131;:::i;:::-;32532:139;;32259:419;;;:::o;32684:::-;32850:4;32888:2;32877:9;32873:18;32865:26;;32937:9;32931:4;32927:20;32923:1;32912:9;32908:17;32901:47;32965:131;33091:4;32965:131;:::i;:::-;32957:139;;32684:419;;;:::o;33109:::-;33275:4;33313:2;33302:9;33298:18;33290:26;;33362:9;33356:4;33352:20;33348:1;33337:9;33333:17;33326:47;33390:131;33516:4;33390:131;:::i;:::-;33382:139;;33109:419;;;:::o;33534:::-;33700:4;33738:2;33727:9;33723:18;33715:26;;33787:9;33781:4;33777:20;33773:1;33762:9;33758:17;33751:47;33815:131;33941:4;33815:131;:::i;:::-;33807:139;;33534:419;;;:::o;33959:::-;34125:4;34163:2;34152:9;34148:18;34140:26;;34212:9;34206:4;34202:20;34198:1;34187:9;34183:17;34176:47;34240:131;34366:4;34240:131;:::i;:::-;34232:139;;33959:419;;;:::o;34384:::-;34550:4;34588:2;34577:9;34573:18;34565:26;;34637:9;34631:4;34627:20;34623:1;34612:9;34608:17;34601:47;34665:131;34791:4;34665:131;:::i;:::-;34657:139;;34384:419;;;:::o;34809:::-;34975:4;35013:2;35002:9;34998:18;34990:26;;35062:9;35056:4;35052:20;35048:1;35037:9;35033:17;35026:47;35090:131;35216:4;35090:131;:::i;:::-;35082:139;;34809:419;;;:::o;35234:::-;35400:4;35438:2;35427:9;35423:18;35415:26;;35487:9;35481:4;35477:20;35473:1;35462:9;35458:17;35451:47;35515:131;35641:4;35515:131;:::i;:::-;35507:139;;35234:419;;;:::o;35659:::-;35825:4;35863:2;35852:9;35848:18;35840:26;;35912:9;35906:4;35902:20;35898:1;35887:9;35883:17;35876:47;35940:131;36066:4;35940:131;:::i;:::-;35932:139;;35659:419;;;:::o;36084:::-;36250:4;36288:2;36277:9;36273:18;36265:26;;36337:9;36331:4;36327:20;36323:1;36312:9;36308:17;36301:47;36365:131;36491:4;36365:131;:::i;:::-;36357:139;;36084:419;;;:::o;36509:::-;36675:4;36713:2;36702:9;36698:18;36690:26;;36762:9;36756:4;36752:20;36748:1;36737:9;36733:17;36726:47;36790:131;36916:4;36790:131;:::i;:::-;36782:139;;36509:419;;;:::o;36934:::-;37100:4;37138:2;37127:9;37123:18;37115:26;;37187:9;37181:4;37177:20;37173:1;37162:9;37158:17;37151:47;37215:131;37341:4;37215:131;:::i;:::-;37207:139;;36934:419;;;:::o;37359:::-;37525:4;37563:2;37552:9;37548:18;37540:26;;37612:9;37606:4;37602:20;37598:1;37587:9;37583:17;37576:47;37640:131;37766:4;37640:131;:::i;:::-;37632:139;;37359:419;;;:::o;37784:::-;37950:4;37988:2;37977:9;37973:18;37965:26;;38037:9;38031:4;38027:20;38023:1;38012:9;38008:17;38001:47;38065:131;38191:4;38065:131;:::i;:::-;38057:139;;37784:419;;;:::o;38209:::-;38375:4;38413:2;38402:9;38398:18;38390:26;;38462:9;38456:4;38452:20;38448:1;38437:9;38433:17;38426:47;38490:131;38616:4;38490:131;:::i;:::-;38482:139;;38209:419;;;:::o;38634:::-;38800:4;38838:2;38827:9;38823:18;38815:26;;38887:9;38881:4;38877:20;38873:1;38862:9;38858:17;38851:47;38915:131;39041:4;38915:131;:::i;:::-;38907:139;;38634:419;;;:::o;39059:::-;39225:4;39263:2;39252:9;39248:18;39240:26;;39312:9;39306:4;39302:20;39298:1;39287:9;39283:17;39276:47;39340:131;39466:4;39340:131;:::i;:::-;39332:139;;39059:419;;;:::o;39484:222::-;39577:4;39615:2;39604:9;39600:18;39592:26;;39628:71;39696:1;39685:9;39681:17;39672:6;39628:71;:::i;:::-;39484:222;;;;:::o;39712:129::-;39746:6;39773:20;;:::i;:::-;39763:30;;39802:33;39830:4;39822:6;39802:33;:::i;:::-;39712:129;;;:::o;39847:75::-;39880:6;39913:2;39907:9;39897:19;;39847:75;:::o;39928:307::-;39989:4;40079:18;40071:6;40068:30;40065:56;;;40101:18;;:::i;:::-;40065:56;40139:29;40161:6;40139:29;:::i;:::-;40131:37;;40223:4;40217;40213:15;40205:23;;39928:307;;;:::o;40241:308::-;40303:4;40393:18;40385:6;40382:30;40379:56;;;40415:18;;:::i;:::-;40379:56;40453:29;40475:6;40453:29;:::i;:::-;40445:37;;40537:4;40531;40527:15;40519:23;;40241:308;;;:::o;40555:132::-;40622:4;40645:3;40637:11;;40675:4;40670:3;40666:14;40658:22;;40555:132;;;:::o;40693:141::-;40742:4;40765:3;40757:11;;40788:3;40785:1;40778:14;40822:4;40819:1;40809:18;40801:26;;40693:141;;;:::o;40840:114::-;40907:6;40941:5;40935:12;40925:22;;40840:114;;;:::o;40960:98::-;41011:6;41045:5;41039:12;41029:22;;40960:98;;;:::o;41064:99::-;41116:6;41150:5;41144:12;41134:22;;41064:99;;;:::o;41169:113::-;41239:4;41271;41266:3;41262:14;41254:22;;41169:113;;;:::o;41288:184::-;41387:11;41421:6;41416:3;41409:19;41461:4;41456:3;41452:14;41437:29;;41288:184;;;;:::o;41478:168::-;41561:11;41595:6;41590:3;41583:19;41635:4;41630:3;41626:14;41611:29;;41478:168;;;;:::o;41652:147::-;41753:11;41790:3;41775:18;;41652:147;;;;:::o;41805:169::-;41889:11;41923:6;41918:3;41911:19;41963:4;41958:3;41954:14;41939:29;;41805:169;;;;:::o;41980:148::-;42082:11;42119:3;42104:18;;41980:148;;;;:::o;42134:305::-;42174:3;42193:20;42211:1;42193:20;:::i;:::-;42188:25;;42227:20;42245:1;42227:20;:::i;:::-;42222:25;;42381:1;42313:66;42309:74;42306:1;42303:81;42300:107;;;42387:18;;:::i;:::-;42300:107;42431:1;42428;42424:9;42417:16;;42134:305;;;;:::o;42445:185::-;42485:1;42502:20;42520:1;42502:20;:::i;:::-;42497:25;;42536:20;42554:1;42536:20;:::i;:::-;42531:25;;42575:1;42565:35;;42580:18;;:::i;:::-;42565:35;42622:1;42619;42615:9;42610:14;;42445:185;;;;:::o;42636:348::-;42676:7;42699:20;42717:1;42699:20;:::i;:::-;42694:25;;42733:20;42751:1;42733:20;:::i;:::-;42728:25;;42921:1;42853:66;42849:74;42846:1;42843:81;42838:1;42831:9;42824:17;42820:105;42817:131;;;42928:18;;:::i;:::-;42817:131;42976:1;42973;42969:9;42958:20;;42636:348;;;;:::o;42990:191::-;43030:4;43050:20;43068:1;43050:20;:::i;:::-;43045:25;;43084:20;43102:1;43084:20;:::i;:::-;43079:25;;43123:1;43120;43117:8;43114:34;;;43128:18;;:::i;:::-;43114:34;43173:1;43170;43166:9;43158:17;;42990:191;;;;:::o;43187:96::-;43224:7;43253:24;43271:5;43253:24;:::i;:::-;43242:35;;43187:96;;;:::o;43289:104::-;43334:7;43363:24;43381:5;43363:24;:::i;:::-;43352:35;;43289:104;;;:::o;43399:90::-;43433:7;43476:5;43469:13;43462:21;43451:32;;43399:90;;;:::o;43495:149::-;43531:7;43571:66;43564:5;43560:78;43549:89;;43495:149;;;:::o;43650:126::-;43687:7;43727:42;43720:5;43716:54;43705:65;;43650:126;;;:::o;43782:77::-;43819:7;43848:5;43837:16;;43782:77;;;:::o;43865:140::-;43929:9;43962:37;43993:5;43962:37;:::i;:::-;43949:50;;43865:140;;;:::o;44011:126::-;44061:9;44094:37;44125:5;44094:37;:::i;:::-;44081:50;;44011:126;;;:::o;44143:113::-;44193:9;44226:24;44244:5;44226:24;:::i;:::-;44213:37;;44143:113;;;:::o;44262:154::-;44346:6;44341:3;44336;44323:30;44408:1;44399:6;44394:3;44390:16;44383:27;44262:154;;;:::o;44422:307::-;44490:1;44500:113;44514:6;44511:1;44508:13;44500:113;;;44599:1;44594:3;44590:11;44584:18;44580:1;44575:3;44571:11;44564:39;44536:2;44533:1;44529:10;44524:15;;44500:113;;;44631:6;44628:1;44625:13;44622:101;;;44711:1;44702:6;44697:3;44693:16;44686:27;44622:101;44471:258;44422:307;;;:::o;44735:320::-;44779:6;44816:1;44810:4;44806:12;44796:22;;44863:1;44857:4;44853:12;44884:18;44874:81;;44940:4;44932:6;44928:17;44918:27;;44874:81;45002:2;44994:6;44991:14;44971:18;44968:38;44965:84;;;45021:18;;:::i;:::-;44965:84;44786:269;44735:320;;;:::o;45061:281::-;45144:27;45166:4;45144:27;:::i;:::-;45136:6;45132:40;45274:6;45262:10;45259:22;45238:18;45226:10;45223:34;45220:62;45217:88;;;45285:18;;:::i;:::-;45217:88;45325:10;45321:2;45314:22;45104:238;45061:281;;:::o;45348:233::-;45387:3;45410:24;45428:5;45410:24;:::i;:::-;45401:33;;45456:66;45449:5;45446:77;45443:103;;;45526:18;;:::i;:::-;45443:103;45573:1;45566:5;45562:13;45555:20;;45348:233;;;:::o;45587:100::-;45626:7;45655:26;45675:5;45655:26;:::i;:::-;45644:37;;45587:100;;;:::o;45693:108::-;45740:7;45769:26;45789:5;45769:26;:::i;:::-;45758:37;;45693:108;;;:::o;45807:94::-;45846:7;45875:20;45889:5;45875:20;:::i;:::-;45864:31;;45807:94;;;:::o;45907:79::-;45946:7;45975:5;45964:16;;45907:79;;;:::o;45992:176::-;46024:1;46041:20;46059:1;46041:20;:::i;:::-;46036:25;;46075:20;46093:1;46075:20;:::i;:::-;46070:25;;46114:1;46104:35;;46119:18;;:::i;:::-;46104:35;46160:1;46157;46153:9;46148:14;;45992:176;;;;:::o;46174:180::-;46222:77;46219:1;46212:88;46319:4;46316:1;46309:15;46343:4;46340:1;46333:15;46360:180;46408:77;46405:1;46398:88;46505:4;46502:1;46495:15;46529:4;46526:1;46519:15;46546:180;46594:77;46591:1;46584:88;46691:4;46688:1;46681:15;46715:4;46712:1;46705:15;46732:180;46780:77;46777:1;46770:88;46877:4;46874:1;46867:15;46901:4;46898:1;46891:15;46918:180;46966:77;46963:1;46956:88;47063:4;47060:1;47053:15;47087:4;47084:1;47077:15;47104:180;47152:77;47149:1;47142:88;47249:4;47246:1;47239:15;47273:4;47270:1;47263:15;47290:117;47399:1;47396;47389:12;47413:117;47522:1;47519;47512:12;47536:117;47645:1;47642;47635:12;47659:117;47768:1;47765;47758:12;47782:117;47891:1;47888;47881:12;47905:117;48014:1;48011;48004:12;48028:102;48069:6;48120:2;48116:7;48111:2;48104:5;48100:14;48096:28;48086:38;;48028:102;;;:::o;48136:94::-;48169:8;48217:5;48213:2;48209:14;48188:35;;48136:94;;;:::o;48236:230::-;48376:34;48372:1;48364:6;48360:14;48353:58;48445:13;48440:2;48432:6;48428:15;48421:38;48236:230;:::o;48472:237::-;48612:34;48608:1;48600:6;48596:14;48589:58;48681:20;48676:2;48668:6;48664:15;48657:45;48472:237;:::o;48715:225::-;48855:34;48851:1;48843:6;48839:14;48832:58;48924:8;48919:2;48911:6;48907:15;48900:33;48715:225;:::o;48946:224::-;49086:34;49082:1;49074:6;49070:14;49063:58;49155:7;49150:2;49142:6;49138:15;49131:32;48946:224;:::o;49176:178::-;49316:30;49312:1;49304:6;49300:14;49293:54;49176:178;:::o;49360:223::-;49500:34;49496:1;49488:6;49484:14;49477:58;49569:6;49564:2;49556:6;49552:15;49545:31;49360:223;:::o;49589:175::-;49729:27;49725:1;49717:6;49713:14;49706:51;49589:175;:::o;49770:174::-;49910:26;49906:1;49898:6;49894:14;49887:50;49770:174;:::o;49950:231::-;50090:34;50086:1;50078:6;50074:14;50067:58;50159:14;50154:2;50146:6;50142:15;50135:39;49950:231;:::o;50187:243::-;50327:34;50323:1;50315:6;50311:14;50304:58;50396:26;50391:2;50383:6;50379:15;50372:51;50187:243;:::o;50436:167::-;50576:19;50572:1;50564:6;50560:14;50553:43;50436:167;:::o;50609:229::-;50749:34;50745:1;50737:6;50733:14;50726:58;50818:12;50813:2;50805:6;50801:15;50794:37;50609:229;:::o;50844:228::-;50984:34;50980:1;50972:6;50968:14;50961:58;51053:11;51048:2;51040:6;51036:15;51029:36;50844:228;:::o;51078:182::-;51218:34;51214:1;51206:6;51202:14;51195:58;51078:182;:::o;51266:231::-;51406:34;51402:1;51394:6;51390:14;51383:58;51475:14;51470:2;51462:6;51458:15;51451:39;51266:231;:::o;51503:182::-;51643:34;51639:1;51631:6;51627:14;51620:58;51503:182;:::o;51691:172::-;51831:24;51827:1;51819:6;51815:14;51808:48;51691:172;:::o;51869:234::-;52009:34;52005:1;51997:6;51993:14;51986:58;52078:17;52073:2;52065:6;52061:15;52054:42;51869:234;:::o;52109:163::-;52249:15;52245:1;52237:6;52233:14;52226:39;52109:163;:::o;52278:220::-;52418:34;52414:1;52406:6;52402:14;52395:58;52487:3;52482:2;52474:6;52470:15;52463:28;52278:220;:::o;52504:114::-;;:::o;52624:168::-;52764:20;52760:1;52752:6;52748:14;52741:44;52624:168;:::o;52798:236::-;52938:34;52934:1;52926:6;52922:14;52915:58;53007:19;53002:2;52994:6;52990:15;52983:44;52798:236;:::o;53040:231::-;53180:34;53176:1;53168:6;53164:14;53157:58;53249:14;53244:2;53236:6;53232:15;53225:39;53040:231;:::o;53277:177::-;53417:29;53413:1;53405:6;53401:14;53394:53;53277:177;:::o;53460:122::-;53533:24;53551:5;53533:24;:::i;:::-;53526:5;53523:35;53513:63;;53572:1;53569;53562:12;53513:63;53460:122;:::o;53588:116::-;53658:21;53673:5;53658:21;:::i;:::-;53651:5;53648:32;53638:60;;53694:1;53691;53684:12;53638:60;53588:116;:::o;53710:120::-;53782:23;53799:5;53782:23;:::i;:::-;53775:5;53772:34;53762:62;;53820:1;53817;53810:12;53762:62;53710:120;:::o;53836:122::-;53909:24;53927:5;53909:24;:::i;:::-;53902:5;53899:35;53889:63;;53948:1;53945;53938:12;53889:63;53836:122;:::o
Swarm Source
ipfs://a96aa74a098f8cb43232cffc0e5c2f5cbd03c23afc5784df0fe719e52de75629
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.