Merklechain Explorer

Contract Address : 0xbB96b900EF03507b530D158cc5A0B0C8c3a8D178
Overview
Balance
0 Merkle
Tokens
Fetching tokens...
More Info
Token
Big Tycoon (BTYC)
Creator
0xb5de20–ad979f at 0xa748e3–aa1ab9
Contract name:
BigTycoon




Optimization enabled
false
Compiler version
v0.8.18+commit.87f61d96




EVM Version
default




Verified at
2023-06-21T05:29:02.619474Z

Contract source code

// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.0;

library Counters {
    struct Counter {

        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;
        }
    }

}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

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

interface IERC20Mintable is IERC20 {
    function mint(address _to, uint256 amount) external returns (bool);
    function burn(uint256 amount) external ;
    event Mint(address indexed minter, address indexed to, uint256 amount);
    event Burn(address indexed burner, uint256 amount);
}

library Address {
 
    function isContract(address account) internal view returns (bool) {
        bytes32 codehash;
        bytes32 accountHash= 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            codehash := extcodehash(account)
        }
        return (codehash != accountHash && codehash != 0x0);
    }


    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount,"Address: insufficient balance");

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

 
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }


    function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

 
    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");
    }


    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");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue( address target, bytes memory data, uint256 weiValue,string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{value: weiValue}(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

abstract contract Initializable {

    uint8 private _initialized;
    bool private _initializing;

    event Initialized(uint8 version);

    modifier initializer() {
        bool isTopLevelCall = !_initializing;
        require(
            (isTopLevelCall && _initialized < 1) || (!Address.isContract(address(this)) && _initialized == 1),
            "Initializable: contract is already initialized"
        );
        _initialized = 1;
        if (isTopLevelCall) {
            _initializing = true;
        }
        _;
        if (isTopLevelCall) {
            _initializing = false;
            emit Initialized(1);
        }
    }

}

contract Ownable is Context {
    address private _owner;
    event OwnershipTransferred(address previousOwner, address newOwner);


    function owner() external view returns (address) {
    return _owner;
    }

    function setOwner(address newOwner) internal {
        _owner = newOwner;
    }

    modifier onlyOwner() {
        require(_msgSender() == _owner, "Ownable: caller is not the owner");
        _;
    }

    function transferOwnership(address newOwner) external onlyOwner {
        require(newOwner != address(0),"Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        setOwner(newOwner);
    }
}

contract Pausable is Ownable {
    event Pause();
    event Unpause();

    bool public paused = false;

    modifier whenNotPaused() {
    require(!paused, "Pausable: paused");
    _;
    }


    function pause() external onlyOwner {
        paused = true;
        emit Pause();
    }

 
    function unpause() external onlyOwner {
        paused = false;
        emit Unpause();
    }


}

interface IERC20Metadata is IERC20Mintable {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;


    function toString(uint256 value) internal pure returns (string memory) {
        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);
    }



}

library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV // Deprecated in v4.8
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        }
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }


    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

interface IERC20Permit is IERC20Metadata{
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;


    function nonces(address owner) external view returns (uint256);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

abstract contract EIP712 {
   
    bytes32 private  _CACHED_DOMAIN_SEPARATOR;
    uint256 private  _CACHED_CHAIN_ID;
    address private  _CACHED_THIS;
    bytes32 private  _HASHED_NAME;
    bytes32 private  _HASHED_VERSION;
    bytes32 private  _TYPE_HASH;


    function eip712(string memory name, string memory version) internal virtual {
        bytes32 hashedName = keccak256(bytes(name));
        bytes32 hashedVersion = keccak256(bytes(version));
        bytes32 typeHash = keccak256(
            "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
        );
        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = block.chainid;
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
        _CACHED_THIS = address(this);
        _TYPE_HASH = typeHash;
    }


    function _domainSeparatorV4() internal view returns (bytes32) {
        if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
        }
    }

    function _buildDomainSeparator(
        bytes32 typeHash,
        bytes32 nameHash,
        bytes32 versionHash
    ) private view returns (bytes32) {
        return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));
    }

   
    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
    }
}

interface IAntisnipe {
    function assureCanTransfer(
        address sender,
        address from,
        address to,
        uint256 amount
    ) external;
}

contract BigTycoon is  Ownable, Pausable, Initializable, IERC20Permit, EIP712  {
    using Counters for Counters.Counter;

    string public override name;
    string public override symbol;
    uint8 public override decimals;
    IAntisnipe public antisnipe;
    bool public antisnipeDisable;

    mapping(address => uint256) internal _balances;
    mapping(address => mapping(address => uint256)) internal allowed;
    uint256 internal _totalSupply;
    mapping(address => Counters.Counter) private _nonces;

    bytes32 private constant _PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");

    function initialize( string memory tokenName, string memory tokenSymbol, uint8 tokenDecimals, address newOwner) external  initializer {
        require(newOwner != address(0),"ERC20: new owner is the zero address");

        name = tokenName;
        symbol = tokenSymbol;
        decimals = tokenDecimals;
        setOwner(newOwner);
        eip712(tokenName,"1");
     
    }


    function mint(address to, uint256 amount) external override whenNotPaused onlyOwner returns (bool) {
        require(to != address(0), 'ERC20: mint to the zero address');

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

        _totalSupply += amount;
        _balances[to] += amount;
        emit Transfer(address(0), to, amount);
        return true;
    }


    function allowance(address _owner, address spender) external override view returns (uint256) {
        return allowed[_owner][spender];
    }

    function totalSupply() external override view returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) external override view returns (uint256) {
        return _balances[account];
    }
 
    function approve(address spender, uint256 value) external override whenNotPaused returns (bool) {
        _approve(_msgSender(), spender, value);
        return true;
    }

    function _approve(address _owner, address spender,uint256 value) internal  {
        require(_owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");
        allowed[_owner][spender] = value;
        emit Approval(_owner, spender, value);
    }

    function transferFrom(address from, address to, uint256 value) external override whenNotPaused  returns (bool) {
        require(value <= allowed[from][_msgSender()], "ERC20: transfer amount exceeds allowance");
        _transfer(from, to, value);
        allowed[from][_msgSender()] -= value;
        return true;
    }

    function transfer(address to, uint256 value) external override whenNotPaused  returns (bool) {
        _transfer(_msgSender(), to, value);
        return true;
    }

    function _transfer( address from, address to, uint256 value) internal  {
         require(from != address(0), 'ERC20: transfer from the zero address');
        require(to != address(0), 'ERC20: transfer to the zero address');

        _beforeTokenTransfer(from, to, value);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= value, 'ERC20: transfer amount exceeds balance');
        unchecked {
            _balances[from] = fromBalance - value;
        }
        _balances[to] += value;

        emit Transfer(from, to, value);
    }


    function burn(uint256 amount) external override {
        uint256 balance = _balances[_msgSender()];
        require(amount > 0, "ERC20: burn amount not greater than 0");
        require(balance >= amount, "ERC20: burn amount exceeds balance");
         _beforeTokenTransfer(_msgSender(), address(0), amount);
        _totalSupply  -= amount;
        _balances[_msgSender()] -= amount;
        emit Burn(_msgSender(), amount);
        emit Transfer(_msgSender(), address(0), amount);
    }

    function increaseAllowance(address spender, uint256 increment) external whenNotPaused  returns (bool) {
        _increaseAllowance(_msgSender(), spender, increment);
        return true;
    }

    function decreaseAllowance(address spender, uint256 decrement) external whenNotPaused  returns (bool) {
        _decreaseAllowance(_msgSender(), spender, decrement);
        return true;
    }

    function _increaseAllowance( address _owner, address spender, uint256 increment) internal  {
        _approve(_owner, spender, allowed[_owner][spender]+increment);
    }

    function _decreaseAllowance(address _owner, address spender, uint256 decrement) internal  {
         _approve(_owner,spender, allowed[_owner][spender]-decrement);
    }

    function permit(
        address _owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public whenNotPaused virtual override {
        require(block.timestamp <= deadline, "ERC20Permit: expired deadline");

        bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, _owner, spender, value, _useNonce(_owner), deadline));

        bytes32 hash = _hashTypedDataV4(structHash);

        address signer = ECDSA.recover(hash, v, r, s);
        require(signer == _owner, "ERC20Permit: invalid signature");

        _approve(_owner, spender, value);
    }

    function nonces(address _owner) public view virtual override returns (uint256) {
        return _nonces[_owner].current();
    }

    function DOMAIN_SEPARATOR() external view override returns (bytes32) {
        return _domainSeparatorV4();
    }

    function _useNonce(address _owner) internal virtual returns (uint256 current) {
        Counters.Counter storage nonce = _nonces[_owner];
        current = nonce.current();
        nonce.increment();
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal  whenNotPaused {
        if (from == address(0) || to == address(0)) return;
        if (!antisnipeDisable && address(antisnipe) != address(0))
            antisnipe.assureCanTransfer(_msgSender(), from, to, amount);
    }

    function setAntisnipeDisable() external onlyOwner {
        require(!antisnipeDisable);
        antisnipeDisable = true;
    }

    function setAntisnipeAddress(address addr) external onlyOwner {
        antisnipe = IAntisnipe(addr);
    }

} 
      
        

Contract ABI

[{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Burn","inputs":[{"type":"address","name":"burner","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"type":"uint8","name":"version","internalType":"uint8","indexed":false}],"anonymous":false},{"type":"event","name":"Mint","inputs":[{"type":"address","name":"minter","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":false},{"type":"address","name":"newOwner","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"Pause","inputs":[],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Unpause","inputs":[],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"DOMAIN_SEPARATOR","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"_owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IAntisnipe"}],"name":"antisnipe","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"antisnipeDisable","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burn","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"decrement","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"increaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"increment","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initialize","inputs":[{"type":"string","name":"tokenName","internalType":"string"},{"type":"string","name":"tokenSymbol","internalType":"string"},{"type":"uint8","name":"tokenDecimals","internalType":"uint8"},{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"mint","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"nonces","inputs":[{"type":"address","name":"_owner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"pause","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"paused","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"permit","inputs":[{"type":"address","name":"_owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"},{"type":"uint256","name":"deadline","internalType":"uint256"},{"type":"uint8","name":"v","internalType":"uint8"},{"type":"bytes32","name":"r","internalType":"bytes32"},{"type":"bytes32","name":"s","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAntisnipeAddress","inputs":[{"type":"address","name":"addr","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAntisnipeDisable","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unpause","inputs":[]}]
            

Deployed ByteCode

0x608060405234801561001057600080fd5b506004361061018e5760003560e01c806374fb20e1116100de578063a457c2d711610097578063dd62ed3e11610071578063dd62ed3e14610475578063de7ea79d146104a5578063e1e144de146104c1578063f2fde38b146104df5761018e565b8063a457c2d7146103f9578063a9059cbb14610429578063d505accf146104595761018e565b806374fb20e11461035b5780637ecebe00146103655780638456cb5914610395578063882cfb3f1461039f5780638da5cb5b146103bd57806395d89b41146103db5761018e565b8063395093511161014b57806342966c681161012557806342966c68146102d55780635c975abb146102f1578063611bf6291461030f57806370a082311461032b5761018e565b8063395093511461026b5780633f4ba83a1461029b57806340c10f19146102a55761018e565b806306fdde0314610193578063095ea7b3146101b157806318160ddd146101e157806323b872dd146101ff578063313ce5671461022f5780633644e5151461024d575b600080fd5b61019b6104fb565b6040516101a89190612554565b60405180910390f35b6101cb60048036038101906101c6919061261e565b610589565b6040516101d89190612679565b60405180910390f35b6101e96105f6565b6040516101f691906126a3565b60405180910390f35b610219600480360381019061021491906126be565b610600565b6040516102269190612679565b60405180910390f35b6102376107c7565b604051610244919061272d565b60405180910390f35b6102556107da565b6040516102629190612761565b60405180910390f35b6102856004803603810190610280919061261e565b6107e9565b6040516102929190612679565b60405180910390f35b6102a3610856565b005b6102bf60048036038101906102ba919061261e565b610933565b6040516102cc9190612679565b60405180910390f35b6102ef60048036038101906102ea919061277c565b610b73565b005b6102f9610d93565b6040516103069190612679565b60405180910390f35b610329600480360381019061032491906127a9565b610da6565b005b610345600480360381019061034091906127a9565b610e7f565b60405161035291906126a3565b60405180910390f35b610363610ec8565b005b61037f600480360381019061037a91906127a9565b610f94565b60405161038c91906126a3565b60405180910390f35b61039d610fe4565b005b6103a76110c2565b6040516103b49190612835565b60405180910390f35b6103c56110e8565b6040516103d2919061285f565b60405180910390f35b6103e3611111565b6040516103f09190612554565b60405180910390f35b610413600480360381019061040e919061261e565b61119f565b6040516104209190612679565b60405180910390f35b610443600480360381019061043e919061261e565b61120c565b6040516104509190612679565b60405180910390f35b610473600480360381019061046e91906128d2565b611279565b005b61048f600480360381019061048a9190612974565b61140b565b60405161049c91906126a3565b60405180910390f35b6104bf60048036038101906104ba9190612ae9565b611492565b005b6104c96116c3565b6040516104d69190612679565b60405180910390f35b6104f960048036038101906104f491906127a9565b6116d6565b005b6007805461050890612bb7565b80601f016020809104026020016040519081016040528092919081815260200182805461053490612bb7565b80156105815780601f1061055657610100808354040283529160200191610581565b820191906000526020600020905b81548152906001019060200180831161056457829003601f168201915b505050505081565b60008060149054906101000a900460ff16156105da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d190612c34565b60405180910390fd5b6105ec6105e561183f565b8484611847565b6001905092915050565b6000600c54905090565b60008060149054906101000a900460ff1615610651576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064890612c34565b60405180910390fd5b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061069a61183f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115610717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90612cc6565b60405180910390fd5b610722848484611a10565b81600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061076c61183f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546107b59190612d15565b92505081905550600190509392505050565b600960009054906101000a900460ff1681565b60006107e4611c87565b905090565b60008060149054906101000a900460ff161561083a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083190612c34565b60405180910390fd5b61084c61084561183f565b8484611d0d565b6001905092915050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661089561183f565b73ffffffffffffffffffffffffffffffffffffffff16146108eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e290612d95565b60405180910390fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60008060149054906101000a900460ff1615610984576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097b90612c34565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166109c361183f565b73ffffffffffffffffffffffffffffffffffffffff1614610a19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1090612d95565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7f90612e01565b60405180910390fd5b610a9460008484611da4565b81600c6000828254610aa69190612e21565b9250508190555081600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610afc9190612e21565b925050819055508273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610b6191906126a3565b60405180910390a36001905092915050565b6000600a6000610b8161183f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008211610c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf890612ec7565b60405180910390fd5b81811015610c44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3b90612f59565b60405180910390fd5b610c57610c4f61183f565b600084611da4565b81600c6000828254610c699190612d15565b9250508190555081600a6000610c7d61183f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610cc69190612d15565b92505081905550610cd561183f565b73ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca583604051610d1a91906126a3565b60405180910390a2600073ffffffffffffffffffffffffffffffffffffffff16610d4261183f565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610d8791906126a3565b60405180910390a35050565b600060149054906101000a900460ff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610de561183f565b73ffffffffffffffffffffffffffffffffffffffff1614610e3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3290612d95565b60405180910390fd5b80600960016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610f0761183f565b73ffffffffffffffffffffffffffffffffffffffff1614610f5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5490612d95565b60405180910390fd5b600960159054906101000a900460ff1615610f7757600080fd5b6001600960156101000a81548160ff021916908315150217905550565b6000610fdd600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611f71565b9050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661102361183f565b73ffffffffffffffffffffffffffffffffffffffff1614611079576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107090612d95565b60405180910390fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b600960019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6008805461111e90612bb7565b80601f016020809104026020016040519081016040528092919081815260200182805461114a90612bb7565b80156111975780601f1061116c57610100808354040283529160200191611197565b820191906000526020600020905b81548152906001019060200180831161117a57829003601f168201915b505050505081565b60008060149054906101000a900460ff16156111f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e790612c34565b60405180910390fd5b6112026111fb61183f565b8484611f7f565b6001905092915050565b60008060149054906101000a900460ff161561125d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125490612c34565b60405180910390fd5b61126f61126861183f565b8484611a10565b6001905092915050565b600060149054906101000a900460ff16156112c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c090612c34565b60405180910390fd5b8342111561130c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130390612fc5565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861133b8c612016565b8960405160200161135196959493929190612fe5565b604051602081830303815290604052805190602001209050600061137482612074565b905060006113848287878761208e565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146113f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113eb90613092565b60405180910390fd5b6113ff8a8a8a611847565b50505050505050505050565b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60008060169054906101000a900460ff161590508080156114c557506001600060159054906101000a900460ff1660ff16105b806114f457506114d4306120b9565b1580156114f357506001600060159054906101000a900460ff1660ff16145b5b611533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152a90613124565b60405180910390fd5b6001600060156101000a81548160ff021916908360ff1602179055508015611571576001600060166101000a81548160ff0219169083151502179055505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d7906131b6565b60405180910390fd5b84600790816115ef9190613378565b5083600890816115ff9190613378565b5082600960006101000a81548160ff021916908360ff16021790555061162482612104565b611663856040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250612147565b80156116bc5760008060166101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860016040516116b39190613485565b60405180910390a15b5050505050565b600960159054906101000a900460ff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661171561183f565b73ffffffffffffffffffffffffffffffffffffffff161461176b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176290612d95565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036117da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d190613512565b60405180910390fd5b7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff168260405161182b929190613532565b60405180910390a161183c81612104565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036118b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ad906135cd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191c9061365f565b60405180910390fd5b80600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611a0391906126a3565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a76906136f1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae590613783565b60405180910390fd5b611af9838383611da4565b6000600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611b80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7790613815565b60405180910390fd5b818103600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c159190612e21565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611c7991906126a3565b60405180910390a350505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015611ce7575060025446145b15611cf6576001549050611d0a565b611d076006546004546005546121f9565b90505b90565b611d9f838383600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d9a9190612e21565b611847565b505050565b600060149054906101000a900460ff1615611df4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611deb90612c34565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480611e5b5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b611f6c57600960159054906101000a900460ff16158015611ecb5750600073ffffffffffffffffffffffffffffffffffffffff16600960019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15611f6b57600960019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635d37a8dd611f1661183f565b8585856040518563ffffffff1660e01b8152600401611f389493929190613835565b600060405180830381600087803b158015611f5257600080fd5b505af1158015611f66573d6000803e3d6000fd5b505050505b5b505050565b600081600001549050919050565b612011838383600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461200c9190612d15565b611847565b505050565b600080600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905061206381611f71565b915061206e81612233565b50919050565b6000612087612081611c87565b83612249565b9050919050565b600080600061209f8787878761227c565b915091506120ac8161235e565b8192505050949350505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91508082141580156120fb57506000801b8214155b92505050919050565b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260048190555081600581905550466002819055506121a48184846121f9565b60018190555030600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806006819055505050505050565b6000838383463060405160200161221495949392919061387a565b6040516020818303038152906040528051906020012090509392505050565b6001816000016000828254019250508190555050565b6000828260405160200161225e929190613945565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156122b7576000600391509150612355565b6000600187878787604051600081526020016040526040516122dc949392919061397c565b6020604051602081039080840390855afa1580156122fe573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361234c57600060019250925050612355565b80600092509250505b94509492505050565b60006004811115612372576123716139c1565b5b816004811115612385576123846139c1565b5b03156124c1576001600481111561239f5761239e6139c1565b5b8160048111156123b2576123b16139c1565b5b036123f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e990613a3c565b60405180910390fd5b60026004811115612406576124056139c1565b5b816004811115612419576124186139c1565b5b03612459576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245090613aa8565b60405180910390fd5b6003600481111561246d5761246c6139c1565b5b8160048111156124805761247f6139c1565b5b036124c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b790613b3a565b60405180910390fd5b5b50565b600081519050919050565b600082825260208201905092915050565b60005b838110156124fe5780820151818401526020810190506124e3565b60008484015250505050565b6000601f19601f8301169050919050565b6000612526826124c4565b61253081856124cf565b93506125408185602086016124e0565b6125498161250a565b840191505092915050565b6000602082019050818103600083015261256e818461251b565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006125b58261258a565b9050919050565b6125c5816125aa565b81146125d057600080fd5b50565b6000813590506125e2816125bc565b92915050565b6000819050919050565b6125fb816125e8565b811461260657600080fd5b50565b600081359050612618816125f2565b92915050565b6000806040838503121561263557612634612580565b5b6000612643858286016125d3565b925050602061265485828601612609565b9150509250929050565b60008115159050919050565b6126738161265e565b82525050565b600060208201905061268e600083018461266a565b92915050565b61269d816125e8565b82525050565b60006020820190506126b86000830184612694565b92915050565b6000806000606084860312156126d7576126d6612580565b5b60006126e5868287016125d3565b93505060206126f6868287016125d3565b925050604061270786828701612609565b9150509250925092565b600060ff82169050919050565b61272781612711565b82525050565b6000602082019050612742600083018461271e565b92915050565b6000819050919050565b61275b81612748565b82525050565b60006020820190506127766000830184612752565b92915050565b60006020828403121561279257612791612580565b5b60006127a084828501612609565b91505092915050565b6000602082840312156127bf576127be612580565b5b60006127cd848285016125d3565b91505092915050565b6000819050919050565b60006127fb6127f66127f18461258a565b6127d6565b61258a565b9050919050565b600061280d826127e0565b9050919050565b600061281f82612802565b9050919050565b61282f81612814565b82525050565b600060208201905061284a6000830184612826565b92915050565b612859816125aa565b82525050565b60006020820190506128746000830184612850565b92915050565b61288381612711565b811461288e57600080fd5b50565b6000813590506128a08161287a565b92915050565b6128af81612748565b81146128ba57600080fd5b50565b6000813590506128cc816128a6565b92915050565b600080600080600080600060e0888a0312156128f1576128f0612580565b5b60006128ff8a828b016125d3565b97505060206129108a828b016125d3565b96505060406129218a828b01612609565b95505060606129328a828b01612609565b94505060806129438a828b01612891565b93505060a06129548a828b016128bd565b92505060c06129658a828b016128bd565b91505092959891949750929550565b6000806040838503121561298b5761298a612580565b5b6000612999858286016125d3565b92505060206129aa858286016125d3565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6129f68261250a565b810181811067ffffffffffffffff82111715612a1557612a146129be565b5b80604052505050565b6000612a28612576565b9050612a3482826129ed565b919050565b600067ffffffffffffffff821115612a5457612a536129be565b5b612a5d8261250a565b9050602081019050919050565b82818337600083830152505050565b6000612a8c612a8784612a39565b612a1e565b905082815260208101848484011115612aa857612aa76129b9565b5b612ab3848285612a6a565b509392505050565b600082601f830112612ad057612acf6129b4565b5b8135612ae0848260208601612a79565b91505092915050565b60008060008060808587031215612b0357612b02612580565b5b600085013567ffffffffffffffff811115612b2157612b20612585565b5b612b2d87828801612abb565b945050602085013567ffffffffffffffff811115612b4e57612b4d612585565b5b612b5a87828801612abb565b9350506040612b6b87828801612891565b9250506060612b7c878288016125d3565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612bcf57607f821691505b602082108103612be257612be1612b88565b5b50919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000612c1e6010836124cf565b9150612c2982612be8565b602082019050919050565b60006020820190508181036000830152612c4d81612c11565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000612cb06028836124cf565b9150612cbb82612c54565b604082019050919050565b60006020820190508181036000830152612cdf81612ca3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612d20826125e8565b9150612d2b836125e8565b9250828203905081811115612d4357612d42612ce6565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612d7f6020836124cf565b9150612d8a82612d49565b602082019050919050565b60006020820190508181036000830152612dae81612d72565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000612deb601f836124cf565b9150612df682612db5565b602082019050919050565b60006020820190508181036000830152612e1a81612dde565b9050919050565b6000612e2c826125e8565b9150612e37836125e8565b9250828201905080821115612e4f57612e4e612ce6565b5b92915050565b7f45524332303a206275726e20616d6f756e74206e6f742067726561746572207460008201527f68616e2030000000000000000000000000000000000000000000000000000000602082015250565b6000612eb16025836124cf565b9150612ebc82612e55565b604082019050919050565b60006020820190508181036000830152612ee081612ea4565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000612f436022836124cf565b9150612f4e82612ee7565b604082019050919050565b60006020820190508181036000830152612f7281612f36565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b6000612faf601d836124cf565b9150612fba82612f79565b602082019050919050565b60006020820190508181036000830152612fde81612fa2565b9050919050565b600060c082019050612ffa6000830189612752565b6130076020830188612850565b6130146040830187612850565b6130216060830186612694565b61302e6080830185612694565b61303b60a0830184612694565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b600061307c601e836124cf565b915061308782613046565b602082019050919050565b600060208201905081810360008301526130ab8161306f565b9050919050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b600061310e602e836124cf565b9150613119826130b2565b604082019050919050565b6000602082019050818103600083015261313d81613101565b9050919050565b7f45524332303a206e6577206f776e657220697320746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006131a06024836124cf565b91506131ab82613144565b604082019050919050565b600060208201905081810360008301526131cf81613193565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026132387fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826131fb565b61324286836131fb565b95508019841693508086168417925050509392505050565b600061327561327061326b846125e8565b6127d6565b6125e8565b9050919050565b6000819050919050565b61328f8361325a565b6132a361329b8261327c565b848454613208565b825550505050565b600090565b6132b86132ab565b6132c3818484613286565b505050565b5b818110156132e7576132dc6000826132b0565b6001810190506132c9565b5050565b601f82111561332c576132fd816131d6565b613306846131eb565b81016020851015613315578190505b613329613321856131eb565b8301826132c8565b50505b505050565b600082821c905092915050565b600061334f60001984600802613331565b1980831691505092915050565b6000613368838361333e565b9150826002028217905092915050565b613381826124c4565b67ffffffffffffffff81111561339a576133996129be565b5b6133a48254612bb7565b6133af8282856132eb565b600060209050601f8311600181146133e257600084156133d0578287015190505b6133da858261335c565b865550613442565b601f1984166133f0866131d6565b60005b82811015613418578489015182556001820191506020850194506020810190506133f3565b868310156134355784890151613431601f89168261333e565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b600061346f61346a6134658461344a565b6127d6565b612711565b9050919050565b61347f81613454565b82525050565b600060208201905061349a6000830184613476565b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006134fc6026836124cf565b9150613507826134a0565b604082019050919050565b6000602082019050818103600083015261352b816134ef565b9050919050565b60006040820190506135476000830185612850565b6135546020830184612850565b9392505050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006135b76024836124cf565b91506135c28261355b565b604082019050919050565b600060208201905081810360008301526135e6816135aa565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006136496022836124cf565b9150613654826135ed565b604082019050919050565b600060208201905081810360008301526136788161363c565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006136db6025836124cf565b91506136e68261367f565b604082019050919050565b6000602082019050818103600083015261370a816136ce565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061376d6023836124cf565b915061377882613711565b604082019050919050565b6000602082019050818103600083015261379c81613760565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006137ff6026836124cf565b915061380a826137a3565b604082019050919050565b6000602082019050818103600083015261382e816137f2565b9050919050565b600060808201905061384a6000830187612850565b6138576020830186612850565b6138646040830185612850565b6138716060830184612694565b95945050505050565b600060a08201905061388f6000830188612752565b61389c6020830187612752565b6138a96040830186612752565b6138b66060830185612694565b6138c36080830184612850565b9695505050505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b600061390e6002836138cd565b9150613919826138d8565b600282019050919050565b6000819050919050565b61393f61393a82612748565b613924565b82525050565b600061395082613901565b915061395c828561392e565b60208201915061396c828461392e565b6020820191508190509392505050565b60006080820190506139916000830187612752565b61399e602083018661271e565b6139ab6040830185612752565b6139b86060830184612752565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000613a266018836124cf565b9150613a31826139f0565b602082019050919050565b60006020820190508181036000830152613a5581613a19565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000613a92601f836124cf565b9150613a9d82613a5c565b602082019050919050565b60006020820190508181036000830152613ac181613a85565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613b246022836124cf565b9150613b2f82613ac8565b604082019050919050565b60006020820190508181036000830152613b5381613b17565b905091905056fea264697066735822122024ca2637a4d227f876347b915ec298d9cc359d0336031a5fb880dcb8f87e055664736f6c63430008120033