ETH Price: $3,296.65 (-3.38%)
Gas: 22 Gwei

Token

PlzBro (PBR)
 

Overview

Max Total Supply

0 PBR

Holders

248

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
stasik.eth
Balance
2 PBR
0xd0f463d9c86841471e19352e52e6a7edfcc35ecf
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
PlzBro

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-01-25
*/

// File: Base64.sol



pragma solidity >=0.6.0;

/// @title Base64
/// @author Brecht Devos - <[email protected]>
/// @notice Provides functions for encoding/decoding base64
library Base64 {
    string internal constant TABLE_ENCODE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
    bytes  internal constant TABLE_DECODE = hex"0000000000000000000000000000000000000000000000000000000000000000"
                                            hex"00000000000000000000003e0000003f3435363738393a3b3c3d000000000000"
                                            hex"00000102030405060708090a0b0c0d0e0f101112131415161718190000000000"
                                            hex"001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132330000000000";

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return '';

        // load the table into memory
        string memory table = TABLE_ENCODE;

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 3 bytes at a time
            for {} lt(dataPtr, endPtr) {}
            {
                // read 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // write 4 characters
                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr( 6, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(        input,  0x3F))))
                resultPtr := add(resultPtr, 1)
            }

            // padding with '='
            switch mod(mload(data), 3)
            case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) }
            case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) }
        }

        return result;
    }

    function decode(string memory _data) internal pure returns (bytes memory) {
        bytes memory data = bytes(_data);

        if (data.length == 0) return new bytes(0);
        require(data.length % 4 == 0, "invalid base64 decoder input");

        // load the table into memory
        bytes memory table = TABLE_DECODE;

        // every 4 characters represent 3 bytes
        uint256 decodedLen = (data.length / 4) * 3;

        // add some extra buffer at the end required for the writing
        bytes memory result = new bytes(decodedLen + 32);

        assembly {
            // padding with '='
            let lastBytes := mload(add(data, mload(data)))
            if eq(and(lastBytes, 0xFF), 0x3d) {
                decodedLen := sub(decodedLen, 1)
                if eq(and(lastBytes, 0xFFFF), 0x3d3d) {
                    decodedLen := sub(decodedLen, 1)
                }
            }

            // set the actual output length
            mstore(result, decodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 4 characters at a time
            for {} lt(dataPtr, endPtr) {}
            {
               // read 4 characters
               dataPtr := add(dataPtr, 4)
               let input := mload(dataPtr)

               // write 3 bytes
               let output := add(
                   add(
                       shl(18, and(mload(add(tablePtr, and(shr(24, input), 0xFF))), 0xFF)),
                       shl(12, and(mload(add(tablePtr, and(shr(16, input), 0xFF))), 0xFF))),
                   add(
                       shl( 6, and(mload(add(tablePtr, and(shr( 8, input), 0xFF))), 0xFF)),
                               and(mload(add(tablePtr, and(        input , 0xFF))), 0xFF)
                    )
                )
                mstore(resultPtr, shl(232, output))
                resultPtr := add(resultPtr, 3)
            }
        }

        return result;
    }
}
// File: @openzeppelin/contracts/utils/math/Math.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)

pragma solidity ^0.8.0;


/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @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] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

// File: VerifySignature.sol


pragma solidity ^0.8.13;


/* Signature Verification

How to Sign and Verify
# Signing
1. Create message to sign
2. Hash the message
3. Sign the hash (off chain, keep your private key secret)

# Verify
1. Recreate hash from the original message
2. Recover signer from signature and hash
3. Compare recovered signer to claimed signer
*/

contract VerifySignature {
    /* 1. Unlock MetaMask account
    ethereum.enable()
    */

    /* 2. Get message hash to sign
    getMessageHash(
        0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C,
        123,
        "coffee and donuts",
        1
    )

    hash = "0xcf36ac4f97dc10d91fc2cbb20d718e94a8cbfe0f82eaedc6a4aa38946fb797cd"
    */
    function getMessageHash(
        address _to,
        uint _amount,
        string memory _message,
        uint _nonce
    ) public pure returns (bytes32) {
        return keccak256(abi.encodePacked(_to, _amount, _message, _nonce));
    }

    /* 3. Sign message hash
    # using browser
    account = "copy paste account of signer here"
    ethereum.request({ method: "personal_sign", params: [account, hash]}).then(console.log)

    # using web3
    web3.personal.sign(hash, web3.eth.defaultAccount, console.log)

    Signature will be different for different accounts
    0x993dab3dd91f5c6dc28e17439be475478f5635c92a56e17e82349d3fb2f166196f466c0b4e0c146f285204f0dcb13e5ae67bc33f4b888ec32dfe0a063e8f3f781b
    */
    function getEthSignedMessageHash(bytes32 _messageHash)
        public
        pure
        returns (bytes32)
    {
        /*
        Signature is produced by signing a keccak256 hash with the following format:
        "\x19Ethereum Signed Message\n" + len(msg) + msg
        */
        return
            keccak256(
                abi.encodePacked("\x19Ethereum Signed Message:\n32", _messageHash)
            );
    }

    /* 4. Verify signature
    signer = 0xB273216C05A8c0D4F0a4Dd0d7Bae1D2EfFE636dd
    to = 0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C
    amount = 123
    message = "coffee and donuts"
    nonce = 1
    signature =
        0x993dab3dd91f5c6dc28e17439be475478f5635c92a56e17e82349d3fb2f166196f466c0b4e0c146f285204f0dcb13e5ae67bc33f4b888ec32dfe0a063e8f3f781b
    */
    function verify(
        address _signer,
        address _to,
        uint _amount,
        string memory _message,
        uint _nonce,
        bytes memory signature
    ) public pure returns (bool) {
        bytes32 messageHash = getMessageHash(_to, _amount, _message, _nonce);
        bytes32 ethSignedMessageHash = getEthSignedMessageHash(messageHash);

        return recoverSigner(ethSignedMessageHash, signature) == _signer;
    }

    function recoverSigner(bytes32 _ethSignedMessageHash, bytes memory _signature)
        public
        pure
        returns (address)
    {
        (bytes32 r, bytes32 s, uint8 v) = splitSignature(_signature);

        return ecrecover(_ethSignedMessageHash, v, r, s);
    }

    function splitSignature(bytes memory sig)
        public
        pure
        returns (
            bytes32 r,
            bytes32 s,
            uint8 v
        )
    {
        require(sig.length == 65, "invalid signature length");

        assembly {
            /*
            First 32 bytes stores the length of the signature

            add(sig, 32) = pointer of sig + 32
            effectively, skips first 32 bytes of signature

            mload(p) loads next 32 bytes starting at the memory address p into memory
            */

            // first 32 bytes, after the length prefix
            r := mload(add(sig, 32))
            // second 32 bytes
            s := mload(add(sig, 64))
            // final byte (first byte of the next 32 bytes)
            v := byte(0, mload(add(sig, 96)))
        }

        // implicitly return (r, s, v)
    }

    function stringToEthSignedMessageHash(string memory s) public pure returns (bytes32) {
        bytes memory ss = bytes(s);
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(ss.length), ss));
    }
}

// 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/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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.8.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 functionCallWithValue(target, data, 0, "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");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or 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 {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // 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
            /// @solidity memory-safe-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.8.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 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * 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/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.8.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: address zero is not a valid owner");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _ownerOf(tokenId);
        require(owner != address(0), "ERC721: invalid token ID");
        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) {
        _requireMinted(tokenId);

        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 token owner or approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        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: caller is not token owner or 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: caller is not token owner or 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 the owner of the `tokenId`. Does NOT revert if token doesn't exist
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

    /**
     * @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 _ownerOf(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) {
        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, 1);

        // Check that tokenId was not minted by `_beforeTokenTransfer` hook
        require(!_exists(tokenId), "ERC721: token already minted");

        unchecked {
            // Will not overflow unless all 2**256 token ids are minted to the same owner.
            // Given that tokens are minted one by one, it is impossible in practice that
            // this ever happens. Might change if we allow batch minting.
            // The ERC fails to describe this case.
            _balances[to] += 1;
        }

        _owners[tokenId] = to;

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

        _afterTokenTransfer(address(0), to, tokenId, 1);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     * This is an internal function that does not check if the sender is authorized to operate on the token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
        owner = ERC721.ownerOf(tokenId);

        // Clear approvals
        delete _tokenApprovals[tokenId];

        unchecked {
            // Cannot overflow, as that would require more tokens to be burned/transferred
            // out than the owner initially received through minting and transferring in.
            _balances[owner] -= 1;
        }
        delete _owners[tokenId];

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

        _afterTokenTransfer(owner, address(0), tokenId, 1);
    }

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

        // Check that tokenId was not transferred by `_beforeTokenTransfer` hook
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");

        // Clear approvals from the previous owner
        delete _tokenApprovals[tokenId];

        unchecked {
            // `_balances[from]` cannot overflow for the same reason as described in `_burn`:
            // `from`'s balance is the number of token held, which is at least one before the current
            // transfer.
            // `_balances[to]` could overflow in the conditions described in `_mint`. That would require
            // all 2**256 token ids to be minted, which in practice is impossible.
            _balances[from] -= 1;
            _balances[to] += 1;
        }
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId, 1);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {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 an {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 Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @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 {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
     * - When `from` is zero, the tokens will be minted for `to`.
     * - When `to` is zero, ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256, /* firstTokenId */
        uint256 batchSize
    ) internal virtual {
        if (batchSize > 1) {
            if (from != address(0)) {
                _balances[from] -= batchSize;
            }
            if (to != address(0)) {
                _balances[to] += batchSize;
            }
        }
    }

    /**
     * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
     * - When `from` is zero, the tokens were minted for `to`.
     * - When `to` is zero, ``from``'s tokens were burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual {}
}

// File: PlzBro.sol


pragma solidity ^0.8.13;






interface HACKERHAIKU {
    function balanceOf(address owner) external view returns (uint256 balance);
}

contract PlzBro is ERC721, Ownable {
    using Strings for uint256;

    HACKERHAIKU hackerhaiku;

    // token metadata
    string public constant imagePartOne = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200"><style>.h{font-family: Courier New;font-size:20px;fill:#05f228;}</style><rect x="0" y="0" width="200" height="200" fill="black"/><text x="10" y="25" class="h">';
    string public constant imagePartTwo = '</text><text x="10" y="45" class="h">';
    string public constant imagePartThree = '</text><text x="10" y="65" class="h">';
    string public constant imagePartFour = '</text><text x="10" y="85" class="h">';
    string public constant imagePartFive = '</text><text x="10" y="105" class="h">';
    string public constant imagePartSix = '</text><text x="10" y="125" class="h">';
    string public constant imagePartSeven = '</text><text x="10" y="145" class="h">';
    string public constant imagePartEight = '</text><text x="10" y="165" class="h">';
    string public constant imagePartNine = '</text><text x="10" y="185" class="h">';
    string public constant imagePartTen = '</text><rect x="3%" y="3%" width="94%" height="94%" fill="none" stroke="#05f228" stroke-width=".5%"/></svg>';
    string public constant description = 'Poems generated from SMS received during the minting of Hacker Haiku.';
    string public constant tokenName = 'Plz Bro';
    string public license = 'CC BY-NC 4.0';
    string public externalUrl = 'https://hackerhaiku.com/plzbro';

    VerifySignature public verifySignature = new VerifySignature();

    struct Poem {
        string line1;
        string line2;
        string line3;
        string line4;
        string line5;
        string line6;
        string line7;
        string line8;
        string line9;
    }

    uint public Counter;
    address signer;

    mapping(string => uint) public poems;
    mapping(uint => Poem) public tokens;

    constructor(address _signer, address hackerHaikuContract) ERC721("PlzBro", "PBR") {
        signer = _signer;
        hackerhaiku = HACKERHAIKU(hackerHaikuContract);
    }

    function mint(
        Poem memory _poem,
        bytes32 _ethSignedMessageHash, 
        bytes memory _signature,
        bytes32 magic
        ) public payable {
            string memory flatPoem = string(abi.encodePacked(
                _poem.line1,
                _poem.line2,
                _poem.line3,
                _poem.line4,
                _poem.line5,
                _poem.line6,
                _poem.line7,
                _poem.line8,
                _poem.line9                
                ));
            require(poems[flatPoem] == 0, "Poem already claimed.");
            require(Counter < 512, "All out.");
            require(verifySignature.recoverSigner(_ethSignedMessageHash, _signature) == signer, "Invalid signature.");
            require(verifySignature.stringToEthSignedMessageHash(flatPoem) == _ethSignedMessageHash, "Hash and poem don't match.");
            require(magic == keccak256(abi.encodePacked(msg.sender)), "Magic?");
            if (hackerhaiku.balanceOf(msg.sender) > 0) {
                require(msg.value >= 0.0125 ether, "Not enough ETH.");
            } else {
                require(msg.value >= 0.025 ether, "Not enough ETH.");
            }

            Poem memory poem = Poem(
                _poem.line1,
                _poem.line2,
                _poem.line3,
                _poem.line4,
                _poem.line5,
                _poem.line6,
                _poem.line7,
                _poem.line8,
                _poem.line9  
                );

            Counter++;
            poems[flatPoem] = Counter;
            tokens[Counter] = poem;
            payable(owner()).transfer(msg.value);
            _safeMint(msg.sender, Counter);  
    }

    function updateSigner(address _newSigner) external onlyOwner {
        signer = _newSigner;
    }

    function updateExternalUrl(string memory _newExternalUrl) external onlyOwner {
        externalUrl = _newExternalUrl;
    }

    function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
        require(_exists(_tokenId), "Token doesn't exist.");
        
        bytes memory encodedImage = abi.encodePacked('"image": "data:image/svg+xml;base64,', Base64.encode(getSVG(_tokenId)), '",');
        bytes memory encodedHTML = abi.encodePacked('"animation_url": "data:text/html;base64,', Base64.encode(getHTML(_tokenId)), '",');

        string memory json = Base64.encode(
          abi.encodePacked(
            '{"name": "', tokenName, ' #', Strings.toString(_tokenId), '",',
            '"description": "', description, '",',
            encodedImage,
            encodedHTML,
            '"license": "', license, '",'
            '"external_url": "', externalUrl,
            '"}'
          )
        );
        return string(abi.encodePacked('data:application/json;base64,', json));
    }

    function getSVG(uint256 _tokenId) public view returns (bytes memory) {
        require(_exists(_tokenId), "Token doesn't exist.");

        Poem memory poem = tokens[_tokenId];

        bytes memory part1 = abi.encodePacked(
            imagePartOne, 
            poem.line1,
            imagePartTwo,
            poem.line2,
            imagePartThree,
            poem.line3
            );

        bytes memory part2 = abi.encodePacked(
            imagePartFour,
            poem.line4,
            imagePartFive,
            poem.line5,
            imagePartSix,
            poem.line6
            );

        bytes memory part3 = abi.encodePacked(
            imagePartSeven,
            poem.line7,
            imagePartEight,
            poem.line8,
            imagePartNine,
            poem.line9,
            imagePartTen
            );
        
        return abi.encodePacked(
            part1,
            part2,
            part3
            );
    }

    function getHTML(uint256 _tokenId) public view returns (bytes memory) {
        require(_exists(_tokenId), "Token doesn't exist.");

        return abi.encodePacked(
            '<!DOCTYPE html><html><head><style>*{margin:0;padding:0}</style></head><body>',
            string(getSVG(_tokenId)),
            '</body></html>'
        );
    }

    receive() external payable { }

    function withdraw() external onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_signer","type":"address"},{"internalType":"address","name":"hackerHaikuContract","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":"Counter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"description","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"externalUrl","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":"uint256","name":"_tokenId","type":"uint256"}],"name":"getHTML","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getSVG","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"imagePartEight","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"imagePartFive","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"imagePartFour","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"imagePartNine","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"imagePartOne","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"imagePartSeven","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"imagePartSix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"imagePartTen","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"imagePartThree","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"imagePartTwo","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"license","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"line1","type":"string"},{"internalType":"string","name":"line2","type":"string"},{"internalType":"string","name":"line3","type":"string"},{"internalType":"string","name":"line4","type":"string"},{"internalType":"string","name":"line5","type":"string"},{"internalType":"string","name":"line6","type":"string"},{"internalType":"string","name":"line7","type":"string"},{"internalType":"string","name":"line8","type":"string"},{"internalType":"string","name":"line9","type":"string"}],"internalType":"struct PlzBro.Poem","name":"_poem","type":"tuple"},{"internalType":"bytes32","name":"_ethSignedMessageHash","type":"bytes32"},{"internalType":"bytes","name":"_signature","type":"bytes"},{"internalType":"bytes32","name":"magic","type":"bytes32"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"string","name":"","type":"string"}],"name":"poems","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":"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":[],"name":"tokenName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"string","name":"line1","type":"string"},{"internalType":"string","name":"line2","type":"string"},{"internalType":"string","name":"line3","type":"string"},{"internalType":"string","name":"line4","type":"string"},{"internalType":"string","name":"line5","type":"string"},{"internalType":"string","name":"line6","type":"string"},{"internalType":"string","name":"line7","type":"string"},{"internalType":"string","name":"line8","type":"string"},{"internalType":"string","name":"line9","type":"string"}],"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":"string","name":"_newExternalUrl","type":"string"}],"name":"updateExternalUrl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newSigner","type":"address"}],"name":"updateSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"verifySignature","outputs":[{"internalType":"contract VerifySignature","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526040518060400160405280600c81526020017f43432042592d4e4320342e300000000000000000000000000000000000000000815250600890805190602001906200005192919062000357565b506040518060400160405280601e81526020017f68747470733a2f2f6861636b65726861696b752e636f6d2f706c7a62726f0000815250600990805190602001906200009f92919062000357565b50604051620000ae90620003e8565b604051809103906000f080158015620000cb573d6000803e3d6000fd5b50600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200011957600080fd5b50604051620074293803806200742983398181016040528101906200013f91906200047f565b6040518060400160405280600681526020017f506c7a42726f00000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f50425200000000000000000000000000000000000000000000000000000000008152508160009080519060200190620001c392919062000357565b508060019080519060200190620001dc92919062000357565b505050620001ff620001f36200028960201b60201c565b6200029160201b60201c565b81600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506200052a565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200036590620004f5565b90600052602060002090601f016020900481019282620003895760008555620003d5565b82601f10620003a457805160ff1916838001178555620003d5565b82800160010185558215620003d5579182015b82811115620003d4578251825591602001919060010190620003b7565b5b509050620003e49190620003f6565b5090565b610f5c80620064cd83390190565b5b8082111562000411576000816000905550600101620003f7565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000447826200041a565b9050919050565b62000459816200043a565b81146200046557600080fd5b50565b60008151905062000479816200044e565b92915050565b6000806040838503121562000499576200049862000415565b5b6000620004a98582860162000468565b9250506020620004bc8582860162000468565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200050e57607f821691505b602082108103620005245762000523620004c6565b5b50919050565b615f93806200053a6000396000f3fe60806040526004361061023f5760003560e01c806370a082311161012e578063abe34c9b116100ab578063c87b56dd1161006f578063c87b56dd1461087f578063d755a605146108bc578063e985e9c5146108e7578063f2fde38b14610924578063f56ee8b81461094d57610246565b8063abe34c9b14610786578063b88d4fde146107b1578063bcc2fe9c146107da578063be985ac914610805578063bfd187011461084257610246565b80638da5cb5b116100f25780638da5cb5b146106b35780638fc73484146106de57806395d89b4114610709578063a22cb46514610734578063a7ecd37e1461075d57610246565b806370a08231146105e0578063715018a61461061d5780637284e416146106345780637931b3e41461065f5780637cd784dd1461068857610246565b806342842e0e116101bc57806358cd25131161018057806358cd2513146104f75780636352211e1461052257806365902b0a1461055f5780636b87d24c1461058a5780636c02a931146105b557610246565b806342842e0e14610417578063446dc654146104405780634eeca0761461046b5780634f64b2be146104965780634fdfc629146104db57610246565b80631816ee7e116102035780631816ee7e1461035657806323b872dd146103815780632653f517146103aa5780632dab1e36146103d55780633ccfd60b1461040057610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063095ea7b3146102f0578063102581d21461031957610246565b3661024657005b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613bdb565b610978565b60405161027f9190613c23565b60405180910390f35b34801561029457600080fd5b5061029d610a5a565b6040516102aa9190613cd7565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d59190613d2f565b610aec565b6040516102e79190613d9d565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190613de4565b610b32565b005b34801561032557600080fd5b50610340600480360381019061033b9190613d2f565b610c49565b60405161034d9190613e79565b60405180910390f35b34801561036257600080fd5b5061036b610cc2565b6040516103789190613cd7565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a39190613e9b565b610cde565b005b3480156103b657600080fd5b506103bf610d3e565b6040516103cc9190613cd7565b60405180910390f35b3480156103e157600080fd5b506103ea610d5a565b6040516103f79190613cd7565b60405180910390f35b34801561040c57600080fd5b50610415610d77565b005b34801561042357600080fd5b5061043e60048036038101906104399190613e9b565b610dc8565b005b34801561044c57600080fd5b50610455610de8565b6040516104629190613cd7565b60405180910390f35b34801561047757600080fd5b50610480610e04565b60405161048d9190613efd565b60405180910390f35b3480156104a257600080fd5b506104bd60048036038101906104b89190613d2f565b610e0a565b6040516104d299989796959493929190613f18565b60405180910390f35b6104f560048036038101906104f091906143d6565b611320565b005b34801561050357600080fd5b5061050c6119f7565b60405161051991906144d4565b60405180910390f35b34801561052e57600080fd5b5061054960048036038101906105449190613d2f565b611a1d565b6040516105569190613d9d565b60405180910390f35b34801561056b57600080fd5b50610574611aa3565b6040516105819190613cd7565b60405180910390f35b34801561059657600080fd5b5061059f611abf565b6040516105ac9190613cd7565b60405180910390f35b3480156105c157600080fd5b506105ca611b4d565b6040516105d79190613cd7565b60405180910390f35b3480156105ec57600080fd5b50610607600480360381019061060291906144ef565b611b86565b6040516106149190613efd565b60405180910390f35b34801561062957600080fd5b50610632611c3d565b005b34801561064057600080fd5b50610649611c51565b6040516106569190613cd7565b60405180910390f35b34801561066b57600080fd5b506106866004803603810190610681919061451c565b611c6d565b005b34801561069457600080fd5b5061069d611c8f565b6040516106aa9190613cd7565b60405180910390f35b3480156106bf57600080fd5b506106c8611cab565b6040516106d59190613d9d565b60405180910390f35b3480156106ea57600080fd5b506106f3611cd5565b6040516107009190613cd7565b60405180910390f35b34801561071557600080fd5b5061071e611d63565b60405161072b9190613cd7565b60405180910390f35b34801561074057600080fd5b5061075b60048036038101906107569190614591565b611df5565b005b34801561076957600080fd5b50610784600480360381019061077f91906144ef565b611e0b565b005b34801561079257600080fd5b5061079b611e57565b6040516107a89190613cd7565b60405180910390f35b3480156107bd57600080fd5b506107d860048036038101906107d391906145d1565b611e73565b005b3480156107e657600080fd5b506107ef611ed5565b6040516107fc9190613cd7565b60405180910390f35b34801561081157600080fd5b5061082c60048036038101906108279190613d2f565b611ef1565b6040516108399190613e79565b60405180910390f35b34801561084e57600080fd5b506108696004803603810190610864919061451c565b612651565b6040516108769190613efd565b60405180910390f35b34801561088b57600080fd5b506108a660048036038101906108a19190613d2f565b61267f565b6040516108b39190613cd7565b60405180910390f35b3480156108c857600080fd5b506108d16127ea565b6040516108de9190613cd7565b60405180910390f35b3480156108f357600080fd5b5061090e60048036038101906109099190614654565b612806565b60405161091b9190613c23565b60405180910390f35b34801561093057600080fd5b5061094b600480360381019061094691906144ef565b61289a565b005b34801561095957600080fd5b5061096261291d565b60405161096f9190613cd7565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a4357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a535750610a5282612939565b5b9050919050565b606060008054610a69906146c3565b80601f0160208091040260200160405190810160405280929190818152602001828054610a95906146c3565b8015610ae25780601f10610ab757610100808354040283529160200191610ae2565b820191906000526020600020905b815481529060010190602001808311610ac557829003601f168201915b5050505050905090565b6000610af7826129a3565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b3d82611a1d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba490614766565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bcc6129ee565b73ffffffffffffffffffffffffffffffffffffffff161480610bfb5750610bfa81610bf56129ee565b612806565b5b610c3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c31906147f8565b60405180910390fd5b610c4483836129f6565b505050565b6060610c5482612aaf565b610c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8a90614864565b60405180910390fd5b610c9c82611ef1565b604051602001610cac91906149a4565b6040516020818303038152906040529050919050565b604051806060016040528060258152602001615cd56025913981565b610cef610ce96129ee565b82612af0565b610d2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2590614a43565b60405180910390fd5b610d39838383612b85565b505050565b604051806060016040528060258152602001615cb06025913981565b60405180610100016040528060dd8152602001615e8160dd913981565b610d7f612e7e565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610dc5573d6000803e3d6000fd5b50565b610de383838360405180602001604052806000815250611e73565b505050565b604051806060016040528060268152602001615e356026913981565b600b5481565b600e602052806000526040600020600091509050806000018054610e2d906146c3565b80601f0160208091040260200160405190810160405280929190818152602001828054610e59906146c3565b8015610ea65780601f10610e7b57610100808354040283529160200191610ea6565b820191906000526020600020905b815481529060010190602001808311610e8957829003601f168201915b505050505090806001018054610ebb906146c3565b80601f0160208091040260200160405190810160405280929190818152602001828054610ee7906146c3565b8015610f345780601f10610f0957610100808354040283529160200191610f34565b820191906000526020600020905b815481529060010190602001808311610f1757829003601f168201915b505050505090806002018054610f49906146c3565b80601f0160208091040260200160405190810160405280929190818152602001828054610f75906146c3565b8015610fc25780601f10610f9757610100808354040283529160200191610fc2565b820191906000526020600020905b815481529060010190602001808311610fa557829003601f168201915b505050505090806003018054610fd7906146c3565b80601f0160208091040260200160405190810160405280929190818152602001828054611003906146c3565b80156110505780601f1061102557610100808354040283529160200191611050565b820191906000526020600020905b81548152906001019060200180831161103357829003601f168201915b505050505090806004018054611065906146c3565b80601f0160208091040260200160405190810160405280929190818152602001828054611091906146c3565b80156110de5780601f106110b3576101008083540402835291602001916110de565b820191906000526020600020905b8154815290600101906020018083116110c157829003601f168201915b5050505050908060050180546110f3906146c3565b80601f016020809104026020016040519081016040528092919081815260200182805461111f906146c3565b801561116c5780601f106111415761010080835404028352916020019161116c565b820191906000526020600020905b81548152906001019060200180831161114f57829003601f168201915b505050505090806006018054611181906146c3565b80601f01602080910402602001604051908101604052809291908181526020018280546111ad906146c3565b80156111fa5780601f106111cf576101008083540402835291602001916111fa565b820191906000526020600020905b8154815290600101906020018083116111dd57829003601f168201915b50505050509080600701805461120f906146c3565b80601f016020809104026020016040519081016040528092919081815260200182805461123b906146c3565b80156112885780601f1061125d57610100808354040283529160200191611288565b820191906000526020600020905b81548152906001019060200180831161126b57829003601f168201915b50505050509080600801805461129d906146c3565b80601f01602080910402602001604051908101604052809291908181526020018280546112c9906146c3565b80156113165780601f106112eb57610100808354040283529160200191611316565b820191906000526020600020905b8154815290600101906020018083116112f957829003601f168201915b5050505050905089565b6000846000015185602001518660400151876060015188608001518960a001518a60c001518b60e001518c610100015160405160200161136899989796959493929190614a63565b60405160208183030381529060405290506000600d8260405161138b9190614ae2565b908152602001604051809103902054146113da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d190614b45565b60405180910390fd5b610200600b5410611420576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141790614bb1565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166397aba7f986866040518363ffffffff1660e01b81526004016114b6929190614be0565b602060405180830381865afa1580156114d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f79190614c25565b73ffffffffffffffffffffffffffffffffffffffff161461154d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154490614c9e565b60405180910390fd5b83600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631de810a1836040518263ffffffff1660e01b81526004016115a99190613cd7565b602060405180830381865afa1580156115c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ea9190614cd3565b1461162a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162190614d4c565b60405180910390fd5b3360405160200161163b9190614db4565b604051602081830303815290604052805190602001208214611692576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168990614e1b565b60405180910390fd5b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016116ef9190613d9d565b602060405180830381865afa15801561170c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117309190614e50565b111561178557662c68af0bb14000341015611780576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177790614ec9565b60405180910390fd5b6117d0565b6658d15e176280003410156117cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c690614ec9565b60405180910390fd5b5b600060405180610120016040528087600001518152602001876020015181526020018760400151815260200187606001518152602001876080015181526020018760a0015181526020018760c0015181526020018760e0015181526020018761010001518152509050600b600081548092919061184c90614f18565b9190505550600b54600d836040516118649190614ae2565b90815260200160405180910390208190555080600e6000600b54815260200190815260200160002060008201518160000190805190602001906118a8929190613acc565b5060208201518160010190805190602001906118c5929190613acc565b5060408201518160020190805190602001906118e2929190613acc565b5060608201518160030190805190602001906118ff929190613acc565b50608082015181600401908051906020019061191c929190613acc565b5060a0820151816005019080519060200190611939929190613acc565b5060c0820151816006019080519060200190611956929190613acc565b5060e0820151816007019080519060200190611973929190613acc565b50610100820151816008019080519060200190611991929190613acc565b5090505061199d611cab565b73ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156119e2573d6000803e3d6000fd5b506119ef33600b54612efc565b505050505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080611a2983612f1a565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9190614fac565b60405180910390fd5b80915050919050565b604051806060016040528060258152602001615e106025913981565b60088054611acc906146c3565b80601f0160208091040260200160405190810160405280929190818152602001828054611af8906146c3565b8015611b455780601f10611b1a57610100808354040283529160200191611b45565b820191906000526020600020905b815481529060010190602001808311611b2857829003601f168201915b505050505081565b6040518060400160405280600781526020017f506c7a2042726f0000000000000000000000000000000000000000000000000081525081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611bf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bed9061503e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611c45612e7e565b611c4f6000612f57565b565b604051806080016040528060458152602001615cfa6045913981565b611c75612e7e565b8060099080519060200190611c8b929190613acc565b5050565b604051806060016040528060268152602001615c646026913981565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60098054611ce2906146c3565b80601f0160208091040260200160405190810160405280929190818152602001828054611d0e906146c3565b8015611d5b5780601f10611d3057610100808354040283529160200191611d5b565b820191906000526020600020905b815481529060010190602001808311611d3e57829003601f168201915b505050505081565b606060018054611d72906146c3565b80601f0160208091040260200160405190810160405280929190818152602001828054611d9e906146c3565b8015611deb5780601f10611dc057610100808354040283529160200191611deb565b820191906000526020600020905b815481529060010190602001808311611dce57829003601f168201915b5050505050905090565b611e07611e006129ee565b838361301d565b5050565b611e13612e7e565b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b604051806060016040528060268152602001615c8a6026913981565b611e84611e7e6129ee565b83612af0565b611ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eba90614a43565b60405180910390fd5b611ecf84848484613189565b50505050565b604051806060016040528060268152602001615e5b6026913981565b6060611efc82612aaf565b611f3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3290614864565b60405180910390fd5b6000600e600084815260200190815260200160002060405180610120016040529081600082018054611f6c906146c3565b80601f0160208091040260200160405190810160405280929190818152602001828054611f98906146c3565b8015611fe55780601f10611fba57610100808354040283529160200191611fe5565b820191906000526020600020905b815481529060010190602001808311611fc857829003601f168201915b50505050508152602001600182018054611ffe906146c3565b80601f016020809104026020016040519081016040528092919081815260200182805461202a906146c3565b80156120775780601f1061204c57610100808354040283529160200191612077565b820191906000526020600020905b81548152906001019060200180831161205a57829003601f168201915b50505050508152602001600282018054612090906146c3565b80601f01602080910402602001604051908101604052809291908181526020018280546120bc906146c3565b80156121095780601f106120de57610100808354040283529160200191612109565b820191906000526020600020905b8154815290600101906020018083116120ec57829003601f168201915b50505050508152602001600382018054612122906146c3565b80601f016020809104026020016040519081016040528092919081815260200182805461214e906146c3565b801561219b5780601f106121705761010080835404028352916020019161219b565b820191906000526020600020905b81548152906001019060200180831161217e57829003601f168201915b505050505081526020016004820180546121b4906146c3565b80601f01602080910402602001604051908101604052809291908181526020018280546121e0906146c3565b801561222d5780601f106122025761010080835404028352916020019161222d565b820191906000526020600020905b81548152906001019060200180831161221057829003601f168201915b50505050508152602001600582018054612246906146c3565b80601f0160208091040260200160405190810160405280929190818152602001828054612272906146c3565b80156122bf5780601f10612294576101008083540402835291602001916122bf565b820191906000526020600020905b8154815290600101906020018083116122a257829003601f168201915b505050505081526020016006820180546122d8906146c3565b80601f0160208091040260200160405190810160405280929190818152602001828054612304906146c3565b80156123515780601f1061232657610100808354040283529160200191612351565b820191906000526020600020905b81548152906001019060200180831161233457829003601f168201915b5050505050815260200160078201805461236a906146c3565b80601f0160208091040260200160405190810160405280929190818152602001828054612396906146c3565b80156123e35780601f106123b8576101008083540402835291602001916123e3565b820191906000526020600020905b8154815290600101906020018083116123c657829003601f168201915b505050505081526020016008820180546123fc906146c3565b80601f0160208091040260200160405190810160405280929190818152602001828054612428906146c3565b80156124755780601f1061244a57610100808354040283529160200191612475565b820191906000526020600020905b81548152906001019060200180831161245857829003601f168201915b5050505050815250509050600060405180610100016040528060dd8152602001615e8160dd91398260000151604051806060016040528060258152602001615cb0602591398460200151604051806060016040528060258152602001615cd56025913986604001516040516020016124f29695949392919061505e565b60405160208183030381529060405290506000604051806060016040528060258152602001615e10602591398360600151604051806060016040528060268152602001615d3f602691398560800151604051806060016040528060268152602001615c64602691398760a001516040516020016125749695949392919061505e565b60405160208183030381529060405290506000604051806060016040528060268152602001615e35602691398460c00151604051806060016040528060268152602001615c8a602691398660e00151604051806060016040528060268152602001615e5b602691398861010001516040518060a00160405280606b8152602001615d65606b913960405160200161261197969594939291906150b6565b604051602081830303815290604052905082828260405160200161263793929190615157565b604051602081830303815290604052945050505050919050565b600d818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b606061268a82612aaf565b6126c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c090614864565b60405180910390fd5b60006126dc6126d784611ef1565b6131e5565b6040516020016126ec9190615246565b6040516020818303038152906040529050600061271061270b85610c49565b6131e5565b60405160200161272091906152e5565b604051602081830303815290604052905060006127be6040518060400160405280600781526020017f506c7a2042726f000000000000000000000000000000000000000000000000008152506127758761335d565b604051806080016040528060458152602001615cfa604591398686600860096040516020016127aa979695949392919061556e565b6040516020818303038152906040526131e5565b9050806040516020016127d19190615677565b6040516020818303038152906040529350505050919050565b604051806060016040528060268152602001615d3f6026913981565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6128a2612e7e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612911576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129089061570b565b60405180910390fd5b61291a81612f57565b50565b6040518060a00160405280606b8152602001615d65606b913981565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6129ac81612aaf565b6129eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e290614fac565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612a6983611a1d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008073ffffffffffffffffffffffffffffffffffffffff16612ad183612f1a565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600080612afc83611a1d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612b3e5750612b3d8185612806565b5b80612b7c57508373ffffffffffffffffffffffffffffffffffffffff16612b6484610aec565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612ba582611a1d565b73ffffffffffffffffffffffffffffffffffffffff1614612bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf29061579d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c619061582f565b60405180910390fd5b612c77838383600161342b565b8273ffffffffffffffffffffffffffffffffffffffff16612c9782611a1d565b73ffffffffffffffffffffffffffffffffffffffff1614612ced576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce49061579d565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e798383836001613551565b505050565b612e866129ee565b73ffffffffffffffffffffffffffffffffffffffff16612ea4611cab565b73ffffffffffffffffffffffffffffffffffffffff1614612efa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ef19061589b565b60405180910390fd5b565b612f16828260405180602001604052806000815250613557565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361308b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308290615907565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161317c9190613c23565b60405180910390a3505050565b613194848484612b85565b6131a0848484846135b2565b6131df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d690615999565b60405180910390fd5b50505050565b6060600082510361320757604051806020016040528060008152509050613358565b6000604051806060016040528060408152602001615dd0604091399050600060036002855161323691906159b9565b6132409190615a3e565b600461324c9190615a6f565b9050600060208261325d91906159b9565b67ffffffffffffffff81111561327657613275613fe9565b5b6040519080825280601f01601f1916602001820160405280156132a85781602001600182028036833780820191505090505b509050818152600183018586518101602084015b81831015613317576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f81168501518253600182019150506132bc565b60038951066001811461333157600281146133415761334c565b613d3d60f01b600283035261334c565b603d60f81b60018303525b50505050508093505050505b919050565b60606000600161336c84613739565b01905060008167ffffffffffffffff81111561338b5761338a613fe9565b5b6040519080825280601f01601f1916602001820160405280156133bd5781602001600182028036833780820191505090505b509050600082602001820190505b600115613420578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161341457613413615a0f565b5b049450600085036133cb575b819350505050919050565b600181111561354b57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146134bf5780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134b79190615ac9565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461354a5780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461354291906159b9565b925050819055505b5b50505050565b50505050565b613561838361388c565b61356e60008484846135b2565b6135ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135a490615999565b60405180910390fd5b505050565b60006135d38473ffffffffffffffffffffffffffffffffffffffff16613aa9565b1561372c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026135fc6129ee565b8786866040518563ffffffff1660e01b815260040161361e9493929190615afd565b6020604051808303816000875af192505050801561365a57506040513d601f19601f820116820180604052508101906136579190615b5e565b60015b6136dc573d806000811461368a576040519150601f19603f3d011682016040523d82523d6000602084013e61368f565b606091505b5060008151036136d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136cb90615999565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613731565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613797577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161378d5761378c615a0f565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106137d4576d04ee2d6d415b85acef810000000083816137ca576137c9615a0f565b5b0492506020810190505b662386f26fc10000831061380357662386f26fc1000083816137f9576137f8615a0f565b5b0492506010810190505b6305f5e100831061382c576305f5e100838161382257613821615a0f565b5b0492506008810190505b612710831061385157612710838161384757613846615a0f565b5b0492506004810190505b60648310613874576064838161386a57613869615a0f565b5b0492506002810190505b600a8310613883576001810190505b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036138fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138f290615bd7565b60405180910390fd5b61390481612aaf565b15613944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161393b90615c43565b60405180910390fd5b61395260008383600161342b565b61395b81612aaf565b1561399b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161399290615c43565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613aa5600083836001613551565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054613ad8906146c3565b90600052602060002090601f016020900481019282613afa5760008555613b41565b82601f10613b1357805160ff1916838001178555613b41565b82800160010185558215613b41579182015b82811115613b40578251825591602001919060010190613b25565b5b509050613b4e9190613b52565b5090565b5b80821115613b6b576000816000905550600101613b53565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613bb881613b83565b8114613bc357600080fd5b50565b600081359050613bd581613baf565b92915050565b600060208284031215613bf157613bf0613b79565b5b6000613bff84828501613bc6565b91505092915050565b60008115159050919050565b613c1d81613c08565b82525050565b6000602082019050613c386000830184613c14565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613c78578082015181840152602081019050613c5d565b83811115613c87576000848401525b50505050565b6000601f19601f8301169050919050565b6000613ca982613c3e565b613cb38185613c49565b9350613cc3818560208601613c5a565b613ccc81613c8d565b840191505092915050565b60006020820190508181036000830152613cf18184613c9e565b905092915050565b6000819050919050565b613d0c81613cf9565b8114613d1757600080fd5b50565b600081359050613d2981613d03565b92915050565b600060208284031215613d4557613d44613b79565b5b6000613d5384828501613d1a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613d8782613d5c565b9050919050565b613d9781613d7c565b82525050565b6000602082019050613db26000830184613d8e565b92915050565b613dc181613d7c565b8114613dcc57600080fd5b50565b600081359050613dde81613db8565b92915050565b60008060408385031215613dfb57613dfa613b79565b5b6000613e0985828601613dcf565b9250506020613e1a85828601613d1a565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000613e4b82613e24565b613e558185613e2f565b9350613e65818560208601613c5a565b613e6e81613c8d565b840191505092915050565b60006020820190508181036000830152613e938184613e40565b905092915050565b600080600060608486031215613eb457613eb3613b79565b5b6000613ec286828701613dcf565b9350506020613ed386828701613dcf565b9250506040613ee486828701613d1a565b9150509250925092565b613ef781613cf9565b82525050565b6000602082019050613f126000830184613eee565b92915050565b6000610120820190508181036000830152613f33818c613c9e565b90508181036020830152613f47818b613c9e565b90508181036040830152613f5b818a613c9e565b90508181036060830152613f6f8189613c9e565b90508181036080830152613f838188613c9e565b905081810360a0830152613f978187613c9e565b905081810360c0830152613fab8186613c9e565b905081810360e0830152613fbf8185613c9e565b9050818103610100830152613fd48184613c9e565b90509a9950505050505050505050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61402182613c8d565b810181811067ffffffffffffffff821117156140405761403f613fe9565b5b80604052505050565b6000614053613b6f565b905061405f8282614018565b919050565b600080fd5b600080fd5b600080fd5b600067ffffffffffffffff82111561408e5761408d613fe9565b5b61409782613c8d565b9050602081019050919050565b82818337600083830152505050565b60006140c66140c184614073565b614049565b9050828152602081018484840111156140e2576140e161406e565b5b6140ed8482856140a4565b509392505050565b600082601f83011261410a57614109614069565b5b813561411a8482602086016140b3565b91505092915050565b6000610120828403121561413a57614139613fe4565b5b614145610120614049565b9050600082013567ffffffffffffffff81111561416557614164614064565b5b614171848285016140f5565b600083015250602082013567ffffffffffffffff81111561419557614194614064565b5b6141a1848285016140f5565b602083015250604082013567ffffffffffffffff8111156141c5576141c4614064565b5b6141d1848285016140f5565b604083015250606082013567ffffffffffffffff8111156141f5576141f4614064565b5b614201848285016140f5565b606083015250608082013567ffffffffffffffff81111561422557614224614064565b5b614231848285016140f5565b60808301525060a082013567ffffffffffffffff81111561425557614254614064565b5b614261848285016140f5565b60a08301525060c082013567ffffffffffffffff81111561428557614284614064565b5b614291848285016140f5565b60c08301525060e082013567ffffffffffffffff8111156142b5576142b4614064565b5b6142c1848285016140f5565b60e08301525061010082013567ffffffffffffffff8111156142e6576142e5614064565b5b6142f2848285016140f5565b6101008301525092915050565b6000819050919050565b614312816142ff565b811461431d57600080fd5b50565b60008135905061432f81614309565b92915050565b600067ffffffffffffffff8211156143505761434f613fe9565b5b61435982613c8d565b9050602081019050919050565b600061437961437484614335565b614049565b9050828152602081018484840111156143955761439461406e565b5b6143a08482856140a4565b509392505050565b600082601f8301126143bd576143bc614069565b5b81356143cd848260208601614366565b91505092915050565b600080600080608085870312156143f0576143ef613b79565b5b600085013567ffffffffffffffff81111561440e5761440d613b7e565b5b61441a87828801614123565b945050602061442b87828801614320565b935050604085013567ffffffffffffffff81111561444c5761444b613b7e565b5b614458878288016143a8565b925050606061446987828801614320565b91505092959194509250565b6000819050919050565b600061449a61449561449084613d5c565b614475565b613d5c565b9050919050565b60006144ac8261447f565b9050919050565b60006144be826144a1565b9050919050565b6144ce816144b3565b82525050565b60006020820190506144e960008301846144c5565b92915050565b60006020828403121561450557614504613b79565b5b600061451384828501613dcf565b91505092915050565b60006020828403121561453257614531613b79565b5b600082013567ffffffffffffffff8111156145505761454f613b7e565b5b61455c848285016140f5565b91505092915050565b61456e81613c08565b811461457957600080fd5b50565b60008135905061458b81614565565b92915050565b600080604083850312156145a8576145a7613b79565b5b60006145b685828601613dcf565b92505060206145c78582860161457c565b9150509250929050565b600080600080608085870312156145eb576145ea613b79565b5b60006145f987828801613dcf565b945050602061460a87828801613dcf565b935050604061461b87828801613d1a565b925050606085013567ffffffffffffffff81111561463c5761463b613b7e565b5b614648878288016143a8565b91505092959194509250565b6000806040838503121561466b5761466a613b79565b5b600061467985828601613dcf565b925050602061468a85828601613dcf565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806146db57607f821691505b6020821081036146ee576146ed614694565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614750602183613c49565b915061475b826146f4565b604082019050919050565b6000602082019050818103600083015261477f81614743565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b60006147e2603d83613c49565b91506147ed82614786565b604082019050919050565b60006020820190508181036000830152614811816147d5565b9050919050565b7f546f6b656e20646f65736e27742065786973742e000000000000000000000000600082015250565b600061484e601483613c49565b915061485982614818565b602082019050919050565b6000602082019050818103600083015261487d81614841565b9050919050565b600081905092915050565b7f3c21444f43545950452068746d6c3e3c68746d6c3e3c686561643e3c7374796c60008201527f653e2a7b6d617267696e3a303b70616464696e673a307d3c2f7374796c653e3c60208201527f2f686561643e3c626f64793e0000000000000000000000000000000000000000604082015250565b6000614911604c83614884565b915061491c8261488f565b604c82019050919050565b600061493282613c3e565b61493c8185614884565b935061494c818560208601613c5a565b80840191505092915050565b7f3c2f626f64793e3c2f68746d6c3e000000000000000000000000000000000000600082015250565b600061498e600e83614884565b915061499982614958565b600e82019050919050565b60006149af82614904565b91506149bb8284614927565b91506149c682614981565b915081905092915050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000614a2d602d83613c49565b9150614a38826149d1565b604082019050919050565b60006020820190508181036000830152614a5c81614a20565b9050919050565b6000614a6f828c614927565b9150614a7b828b614927565b9150614a87828a614927565b9150614a938289614927565b9150614a9f8288614927565b9150614aab8287614927565b9150614ab78286614927565b9150614ac38285614927565b9150614acf8284614927565b91508190509a9950505050505050505050565b6000614aee8284614927565b915081905092915050565b7f506f656d20616c726561647920636c61696d65642e0000000000000000000000600082015250565b6000614b2f601583613c49565b9150614b3a82614af9565b602082019050919050565b60006020820190508181036000830152614b5e81614b22565b9050919050565b7f416c6c206f75742e000000000000000000000000000000000000000000000000600082015250565b6000614b9b600883613c49565b9150614ba682614b65565b602082019050919050565b60006020820190508181036000830152614bca81614b8e565b9050919050565b614bda816142ff565b82525050565b6000604082019050614bf56000830185614bd1565b8181036020830152614c078184613e40565b90509392505050565b600081519050614c1f81613db8565b92915050565b600060208284031215614c3b57614c3a613b79565b5b6000614c4984828501614c10565b91505092915050565b7f496e76616c6964207369676e61747572652e0000000000000000000000000000600082015250565b6000614c88601283613c49565b9150614c9382614c52565b602082019050919050565b60006020820190508181036000830152614cb781614c7b565b9050919050565b600081519050614ccd81614309565b92915050565b600060208284031215614ce957614ce8613b79565b5b6000614cf784828501614cbe565b91505092915050565b7f4861736820616e6420706f656d20646f6e2774206d617463682e000000000000600082015250565b6000614d36601a83613c49565b9150614d4182614d00565b602082019050919050565b60006020820190508181036000830152614d6581614d29565b9050919050565b60008160601b9050919050565b6000614d8482614d6c565b9050919050565b6000614d9682614d79565b9050919050565b614dae614da982613d7c565b614d8b565b82525050565b6000614dc08284614d9d565b60148201915081905092915050565b7f4d616769633f0000000000000000000000000000000000000000000000000000600082015250565b6000614e05600683613c49565b9150614e1082614dcf565b602082019050919050565b60006020820190508181036000830152614e3481614df8565b9050919050565b600081519050614e4a81613d03565b92915050565b600060208284031215614e6657614e65613b79565b5b6000614e7484828501614e3b565b91505092915050565b7f4e6f7420656e6f756768204554482e0000000000000000000000000000000000600082015250565b6000614eb3600f83613c49565b9150614ebe82614e7d565b602082019050919050565b60006020820190508181036000830152614ee281614ea6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614f2382613cf9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614f5557614f54614ee9565b5b600182019050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000614f96601883613c49565b9150614fa182614f60565b602082019050919050565b60006020820190508181036000830152614fc581614f89565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000615028602983613c49565b915061503382614fcc565b604082019050919050565b600060208201905081810360008301526150578161501b565b9050919050565b600061506a8289614927565b91506150768288614927565b91506150828287614927565b915061508e8286614927565b915061509a8285614927565b91506150a68284614927565b9150819050979650505050505050565b60006150c2828a614927565b91506150ce8289614927565b91506150da8288614927565b91506150e68287614927565b91506150f28286614927565b91506150fe8285614927565b915061510a8284614927565b915081905098975050505050505050565b600081905092915050565b600061513182613e24565b61513b818561511b565b935061514b818560208601613c5a565b80840191505092915050565b60006151638286615126565b915061516f8285615126565b915061517b8284615126565b9150819050949350505050565b7f22696d616765223a2022646174613a696d6167652f7376672b786d6c3b62617360008201527f6536342c00000000000000000000000000000000000000000000000000000000602082015250565b60006151e4602483614884565b91506151ef82615188565b602482019050919050565b7f222c000000000000000000000000000000000000000000000000000000000000600082015250565b6000615230600283614884565b915061523b826151fa565b600282019050919050565b6000615251826151d7565b915061525d8284614927565b915061526882615223565b915081905092915050565b7f22616e696d6174696f6e5f75726c223a2022646174613a746578742f68746d6c60008201527f3b6261736536342c000000000000000000000000000000000000000000000000602082015250565b60006152cf602883614884565b91506152da82615273565b602882019050919050565b60006152f0826152c2565b91506152fc8284614927565b915061530782615223565b915081905092915050565b7f7b226e616d65223a202200000000000000000000000000000000000000000000600082015250565b6000615348600a83614884565b915061535382615312565b600a82019050919050565b7f2023000000000000000000000000000000000000000000000000000000000000600082015250565b6000615394600283614884565b915061539f8261535e565b600282019050919050565b7f226465736372697074696f6e223a202200000000000000000000000000000000600082015250565b60006153e0601083614884565b91506153eb826153aa565b601082019050919050565b7f226c6963656e7365223a20220000000000000000000000000000000000000000600082015250565b600061542c600c83614884565b9150615437826153f6565b600c82019050919050565b60008190508160005260206000209050919050565b60008154615464816146c3565b61546e8186614884565b94506001821660008114615489576001811461549a576154cd565b60ff198316865281860193506154cd565b6154a385615442565b60005b838110156154c5578154818901526001820191506020810190506154a6565b838801955050505b50505092915050565b7f222c2265787465726e616c5f75726c223a202200000000000000000000000000600082015250565b600061550c601383614884565b9150615517826154d6565b601382019050919050565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b6000615558600283614884565b915061556382615522565b600282019050919050565b60006155798261533b565b9150615585828a614927565b915061559082615387565b915061559c8289614927565b91506155a782615223565b91506155b2826153d3565b91506155be8288614927565b91506155c982615223565b91506155d58287615126565b91506155e18286615126565b91506155ec8261541f565b91506155f88285615457565b9150615603826154ff565b915061560f8284615457565b915061561a8261554b565b915081905098975050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b6000615661601d83614884565b915061566c8261562b565b601d82019050919050565b600061568282615654565b915061568e8284614927565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006156f5602683613c49565b915061570082615699565b604082019050919050565b60006020820190508181036000830152615724816156e8565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000615787602583613c49565b91506157928261572b565b604082019050919050565b600060208201905081810360008301526157b68161577a565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615819602483613c49565b9150615824826157bd565b604082019050919050565b600060208201905081810360008301526158488161580c565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615885602083613c49565b91506158908261584f565b602082019050919050565b600060208201905081810360008301526158b481615878565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006158f1601983613c49565b91506158fc826158bb565b602082019050919050565b60006020820190508181036000830152615920816158e4565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615983603283613c49565b915061598e82615927565b604082019050919050565b600060208201905081810360008301526159b281615976565b9050919050565b60006159c482613cf9565b91506159cf83613cf9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615a0457615a03614ee9565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615a4982613cf9565b9150615a5483613cf9565b925082615a6457615a63615a0f565b5b828204905092915050565b6000615a7a82613cf9565b9150615a8583613cf9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615abe57615abd614ee9565b5b828202905092915050565b6000615ad482613cf9565b9150615adf83613cf9565b925082821015615af257615af1614ee9565b5b828203905092915050565b6000608082019050615b126000830187613d8e565b615b1f6020830186613d8e565b615b2c6040830185613eee565b8181036060830152615b3e8184613e40565b905095945050505050565b600081519050615b5881613baf565b92915050565b600060208284031215615b7457615b73613b79565b5b6000615b8284828501615b49565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615bc1602083613c49565b9150615bcc82615b8b565b602082019050919050565b60006020820190508181036000830152615bf081615bb4565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615c2d601c83613c49565b9150615c3882615bf7565b602082019050919050565b60006020820190508181036000830152615c5c81615c20565b905091905056fe3c2f746578743e3c7465787420783d2231302220793d223132352220636c6173733d2268223e3c2f746578743e3c7465787420783d2231302220793d223136352220636c6173733d2268223e3c2f746578743e3c7465787420783d2231302220793d2234352220636c6173733d2268223e3c2f746578743e3c7465787420783d2231302220793d2236352220636c6173733d2268223e506f656d732067656e6572617465642066726f6d20534d5320726563656976656420647572696e6720746865206d696e74696e67206f66204861636b6572204861696b752e3c2f746578743e3c7465787420783d2231302220793d223130352220636c6173733d2268223e3c2f746578743e3c7265637420783d2233252220793d223325222077696474683d2239342522206865696768743d22393425222066696c6c3d226e6f6e6522207374726f6b653d222330356632323822207374726f6b652d77696474683d222e3525222f3e3c2f7376673e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d2238352220636c6173733d2268223e3c2f746578743e3c7465787420783d2231302220793d223134352220636c6173733d2268223e3c2f746578743e3c7465787420783d2231302220793d223138352220636c6173733d2268223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737667222076696577426f783d223020302032303020323030223e3c7374796c653e2e687b666f6e742d66616d696c793a20436f7572696572204e65773b666f6e742d73697a653a323070783b66696c6c3a233035663232383b7d3c2f7374796c653e3c7265637420783d22302220793d2230222077696474683d2232303022206865696768743d22323030222066696c6c3d22626c61636b222f3e3c7465787420783d2231302220793d2232352220636c6173733d2268223ea26469706673582212202e413854b5e107ee77dba41575a1d6a3bb573dddbace0ec66bf9db1c1cd62d3264736f6c634300080d0033608060405234801561001057600080fd5b50610f3c806100206000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c80631de810a11461006757806397aba7f914610097578063a35f8a40146100c7578063a7bb5803146100f7578063abe5026a14610129578063fa54080114610159575b600080fd5b610081600480360381019061007c91906106e8565b610189565b60405161008e919061074a565b60405180910390f35b6100b160048036038101906100ac9190610832565b6101c9565b6040516100be91906108cf565b60405180910390f35b6100e160048036038101906100dc919061094c565b610238565b6040516100ee919061074a565b60405180910390f35b610111600480360381019061010c91906109cf565b610271565b60405161012093929190610a34565b60405180910390f35b610143600480360381019061013e9190610a6b565b6102d9565b6040516101509190610b4b565b60405180910390f35b610173600480360381019061016e9190610b66565b61033d565b604051610180919061074a565b60405180910390f35b600080829050610199815161036d565b816040516020016101ab929190610ca0565b60405160208183030381529060405280519060200120915050919050565b6000806000806101d885610271565b925092509250600186828585604051600081526020016040526040516102019493929190610ccf565b6020604051602081039080840390855afa158015610223573d6000803e3d6000fd5b50505060206040510351935050505092915050565b6000848484846040516020016102519493929190610d7d565b604051602081830303815290604052805190602001209050949350505050565b600080600060418451146102ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b190610e24565b60405180910390fd5b6020840151925060408401519150606084015160001a90509193909250565b6000806102e887878787610238565b905060006102f58261033d565b90508873ffffffffffffffffffffffffffffffffffffffff1661031882866101c9565b73ffffffffffffffffffffffffffffffffffffffff1614925050509695505050505050565b6000816040516020016103509190610eb1565b604051602081830303815290604052805190602001209050919050565b60606000600161037c8461043b565b01905060008167ffffffffffffffff81111561039b5761039a6105bd565b5b6040519080825280601f01601f1916602001820160405280156103cd5781602001600182028036833780820191505090505b509050600082602001820190505b600115610430578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161042457610423610ed7565b5b049450600085036103db575b819350505050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310610499577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161048f5761048e610ed7565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106104d6576d04ee2d6d415b85acef810000000083816104cc576104cb610ed7565b5b0492506020810190505b662386f26fc10000831061050557662386f26fc1000083816104fb576104fa610ed7565b5b0492506010810190505b6305f5e100831061052e576305f5e100838161052457610523610ed7565b5b0492506008810190505b612710831061055357612710838161054957610548610ed7565b5b0492506004810190505b60648310610576576064838161056c5761056b610ed7565b5b0492506002810190505b600a8310610585576001810190505b80915050919050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6105f5826105ac565b810181811067ffffffffffffffff82111715610614576106136105bd565b5b80604052505050565b600061062761058e565b905061063382826105ec565b919050565b600067ffffffffffffffff821115610653576106526105bd565b5b61065c826105ac565b9050602081019050919050565b82818337600083830152505050565b600061068b61068684610638565b61061d565b9050828152602081018484840111156106a7576106a66105a7565b5b6106b2848285610669565b509392505050565b600082601f8301126106cf576106ce6105a2565b5b81356106df848260208601610678565b91505092915050565b6000602082840312156106fe576106fd610598565b5b600082013567ffffffffffffffff81111561071c5761071b61059d565b5b610728848285016106ba565b91505092915050565b6000819050919050565b61074481610731565b82525050565b600060208201905061075f600083018461073b565b92915050565b61076e81610731565b811461077957600080fd5b50565b60008135905061078b81610765565b92915050565b600067ffffffffffffffff8211156107ac576107ab6105bd565b5b6107b5826105ac565b9050602081019050919050565b60006107d56107d084610791565b61061d565b9050828152602081018484840111156107f1576107f06105a7565b5b6107fc848285610669565b509392505050565b600082601f830112610819576108186105a2565b5b81356108298482602086016107c2565b91505092915050565b6000806040838503121561084957610848610598565b5b60006108578582860161077c565b925050602083013567ffffffffffffffff8111156108785761087761059d565b5b61088485828601610804565b9150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006108b98261088e565b9050919050565b6108c9816108ae565b82525050565b60006020820190506108e460008301846108c0565b92915050565b6108f3816108ae565b81146108fe57600080fd5b50565b600081359050610910816108ea565b92915050565b6000819050919050565b61092981610916565b811461093457600080fd5b50565b60008135905061094681610920565b92915050565b6000806000806080858703121561096657610965610598565b5b600061097487828801610901565b945050602061098587828801610937565b935050604085013567ffffffffffffffff8111156109a6576109a561059d565b5b6109b2878288016106ba565b92505060606109c387828801610937565b91505092959194509250565b6000602082840312156109e5576109e4610598565b5b600082013567ffffffffffffffff811115610a0357610a0261059d565b5b610a0f84828501610804565b91505092915050565b600060ff82169050919050565b610a2e81610a18565b82525050565b6000606082019050610a49600083018661073b565b610a56602083018561073b565b610a636040830184610a25565b949350505050565b60008060008060008060c08789031215610a8857610a87610598565b5b6000610a9689828a01610901565b9650506020610aa789828a01610901565b9550506040610ab889828a01610937565b945050606087013567ffffffffffffffff811115610ad957610ad861059d565b5b610ae589828a016106ba565b9350506080610af689828a01610937565b92505060a087013567ffffffffffffffff811115610b1757610b1661059d565b5b610b2389828a01610804565b9150509295509295509295565b60008115159050919050565b610b4581610b30565b82525050565b6000602082019050610b606000830184610b3c565b92915050565b600060208284031215610b7c57610b7b610598565b5b6000610b8a8482850161077c565b91505092915050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a000000000000600082015250565b6000610bd4601a83610b93565b9150610bdf82610b9e565b601a82019050919050565b600081519050919050565b60005b83811015610c13578082015181840152602081019050610bf8565b83811115610c22576000848401525b50505050565b6000610c3382610bea565b610c3d8185610b93565b9350610c4d818560208601610bf5565b80840191505092915050565b600081519050919050565b600081905092915050565b6000610c7a82610c59565b610c848185610c64565b9350610c94818560208601610bf5565b80840191505092915050565b6000610cab82610bc7565b9150610cb78285610c28565b9150610cc38284610c6f565b91508190509392505050565b6000608082019050610ce4600083018761073b565b610cf16020830186610a25565b610cfe604083018561073b565b610d0b606083018461073b565b95945050505050565b60008160601b9050919050565b6000610d2c82610d14565b9050919050565b6000610d3e82610d21565b9050919050565b610d56610d51826108ae565b610d33565b82525050565b6000819050919050565b610d77610d7282610916565b610d5c565b82525050565b6000610d898287610d45565b601482019150610d998286610d66565b602082019150610da98285610c28565b9150610db58284610d66565b60208201915081905095945050505050565b600082825260208201905092915050565b7f696e76616c6964207369676e6174757265206c656e6774680000000000000000600082015250565b6000610e0e601883610dc7565b9150610e1982610dd8565b602082019050919050565b60006020820190508181036000830152610e3d81610e01565b9050919050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000610e7a601c83610b93565b9150610e8582610e44565b601c82019050919050565b6000819050919050565b610eab610ea682610731565b610e90565b82525050565b6000610ebc82610e6d565b9150610ec88284610e9a565b60208201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fdfea26469706673582212203c3b21ab7a51e4526431a7279646fa9b3ac952ed26848eb153c8a904e03f74ab64736f6c634300080d0033000000000000000000000000b762f00e5ea9796b0c1e4c0a812a8253615b83c50000000000000000000000000b77583d36ee81fdf1b1504d6d7554cd89063101

Deployed Bytecode

0x60806040526004361061023f5760003560e01c806370a082311161012e578063abe34c9b116100ab578063c87b56dd1161006f578063c87b56dd1461087f578063d755a605146108bc578063e985e9c5146108e7578063f2fde38b14610924578063f56ee8b81461094d57610246565b8063abe34c9b14610786578063b88d4fde146107b1578063bcc2fe9c146107da578063be985ac914610805578063bfd187011461084257610246565b80638da5cb5b116100f25780638da5cb5b146106b35780638fc73484146106de57806395d89b4114610709578063a22cb46514610734578063a7ecd37e1461075d57610246565b806370a08231146105e0578063715018a61461061d5780637284e416146106345780637931b3e41461065f5780637cd784dd1461068857610246565b806342842e0e116101bc57806358cd25131161018057806358cd2513146104f75780636352211e1461052257806365902b0a1461055f5780636b87d24c1461058a5780636c02a931146105b557610246565b806342842e0e14610417578063446dc654146104405780634eeca0761461046b5780634f64b2be146104965780634fdfc629146104db57610246565b80631816ee7e116102035780631816ee7e1461035657806323b872dd146103815780632653f517146103aa5780632dab1e36146103d55780633ccfd60b1461040057610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063095ea7b3146102f0578063102581d21461031957610246565b3661024657005b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613bdb565b610978565b60405161027f9190613c23565b60405180910390f35b34801561029457600080fd5b5061029d610a5a565b6040516102aa9190613cd7565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d59190613d2f565b610aec565b6040516102e79190613d9d565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190613de4565b610b32565b005b34801561032557600080fd5b50610340600480360381019061033b9190613d2f565b610c49565b60405161034d9190613e79565b60405180910390f35b34801561036257600080fd5b5061036b610cc2565b6040516103789190613cd7565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a39190613e9b565b610cde565b005b3480156103b657600080fd5b506103bf610d3e565b6040516103cc9190613cd7565b60405180910390f35b3480156103e157600080fd5b506103ea610d5a565b6040516103f79190613cd7565b60405180910390f35b34801561040c57600080fd5b50610415610d77565b005b34801561042357600080fd5b5061043e60048036038101906104399190613e9b565b610dc8565b005b34801561044c57600080fd5b50610455610de8565b6040516104629190613cd7565b60405180910390f35b34801561047757600080fd5b50610480610e04565b60405161048d9190613efd565b60405180910390f35b3480156104a257600080fd5b506104bd60048036038101906104b89190613d2f565b610e0a565b6040516104d299989796959493929190613f18565b60405180910390f35b6104f560048036038101906104f091906143d6565b611320565b005b34801561050357600080fd5b5061050c6119f7565b60405161051991906144d4565b60405180910390f35b34801561052e57600080fd5b5061054960048036038101906105449190613d2f565b611a1d565b6040516105569190613d9d565b60405180910390f35b34801561056b57600080fd5b50610574611aa3565b6040516105819190613cd7565b60405180910390f35b34801561059657600080fd5b5061059f611abf565b6040516105ac9190613cd7565b60405180910390f35b3480156105c157600080fd5b506105ca611b4d565b6040516105d79190613cd7565b60405180910390f35b3480156105ec57600080fd5b50610607600480360381019061060291906144ef565b611b86565b6040516106149190613efd565b60405180910390f35b34801561062957600080fd5b50610632611c3d565b005b34801561064057600080fd5b50610649611c51565b6040516106569190613cd7565b60405180910390f35b34801561066b57600080fd5b506106866004803603810190610681919061451c565b611c6d565b005b34801561069457600080fd5b5061069d611c8f565b6040516106aa9190613cd7565b60405180910390f35b3480156106bf57600080fd5b506106c8611cab565b6040516106d59190613d9d565b60405180910390f35b3480156106ea57600080fd5b506106f3611cd5565b6040516107009190613cd7565b60405180910390f35b34801561071557600080fd5b5061071e611d63565b60405161072b9190613cd7565b60405180910390f35b34801561074057600080fd5b5061075b60048036038101906107569190614591565b611df5565b005b34801561076957600080fd5b50610784600480360381019061077f91906144ef565b611e0b565b005b34801561079257600080fd5b5061079b611e57565b6040516107a89190613cd7565b60405180910390f35b3480156107bd57600080fd5b506107d860048036038101906107d391906145d1565b611e73565b005b3480156107e657600080fd5b506107ef611ed5565b6040516107fc9190613cd7565b60405180910390f35b34801561081157600080fd5b5061082c60048036038101906108279190613d2f565b611ef1565b6040516108399190613e79565b60405180910390f35b34801561084e57600080fd5b506108696004803603810190610864919061451c565b612651565b6040516108769190613efd565b60405180910390f35b34801561088b57600080fd5b506108a660048036038101906108a19190613d2f565b61267f565b6040516108b39190613cd7565b60405180910390f35b3480156108c857600080fd5b506108d16127ea565b6040516108de9190613cd7565b60405180910390f35b3480156108f357600080fd5b5061090e60048036038101906109099190614654565b612806565b60405161091b9190613c23565b60405180910390f35b34801561093057600080fd5b5061094b600480360381019061094691906144ef565b61289a565b005b34801561095957600080fd5b5061096261291d565b60405161096f9190613cd7565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a4357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a535750610a5282612939565b5b9050919050565b606060008054610a69906146c3565b80601f0160208091040260200160405190810160405280929190818152602001828054610a95906146c3565b8015610ae25780601f10610ab757610100808354040283529160200191610ae2565b820191906000526020600020905b815481529060010190602001808311610ac557829003601f168201915b5050505050905090565b6000610af7826129a3565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b3d82611a1d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba490614766565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bcc6129ee565b73ffffffffffffffffffffffffffffffffffffffff161480610bfb5750610bfa81610bf56129ee565b612806565b5b610c3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c31906147f8565b60405180910390fd5b610c4483836129f6565b505050565b6060610c5482612aaf565b610c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8a90614864565b60405180910390fd5b610c9c82611ef1565b604051602001610cac91906149a4565b6040516020818303038152906040529050919050565b604051806060016040528060258152602001615cd56025913981565b610cef610ce96129ee565b82612af0565b610d2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2590614a43565b60405180910390fd5b610d39838383612b85565b505050565b604051806060016040528060258152602001615cb06025913981565b60405180610100016040528060dd8152602001615e8160dd913981565b610d7f612e7e565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610dc5573d6000803e3d6000fd5b50565b610de383838360405180602001604052806000815250611e73565b505050565b604051806060016040528060268152602001615e356026913981565b600b5481565b600e602052806000526040600020600091509050806000018054610e2d906146c3565b80601f0160208091040260200160405190810160405280929190818152602001828054610e59906146c3565b8015610ea65780601f10610e7b57610100808354040283529160200191610ea6565b820191906000526020600020905b815481529060010190602001808311610e8957829003601f168201915b505050505090806001018054610ebb906146c3565b80601f0160208091040260200160405190810160405280929190818152602001828054610ee7906146c3565b8015610f345780601f10610f0957610100808354040283529160200191610f34565b820191906000526020600020905b815481529060010190602001808311610f1757829003601f168201915b505050505090806002018054610f49906146c3565b80601f0160208091040260200160405190810160405280929190818152602001828054610f75906146c3565b8015610fc25780601f10610f9757610100808354040283529160200191610fc2565b820191906000526020600020905b815481529060010190602001808311610fa557829003601f168201915b505050505090806003018054610fd7906146c3565b80601f0160208091040260200160405190810160405280929190818152602001828054611003906146c3565b80156110505780601f1061102557610100808354040283529160200191611050565b820191906000526020600020905b81548152906001019060200180831161103357829003601f168201915b505050505090806004018054611065906146c3565b80601f0160208091040260200160405190810160405280929190818152602001828054611091906146c3565b80156110de5780601f106110b3576101008083540402835291602001916110de565b820191906000526020600020905b8154815290600101906020018083116110c157829003601f168201915b5050505050908060050180546110f3906146c3565b80601f016020809104026020016040519081016040528092919081815260200182805461111f906146c3565b801561116c5780601f106111415761010080835404028352916020019161116c565b820191906000526020600020905b81548152906001019060200180831161114f57829003601f168201915b505050505090806006018054611181906146c3565b80601f01602080910402602001604051908101604052809291908181526020018280546111ad906146c3565b80156111fa5780601f106111cf576101008083540402835291602001916111fa565b820191906000526020600020905b8154815290600101906020018083116111dd57829003601f168201915b50505050509080600701805461120f906146c3565b80601f016020809104026020016040519081016040528092919081815260200182805461123b906146c3565b80156112885780601f1061125d57610100808354040283529160200191611288565b820191906000526020600020905b81548152906001019060200180831161126b57829003601f168201915b50505050509080600801805461129d906146c3565b80601f01602080910402602001604051908101604052809291908181526020018280546112c9906146c3565b80156113165780601f106112eb57610100808354040283529160200191611316565b820191906000526020600020905b8154815290600101906020018083116112f957829003601f168201915b5050505050905089565b6000846000015185602001518660400151876060015188608001518960a001518a60c001518b60e001518c610100015160405160200161136899989796959493929190614a63565b60405160208183030381529060405290506000600d8260405161138b9190614ae2565b908152602001604051809103902054146113da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d190614b45565b60405180910390fd5b610200600b5410611420576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141790614bb1565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166397aba7f986866040518363ffffffff1660e01b81526004016114b6929190614be0565b602060405180830381865afa1580156114d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f79190614c25565b73ffffffffffffffffffffffffffffffffffffffff161461154d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154490614c9e565b60405180910390fd5b83600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631de810a1836040518263ffffffff1660e01b81526004016115a99190613cd7565b602060405180830381865afa1580156115c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ea9190614cd3565b1461162a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162190614d4c565b60405180910390fd5b3360405160200161163b9190614db4565b604051602081830303815290604052805190602001208214611692576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168990614e1b565b60405180910390fd5b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016116ef9190613d9d565b602060405180830381865afa15801561170c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117309190614e50565b111561178557662c68af0bb14000341015611780576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177790614ec9565b60405180910390fd5b6117d0565b6658d15e176280003410156117cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c690614ec9565b60405180910390fd5b5b600060405180610120016040528087600001518152602001876020015181526020018760400151815260200187606001518152602001876080015181526020018760a0015181526020018760c0015181526020018760e0015181526020018761010001518152509050600b600081548092919061184c90614f18565b9190505550600b54600d836040516118649190614ae2565b90815260200160405180910390208190555080600e6000600b54815260200190815260200160002060008201518160000190805190602001906118a8929190613acc565b5060208201518160010190805190602001906118c5929190613acc565b5060408201518160020190805190602001906118e2929190613acc565b5060608201518160030190805190602001906118ff929190613acc565b50608082015181600401908051906020019061191c929190613acc565b5060a0820151816005019080519060200190611939929190613acc565b5060c0820151816006019080519060200190611956929190613acc565b5060e0820151816007019080519060200190611973929190613acc565b50610100820151816008019080519060200190611991929190613acc565b5090505061199d611cab565b73ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156119e2573d6000803e3d6000fd5b506119ef33600b54612efc565b505050505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080611a2983612f1a565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9190614fac565b60405180910390fd5b80915050919050565b604051806060016040528060258152602001615e106025913981565b60088054611acc906146c3565b80601f0160208091040260200160405190810160405280929190818152602001828054611af8906146c3565b8015611b455780601f10611b1a57610100808354040283529160200191611b45565b820191906000526020600020905b815481529060010190602001808311611b2857829003601f168201915b505050505081565b6040518060400160405280600781526020017f506c7a2042726f0000000000000000000000000000000000000000000000000081525081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611bf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bed9061503e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611c45612e7e565b611c4f6000612f57565b565b604051806080016040528060458152602001615cfa6045913981565b611c75612e7e565b8060099080519060200190611c8b929190613acc565b5050565b604051806060016040528060268152602001615c646026913981565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60098054611ce2906146c3565b80601f0160208091040260200160405190810160405280929190818152602001828054611d0e906146c3565b8015611d5b5780601f10611d3057610100808354040283529160200191611d5b565b820191906000526020600020905b815481529060010190602001808311611d3e57829003601f168201915b505050505081565b606060018054611d72906146c3565b80601f0160208091040260200160405190810160405280929190818152602001828054611d9e906146c3565b8015611deb5780601f10611dc057610100808354040283529160200191611deb565b820191906000526020600020905b815481529060010190602001808311611dce57829003601f168201915b5050505050905090565b611e07611e006129ee565b838361301d565b5050565b611e13612e7e565b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b604051806060016040528060268152602001615c8a6026913981565b611e84611e7e6129ee565b83612af0565b611ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eba90614a43565b60405180910390fd5b611ecf84848484613189565b50505050565b604051806060016040528060268152602001615e5b6026913981565b6060611efc82612aaf565b611f3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3290614864565b60405180910390fd5b6000600e600084815260200190815260200160002060405180610120016040529081600082018054611f6c906146c3565b80601f0160208091040260200160405190810160405280929190818152602001828054611f98906146c3565b8015611fe55780601f10611fba57610100808354040283529160200191611fe5565b820191906000526020600020905b815481529060010190602001808311611fc857829003601f168201915b50505050508152602001600182018054611ffe906146c3565b80601f016020809104026020016040519081016040528092919081815260200182805461202a906146c3565b80156120775780601f1061204c57610100808354040283529160200191612077565b820191906000526020600020905b81548152906001019060200180831161205a57829003601f168201915b50505050508152602001600282018054612090906146c3565b80601f01602080910402602001604051908101604052809291908181526020018280546120bc906146c3565b80156121095780601f106120de57610100808354040283529160200191612109565b820191906000526020600020905b8154815290600101906020018083116120ec57829003601f168201915b50505050508152602001600382018054612122906146c3565b80601f016020809104026020016040519081016040528092919081815260200182805461214e906146c3565b801561219b5780601f106121705761010080835404028352916020019161219b565b820191906000526020600020905b81548152906001019060200180831161217e57829003601f168201915b505050505081526020016004820180546121b4906146c3565b80601f01602080910402602001604051908101604052809291908181526020018280546121e0906146c3565b801561222d5780601f106122025761010080835404028352916020019161222d565b820191906000526020600020905b81548152906001019060200180831161221057829003601f168201915b50505050508152602001600582018054612246906146c3565b80601f0160208091040260200160405190810160405280929190818152602001828054612272906146c3565b80156122bf5780601f10612294576101008083540402835291602001916122bf565b820191906000526020600020905b8154815290600101906020018083116122a257829003601f168201915b505050505081526020016006820180546122d8906146c3565b80601f0160208091040260200160405190810160405280929190818152602001828054612304906146c3565b80156123515780601f1061232657610100808354040283529160200191612351565b820191906000526020600020905b81548152906001019060200180831161233457829003601f168201915b5050505050815260200160078201805461236a906146c3565b80601f0160208091040260200160405190810160405280929190818152602001828054612396906146c3565b80156123e35780601f106123b8576101008083540402835291602001916123e3565b820191906000526020600020905b8154815290600101906020018083116123c657829003601f168201915b505050505081526020016008820180546123fc906146c3565b80601f0160208091040260200160405190810160405280929190818152602001828054612428906146c3565b80156124755780601f1061244a57610100808354040283529160200191612475565b820191906000526020600020905b81548152906001019060200180831161245857829003601f168201915b5050505050815250509050600060405180610100016040528060dd8152602001615e8160dd91398260000151604051806060016040528060258152602001615cb0602591398460200151604051806060016040528060258152602001615cd56025913986604001516040516020016124f29695949392919061505e565b60405160208183030381529060405290506000604051806060016040528060258152602001615e10602591398360600151604051806060016040528060268152602001615d3f602691398560800151604051806060016040528060268152602001615c64602691398760a001516040516020016125749695949392919061505e565b60405160208183030381529060405290506000604051806060016040528060268152602001615e35602691398460c00151604051806060016040528060268152602001615c8a602691398660e00151604051806060016040528060268152602001615e5b602691398861010001516040518060a00160405280606b8152602001615d65606b913960405160200161261197969594939291906150b6565b604051602081830303815290604052905082828260405160200161263793929190615157565b604051602081830303815290604052945050505050919050565b600d818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b606061268a82612aaf565b6126c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c090614864565b60405180910390fd5b60006126dc6126d784611ef1565b6131e5565b6040516020016126ec9190615246565b6040516020818303038152906040529050600061271061270b85610c49565b6131e5565b60405160200161272091906152e5565b604051602081830303815290604052905060006127be6040518060400160405280600781526020017f506c7a2042726f000000000000000000000000000000000000000000000000008152506127758761335d565b604051806080016040528060458152602001615cfa604591398686600860096040516020016127aa979695949392919061556e565b6040516020818303038152906040526131e5565b9050806040516020016127d19190615677565b6040516020818303038152906040529350505050919050565b604051806060016040528060268152602001615d3f6026913981565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6128a2612e7e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612911576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129089061570b565b60405180910390fd5b61291a81612f57565b50565b6040518060a00160405280606b8152602001615d65606b913981565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6129ac81612aaf565b6129eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e290614fac565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612a6983611a1d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008073ffffffffffffffffffffffffffffffffffffffff16612ad183612f1a565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600080612afc83611a1d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612b3e5750612b3d8185612806565b5b80612b7c57508373ffffffffffffffffffffffffffffffffffffffff16612b6484610aec565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612ba582611a1d565b73ffffffffffffffffffffffffffffffffffffffff1614612bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf29061579d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c619061582f565b60405180910390fd5b612c77838383600161342b565b8273ffffffffffffffffffffffffffffffffffffffff16612c9782611a1d565b73ffffffffffffffffffffffffffffffffffffffff1614612ced576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce49061579d565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e798383836001613551565b505050565b612e866129ee565b73ffffffffffffffffffffffffffffffffffffffff16612ea4611cab565b73ffffffffffffffffffffffffffffffffffffffff1614612efa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ef19061589b565b60405180910390fd5b565b612f16828260405180602001604052806000815250613557565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361308b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308290615907565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161317c9190613c23565b60405180910390a3505050565b613194848484612b85565b6131a0848484846135b2565b6131df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d690615999565b60405180910390fd5b50505050565b6060600082510361320757604051806020016040528060008152509050613358565b6000604051806060016040528060408152602001615dd0604091399050600060036002855161323691906159b9565b6132409190615a3e565b600461324c9190615a6f565b9050600060208261325d91906159b9565b67ffffffffffffffff81111561327657613275613fe9565b5b6040519080825280601f01601f1916602001820160405280156132a85781602001600182028036833780820191505090505b509050818152600183018586518101602084015b81831015613317576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f81168501518253600182019150506132bc565b60038951066001811461333157600281146133415761334c565b613d3d60f01b600283035261334c565b603d60f81b60018303525b50505050508093505050505b919050565b60606000600161336c84613739565b01905060008167ffffffffffffffff81111561338b5761338a613fe9565b5b6040519080825280601f01601f1916602001820160405280156133bd5781602001600182028036833780820191505090505b509050600082602001820190505b600115613420578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161341457613413615a0f565b5b049450600085036133cb575b819350505050919050565b600181111561354b57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146134bf5780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134b79190615ac9565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461354a5780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461354291906159b9565b925050819055505b5b50505050565b50505050565b613561838361388c565b61356e60008484846135b2565b6135ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135a490615999565b60405180910390fd5b505050565b60006135d38473ffffffffffffffffffffffffffffffffffffffff16613aa9565b1561372c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026135fc6129ee565b8786866040518563ffffffff1660e01b815260040161361e9493929190615afd565b6020604051808303816000875af192505050801561365a57506040513d601f19601f820116820180604052508101906136579190615b5e565b60015b6136dc573d806000811461368a576040519150601f19603f3d011682016040523d82523d6000602084013e61368f565b606091505b5060008151036136d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136cb90615999565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613731565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613797577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161378d5761378c615a0f565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106137d4576d04ee2d6d415b85acef810000000083816137ca576137c9615a0f565b5b0492506020810190505b662386f26fc10000831061380357662386f26fc1000083816137f9576137f8615a0f565b5b0492506010810190505b6305f5e100831061382c576305f5e100838161382257613821615a0f565b5b0492506008810190505b612710831061385157612710838161384757613846615a0f565b5b0492506004810190505b60648310613874576064838161386a57613869615a0f565b5b0492506002810190505b600a8310613883576001810190505b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036138fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138f290615bd7565b60405180910390fd5b61390481612aaf565b15613944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161393b90615c43565b60405180910390fd5b61395260008383600161342b565b61395b81612aaf565b1561399b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161399290615c43565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613aa5600083836001613551565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054613ad8906146c3565b90600052602060002090601f016020900481019282613afa5760008555613b41565b82601f10613b1357805160ff1916838001178555613b41565b82800160010185558215613b41579182015b82811115613b40578251825591602001919060010190613b25565b5b509050613b4e9190613b52565b5090565b5b80821115613b6b576000816000905550600101613b53565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613bb881613b83565b8114613bc357600080fd5b50565b600081359050613bd581613baf565b92915050565b600060208284031215613bf157613bf0613b79565b5b6000613bff84828501613bc6565b91505092915050565b60008115159050919050565b613c1d81613c08565b82525050565b6000602082019050613c386000830184613c14565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613c78578082015181840152602081019050613c5d565b83811115613c87576000848401525b50505050565b6000601f19601f8301169050919050565b6000613ca982613c3e565b613cb38185613c49565b9350613cc3818560208601613c5a565b613ccc81613c8d565b840191505092915050565b60006020820190508181036000830152613cf18184613c9e565b905092915050565b6000819050919050565b613d0c81613cf9565b8114613d1757600080fd5b50565b600081359050613d2981613d03565b92915050565b600060208284031215613d4557613d44613b79565b5b6000613d5384828501613d1a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613d8782613d5c565b9050919050565b613d9781613d7c565b82525050565b6000602082019050613db26000830184613d8e565b92915050565b613dc181613d7c565b8114613dcc57600080fd5b50565b600081359050613dde81613db8565b92915050565b60008060408385031215613dfb57613dfa613b79565b5b6000613e0985828601613dcf565b9250506020613e1a85828601613d1a565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000613e4b82613e24565b613e558185613e2f565b9350613e65818560208601613c5a565b613e6e81613c8d565b840191505092915050565b60006020820190508181036000830152613e938184613e40565b905092915050565b600080600060608486031215613eb457613eb3613b79565b5b6000613ec286828701613dcf565b9350506020613ed386828701613dcf565b9250506040613ee486828701613d1a565b9150509250925092565b613ef781613cf9565b82525050565b6000602082019050613f126000830184613eee565b92915050565b6000610120820190508181036000830152613f33818c613c9e565b90508181036020830152613f47818b613c9e565b90508181036040830152613f5b818a613c9e565b90508181036060830152613f6f8189613c9e565b90508181036080830152613f838188613c9e565b905081810360a0830152613f978187613c9e565b905081810360c0830152613fab8186613c9e565b905081810360e0830152613fbf8185613c9e565b9050818103610100830152613fd48184613c9e565b90509a9950505050505050505050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61402182613c8d565b810181811067ffffffffffffffff821117156140405761403f613fe9565b5b80604052505050565b6000614053613b6f565b905061405f8282614018565b919050565b600080fd5b600080fd5b600080fd5b600067ffffffffffffffff82111561408e5761408d613fe9565b5b61409782613c8d565b9050602081019050919050565b82818337600083830152505050565b60006140c66140c184614073565b614049565b9050828152602081018484840111156140e2576140e161406e565b5b6140ed8482856140a4565b509392505050565b600082601f83011261410a57614109614069565b5b813561411a8482602086016140b3565b91505092915050565b6000610120828403121561413a57614139613fe4565b5b614145610120614049565b9050600082013567ffffffffffffffff81111561416557614164614064565b5b614171848285016140f5565b600083015250602082013567ffffffffffffffff81111561419557614194614064565b5b6141a1848285016140f5565b602083015250604082013567ffffffffffffffff8111156141c5576141c4614064565b5b6141d1848285016140f5565b604083015250606082013567ffffffffffffffff8111156141f5576141f4614064565b5b614201848285016140f5565b606083015250608082013567ffffffffffffffff81111561422557614224614064565b5b614231848285016140f5565b60808301525060a082013567ffffffffffffffff81111561425557614254614064565b5b614261848285016140f5565b60a08301525060c082013567ffffffffffffffff81111561428557614284614064565b5b614291848285016140f5565b60c08301525060e082013567ffffffffffffffff8111156142b5576142b4614064565b5b6142c1848285016140f5565b60e08301525061010082013567ffffffffffffffff8111156142e6576142e5614064565b5b6142f2848285016140f5565b6101008301525092915050565b6000819050919050565b614312816142ff565b811461431d57600080fd5b50565b60008135905061432f81614309565b92915050565b600067ffffffffffffffff8211156143505761434f613fe9565b5b61435982613c8d565b9050602081019050919050565b600061437961437484614335565b614049565b9050828152602081018484840111156143955761439461406e565b5b6143a08482856140a4565b509392505050565b600082601f8301126143bd576143bc614069565b5b81356143cd848260208601614366565b91505092915050565b600080600080608085870312156143f0576143ef613b79565b5b600085013567ffffffffffffffff81111561440e5761440d613b7e565b5b61441a87828801614123565b945050602061442b87828801614320565b935050604085013567ffffffffffffffff81111561444c5761444b613b7e565b5b614458878288016143a8565b925050606061446987828801614320565b91505092959194509250565b6000819050919050565b600061449a61449561449084613d5c565b614475565b613d5c565b9050919050565b60006144ac8261447f565b9050919050565b60006144be826144a1565b9050919050565b6144ce816144b3565b82525050565b60006020820190506144e960008301846144c5565b92915050565b60006020828403121561450557614504613b79565b5b600061451384828501613dcf565b91505092915050565b60006020828403121561453257614531613b79565b5b600082013567ffffffffffffffff8111156145505761454f613b7e565b5b61455c848285016140f5565b91505092915050565b61456e81613c08565b811461457957600080fd5b50565b60008135905061458b81614565565b92915050565b600080604083850312156145a8576145a7613b79565b5b60006145b685828601613dcf565b92505060206145c78582860161457c565b9150509250929050565b600080600080608085870312156145eb576145ea613b79565b5b60006145f987828801613dcf565b945050602061460a87828801613dcf565b935050604061461b87828801613d1a565b925050606085013567ffffffffffffffff81111561463c5761463b613b7e565b5b614648878288016143a8565b91505092959194509250565b6000806040838503121561466b5761466a613b79565b5b600061467985828601613dcf565b925050602061468a85828601613dcf565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806146db57607f821691505b6020821081036146ee576146ed614694565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614750602183613c49565b915061475b826146f4565b604082019050919050565b6000602082019050818103600083015261477f81614743565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b60006147e2603d83613c49565b91506147ed82614786565b604082019050919050565b60006020820190508181036000830152614811816147d5565b9050919050565b7f546f6b656e20646f65736e27742065786973742e000000000000000000000000600082015250565b600061484e601483613c49565b915061485982614818565b602082019050919050565b6000602082019050818103600083015261487d81614841565b9050919050565b600081905092915050565b7f3c21444f43545950452068746d6c3e3c68746d6c3e3c686561643e3c7374796c60008201527f653e2a7b6d617267696e3a303b70616464696e673a307d3c2f7374796c653e3c60208201527f2f686561643e3c626f64793e0000000000000000000000000000000000000000604082015250565b6000614911604c83614884565b915061491c8261488f565b604c82019050919050565b600061493282613c3e565b61493c8185614884565b935061494c818560208601613c5a565b80840191505092915050565b7f3c2f626f64793e3c2f68746d6c3e000000000000000000000000000000000000600082015250565b600061498e600e83614884565b915061499982614958565b600e82019050919050565b60006149af82614904565b91506149bb8284614927565b91506149c682614981565b915081905092915050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000614a2d602d83613c49565b9150614a38826149d1565b604082019050919050565b60006020820190508181036000830152614a5c81614a20565b9050919050565b6000614a6f828c614927565b9150614a7b828b614927565b9150614a87828a614927565b9150614a938289614927565b9150614a9f8288614927565b9150614aab8287614927565b9150614ab78286614927565b9150614ac38285614927565b9150614acf8284614927565b91508190509a9950505050505050505050565b6000614aee8284614927565b915081905092915050565b7f506f656d20616c726561647920636c61696d65642e0000000000000000000000600082015250565b6000614b2f601583613c49565b9150614b3a82614af9565b602082019050919050565b60006020820190508181036000830152614b5e81614b22565b9050919050565b7f416c6c206f75742e000000000000000000000000000000000000000000000000600082015250565b6000614b9b600883613c49565b9150614ba682614b65565b602082019050919050565b60006020820190508181036000830152614bca81614b8e565b9050919050565b614bda816142ff565b82525050565b6000604082019050614bf56000830185614bd1565b8181036020830152614c078184613e40565b90509392505050565b600081519050614c1f81613db8565b92915050565b600060208284031215614c3b57614c3a613b79565b5b6000614c4984828501614c10565b91505092915050565b7f496e76616c6964207369676e61747572652e0000000000000000000000000000600082015250565b6000614c88601283613c49565b9150614c9382614c52565b602082019050919050565b60006020820190508181036000830152614cb781614c7b565b9050919050565b600081519050614ccd81614309565b92915050565b600060208284031215614ce957614ce8613b79565b5b6000614cf784828501614cbe565b91505092915050565b7f4861736820616e6420706f656d20646f6e2774206d617463682e000000000000600082015250565b6000614d36601a83613c49565b9150614d4182614d00565b602082019050919050565b60006020820190508181036000830152614d6581614d29565b9050919050565b60008160601b9050919050565b6000614d8482614d6c565b9050919050565b6000614d9682614d79565b9050919050565b614dae614da982613d7c565b614d8b565b82525050565b6000614dc08284614d9d565b60148201915081905092915050565b7f4d616769633f0000000000000000000000000000000000000000000000000000600082015250565b6000614e05600683613c49565b9150614e1082614dcf565b602082019050919050565b60006020820190508181036000830152614e3481614df8565b9050919050565b600081519050614e4a81613d03565b92915050565b600060208284031215614e6657614e65613b79565b5b6000614e7484828501614e3b565b91505092915050565b7f4e6f7420656e6f756768204554482e0000000000000000000000000000000000600082015250565b6000614eb3600f83613c49565b9150614ebe82614e7d565b602082019050919050565b60006020820190508181036000830152614ee281614ea6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614f2382613cf9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614f5557614f54614ee9565b5b600182019050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000614f96601883613c49565b9150614fa182614f60565b602082019050919050565b60006020820190508181036000830152614fc581614f89565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000615028602983613c49565b915061503382614fcc565b604082019050919050565b600060208201905081810360008301526150578161501b565b9050919050565b600061506a8289614927565b91506150768288614927565b91506150828287614927565b915061508e8286614927565b915061509a8285614927565b91506150a68284614927565b9150819050979650505050505050565b60006150c2828a614927565b91506150ce8289614927565b91506150da8288614927565b91506150e68287614927565b91506150f28286614927565b91506150fe8285614927565b915061510a8284614927565b915081905098975050505050505050565b600081905092915050565b600061513182613e24565b61513b818561511b565b935061514b818560208601613c5a565b80840191505092915050565b60006151638286615126565b915061516f8285615126565b915061517b8284615126565b9150819050949350505050565b7f22696d616765223a2022646174613a696d6167652f7376672b786d6c3b62617360008201527f6536342c00000000000000000000000000000000000000000000000000000000602082015250565b60006151e4602483614884565b91506151ef82615188565b602482019050919050565b7f222c000000000000000000000000000000000000000000000000000000000000600082015250565b6000615230600283614884565b915061523b826151fa565b600282019050919050565b6000615251826151d7565b915061525d8284614927565b915061526882615223565b915081905092915050565b7f22616e696d6174696f6e5f75726c223a2022646174613a746578742f68746d6c60008201527f3b6261736536342c000000000000000000000000000000000000000000000000602082015250565b60006152cf602883614884565b91506152da82615273565b602882019050919050565b60006152f0826152c2565b91506152fc8284614927565b915061530782615223565b915081905092915050565b7f7b226e616d65223a202200000000000000000000000000000000000000000000600082015250565b6000615348600a83614884565b915061535382615312565b600a82019050919050565b7f2023000000000000000000000000000000000000000000000000000000000000600082015250565b6000615394600283614884565b915061539f8261535e565b600282019050919050565b7f226465736372697074696f6e223a202200000000000000000000000000000000600082015250565b60006153e0601083614884565b91506153eb826153aa565b601082019050919050565b7f226c6963656e7365223a20220000000000000000000000000000000000000000600082015250565b600061542c600c83614884565b9150615437826153f6565b600c82019050919050565b60008190508160005260206000209050919050565b60008154615464816146c3565b61546e8186614884565b94506001821660008114615489576001811461549a576154cd565b60ff198316865281860193506154cd565b6154a385615442565b60005b838110156154c5578154818901526001820191506020810190506154a6565b838801955050505b50505092915050565b7f222c2265787465726e616c5f75726c223a202200000000000000000000000000600082015250565b600061550c601383614884565b9150615517826154d6565b601382019050919050565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b6000615558600283614884565b915061556382615522565b600282019050919050565b60006155798261533b565b9150615585828a614927565b915061559082615387565b915061559c8289614927565b91506155a782615223565b91506155b2826153d3565b91506155be8288614927565b91506155c982615223565b91506155d58287615126565b91506155e18286615126565b91506155ec8261541f565b91506155f88285615457565b9150615603826154ff565b915061560f8284615457565b915061561a8261554b565b915081905098975050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b6000615661601d83614884565b915061566c8261562b565b601d82019050919050565b600061568282615654565b915061568e8284614927565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006156f5602683613c49565b915061570082615699565b604082019050919050565b60006020820190508181036000830152615724816156e8565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000615787602583613c49565b91506157928261572b565b604082019050919050565b600060208201905081810360008301526157b68161577a565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615819602483613c49565b9150615824826157bd565b604082019050919050565b600060208201905081810360008301526158488161580c565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615885602083613c49565b91506158908261584f565b602082019050919050565b600060208201905081810360008301526158b481615878565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006158f1601983613c49565b91506158fc826158bb565b602082019050919050565b60006020820190508181036000830152615920816158e4565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615983603283613c49565b915061598e82615927565b604082019050919050565b600060208201905081810360008301526159b281615976565b9050919050565b60006159c482613cf9565b91506159cf83613cf9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615a0457615a03614ee9565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615a4982613cf9565b9150615a5483613cf9565b925082615a6457615a63615a0f565b5b828204905092915050565b6000615a7a82613cf9565b9150615a8583613cf9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615abe57615abd614ee9565b5b828202905092915050565b6000615ad482613cf9565b9150615adf83613cf9565b925082821015615af257615af1614ee9565b5b828203905092915050565b6000608082019050615b126000830187613d8e565b615b1f6020830186613d8e565b615b2c6040830185613eee565b8181036060830152615b3e8184613e40565b905095945050505050565b600081519050615b5881613baf565b92915050565b600060208284031215615b7457615b73613b79565b5b6000615b8284828501615b49565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615bc1602083613c49565b9150615bcc82615b8b565b602082019050919050565b60006020820190508181036000830152615bf081615bb4565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615c2d601c83613c49565b9150615c3882615bf7565b602082019050919050565b60006020820190508181036000830152615c5c81615c20565b905091905056fe3c2f746578743e3c7465787420783d2231302220793d223132352220636c6173733d2268223e3c2f746578743e3c7465787420783d2231302220793d223136352220636c6173733d2268223e3c2f746578743e3c7465787420783d2231302220793d2234352220636c6173733d2268223e3c2f746578743e3c7465787420783d2231302220793d2236352220636c6173733d2268223e506f656d732067656e6572617465642066726f6d20534d5320726563656976656420647572696e6720746865206d696e74696e67206f66204861636b6572204861696b752e3c2f746578743e3c7465787420783d2231302220793d223130352220636c6173733d2268223e3c2f746578743e3c7265637420783d2233252220793d223325222077696474683d2239342522206865696768743d22393425222066696c6c3d226e6f6e6522207374726f6b653d222330356632323822207374726f6b652d77696474683d222e3525222f3e3c2f7376673e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d2238352220636c6173733d2268223e3c2f746578743e3c7465787420783d2231302220793d223134352220636c6173733d2268223e3c2f746578743e3c7465787420783d2231302220793d223138352220636c6173733d2268223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737667222076696577426f783d223020302032303020323030223e3c7374796c653e2e687b666f6e742d66616d696c793a20436f7572696572204e65773b666f6e742d73697a653a323070783b66696c6c3a233035663232383b7d3c2f7374796c653e3c7265637420783d22302220793d2230222077696474683d2232303022206865696768743d22323030222066696c6c3d22626c61636b222f3e3c7465787420783d2231302220793d2232352220636c6173733d2268223ea26469706673582212202e413854b5e107ee77dba41575a1d6a3bb573dddbace0ec66bf9db1c1cd62d3264736f6c634300080d0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000b762f00e5ea9796b0c1e4c0a812a8253615b83c50000000000000000000000000b77583d36ee81fdf1b1504d6d7554cd89063101

-----Decoded View---------------
Arg [0] : _signer (address): 0xb762f00e5EA9796B0C1E4c0a812A8253615B83c5
Arg [1] : hackerHaikuContract (address): 0x0b77583D36eE81fdF1B1504d6d7554cd89063101

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000b762f00e5ea9796b0c1e4c0a812a8253615b83c5
Arg [1] : 0000000000000000000000000b77583d36ee81fdf1b1504d6d7554cd89063101


Deployed Bytecode Sourcemap

63705:6599:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47692:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48620:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50132:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49650:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69797:349;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64188:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50832:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64104:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63836:261;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70192:109;;;;;;;;;;;;;:::i;:::-;;51238:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64530:80;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65530:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65622:35;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;65848:1767;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65224:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48330:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64274:78;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65110:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65059:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48061:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27123:103;;;;;;;;;;;;;:::i;:::-;;64944:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67730:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64445:78;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26475:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65155:60;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48789:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50375:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67623:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64617:80;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51494:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64704:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68784:1005;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65579:36;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67863:913;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64359:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50601:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27381:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64790:147;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47692:305;47794:4;47846:25;47831:40;;;:11;:40;;;;:105;;;;47903:33;47888:48;;;:11;:48;;;;47831:105;:158;;;;47953:36;47977:11;47953:23;:36::i;:::-;47831:158;47811:178;;47692:305;;;:::o;48620:100::-;48674:13;48707:5;48700:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48620:100;:::o;50132:171::-;50208:7;50228:23;50243:7;50228:14;:23::i;:::-;50271:15;:24;50287:7;50271:24;;;;;;;;;;;;;;;;;;;;;50264:31;;50132:171;;;:::o;49650:416::-;49731:13;49747:23;49762:7;49747:14;:23::i;:::-;49731:39;;49795:5;49789:11;;:2;:11;;;49781:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;49889:5;49873:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;49898:37;49915:5;49922:12;:10;:12::i;:::-;49898:16;:37::i;:::-;49873:62;49851:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;50037:21;50046:2;50050:7;50037:8;:21::i;:::-;49720:346;49650:416;;:::o;69797:349::-;69853:12;69886:17;69894:8;69886:7;:17::i;:::-;69878:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;70079:16;70086:8;70079:6;:16::i;:::-;69948:190;;;;;;;;:::i;:::-;;;;;;;;;;;;;69941:197;;69797:349;;;:::o;64188:79::-;;;;;;;;;;;;;;;;;;;:::o;50832:335::-;51027:41;51046:12;:10;:12::i;:::-;51060:7;51027:18;:41::i;:::-;51019:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;51131:28;51141:4;51147:2;51151:7;51131:9;:28::i;:::-;50832:335;;;:::o;64104:77::-;;;;;;;;;;;;;;;;;;;:::o;63836:261::-;;;;;;;;;;;;;;;;;;;:::o;70192:109::-;26361:13;:11;:13::i;:::-;70250:10:::1;70242:28;;:51;70271:21;70242:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;70192:109::o:0;51238:185::-;51376:39;51393:4;51399:2;51403:7;51376:39;;;;;;;;;;;;:16;:39::i;:::-;51238:185;;;:::o;64530:80::-;;;;;;;;;;;;;;;;;;;:::o;65530:19::-;;;;:::o;65622:35::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;65848:1767::-;66030:22;66097:5;:11;;;66127:5;:11;;;66157:5;:11;;;66187:5;:11;;;66217:5;:11;;;66247:5;:11;;;66277:5;:11;;;66307:5;:11;;;66337:5;:11;;;66062:321;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66030:354;;66426:1;66407:5;66413:8;66407:15;;;;;;:::i;:::-;;;;;;;;;;;;;;:20;66399:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;66486:3;66476:7;;:13;66468:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;66593:6;;;;;;;;;;;66525:74;;:15;;;;;;;;;;;:29;;;66555:21;66578:10;66525:64;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:74;;;66517:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;66703:21;66645:15;;;;;;;;;;;:44;;;66690:8;66645:54;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:79;66637:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;66814:10;66797:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;66787:39;;;;;;66778:5;:48;66770:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;66892:1;66856:11;;;;;;;;;;;:21;;;66878:10;66856:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;66852:224;;;66935:12;66922:9;:25;;66914:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;66852:224;;;67029:11;67016:9;:24;;67008:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;66852:224;67092:16;67111:295;;;;;;;;67134:5;:11;;;67111:295;;;;67164:5;:11;;;67111:295;;;;67194:5;:11;;;67111:295;;;;67224:5;:11;;;67111:295;;;;67254:5;:11;;;67111:295;;;;67284:5;:11;;;67111:295;;;;67314:5;:11;;;67111:295;;;;67344:5;:11;;;67111:295;;;;67374:5;:11;;;67111:295;;;67092:314;;67423:7;;:9;;;;;;;;;:::i;:::-;;;;;;67465:7;;67447:5;67453:8;67447:15;;;;;;:::i;:::-;;;;;;;;;;;;;:25;;;;67505:4;67487:6;:15;67494:7;;67487:15;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;67532:7;:5;:7::i;:::-;67524:25;;:36;67550:9;67524:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67575:30;67585:10;67597:7;;67575:9;:30::i;:::-;66015:1600;;65848:1767;;;;:::o;65224:62::-;;;;;;;;;;;;;:::o;48330:223::-;48402:7;48422:13;48438:17;48447:7;48438:8;:17::i;:::-;48422:33;;48491:1;48474:19;;:5;:19;;;48466:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;48540:5;48533:12;;;48330:223;;;:::o;64274:78::-;;;;;;;;;;;;;;;;;;;:::o;65110:38::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;65059:44::-;;;;;;;;;;;;;;;;;;;:::o;48061:207::-;48133:7;48178:1;48161:19;;:5;:19;;;48153:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;48244:9;:16;48254:5;48244:16;;;;;;;;;;;;;;;;48237:23;;48061:207;;;:::o;27123:103::-;26361:13;:11;:13::i;:::-;27188:30:::1;27215:1;27188:18;:30::i;:::-;27123:103::o:0;64944:108::-;;;;;;;;;;;;;;;;;;;:::o;67730:125::-;26361:13;:11;:13::i;:::-;67832:15:::1;67818:11;:29;;;;;;;;;;;;:::i;:::-;;67730:125:::0;:::o;64445:78::-;;;;;;;;;;;;;;;;;;;:::o;26475:87::-;26521:7;26548:6;;;;;;;;;;;26541:13;;26475:87;:::o;65155:60::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48789:104::-;48845:13;48878:7;48871:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48789:104;:::o;50375:155::-;50470:52;50489:12;:10;:12::i;:::-;50503:8;50513;50470:18;:52::i;:::-;50375:155;;:::o;67623:99::-;26361:13;:11;:13::i;:::-;67704:10:::1;67695:6;;:19;;;;;;;;;;;;;;;;;;67623:99:::0;:::o;64617:80::-;;;;;;;;;;;;;;;;;;;:::o;51494:322::-;51668:41;51687:12;:10;:12::i;:::-;51701:7;51668:18;:41::i;:::-;51660:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;51770:38;51784:4;51790:2;51794:7;51803:4;51770:13;:38::i;:::-;51494:322;;;;:::o;64704:79::-;;;;;;;;;;;;;;;;;;;:::o;68784:1005::-;68839:12;68872:17;68880:8;68872:7;:17::i;:::-;68864:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;68927:16;68946:6;:16;68953:8;68946:16;;;;;;;;;;;68927:35;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68975:18;69027:12;;;;;;;;;;;;;;;;;69055:4;:10;;;69080:12;;;;;;;;;;;;;;;;;69107:4;:10;;;69132:14;;;;;;;;;;;;;;;;;69161:4;:10;;;68996:190;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;68975:211;;69199:18;69251:13;;;;;;;;;;;;;;;;;69279:4;:10;;;69304:13;;;;;;;;;;;;;;;;;69332:4;:10;;;69357:12;;;;;;;;;;;;;;;;;69384:4;:10;;;69220:189;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69199:210;;69422:18;69474:14;;;;;;;;;;;;;;;;;69503:4;:10;;;69528:14;;;;;;;;;;;;;;;;;69557:4;:10;;;69582:13;;;;;;;;;;;;;;;;;69610:4;:10;;;69635:12;;;;;;;;;;;;;;;;;69443:219;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69422:240;;69721:5;69741;69761;69690:91;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69683:98;;;;;;68784:1005;;;:::o;65579:36::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;67863:913::-;67937:13;67971:17;67979:8;67971:7;:17::i;:::-;67963:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;68034:25;68119:31;68133:16;68140:8;68133:6;:16::i;:::-;68119:13;:31::i;:::-;68062:95;;;;;;;;:::i;:::-;;;;;;;;;;;;;68034:123;;68168:24;68256:32;68270:17;68278:8;68270:7;:17::i;:::-;68256:13;:32::i;:::-;68195:100;;;;;;;;:::i;:::-;;;;;;;;;;;;;68168:127;;68308:18;68329:358;68400:9;;;;;;;;;;;;;;;;;68417:26;68434:8;68417:16;:26::i;:::-;68484:11;;;;;;;;;;;;;;;;;68516:12;68543:11;68585:7;68633:11;68355:321;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;68329:13;:358::i;:::-;68308:379;;68762:4;68712:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;68698:70;;;;;67863:913;;;:::o;64359:79::-;;;;;;;;;;;;;;;;;;;:::o;50601:164::-;50698:4;50722:18;:25;50741:5;50722:25;;;;;;;;;;;;;;;:35;50748:8;50722:35;;;;;;;;;;;;;;;;;;;;;;;;;50715:42;;50601:164;;;;:::o;27381:201::-;26361:13;:11;:13::i;:::-;27490:1:::1;27470:22;;:8;:22;;::::0;27462:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;27546:28;27565:8;27546:18;:28::i;:::-;27381:201:::0;:::o;64790:147::-;;;;;;;;;;;;;;;;;;;:::o;40204:157::-;40289:4;40328:25;40313:40;;;:11;:40;;;;40306:47;;40204:157;;;:::o;59951:135::-;60033:16;60041:7;60033;:16::i;:::-;60025:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;59951:135;:::o;25026:98::-;25079:7;25106:10;25099:17;;25026:98;:::o;59230:174::-;59332:2;59305:15;:24;59321:7;59305:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;59388:7;59384:2;59350:46;;59359:23;59374:7;59359:14;:23::i;:::-;59350:46;;;;;;;;;;;;59230:174;;:::o;53554:128::-;53619:4;53672:1;53643:31;;:17;53652:7;53643:8;:17::i;:::-;:31;;;;53636:38;;53554:128;;;:::o;53849:264::-;53942:4;53959:13;53975:23;53990:7;53975:14;:23::i;:::-;53959:39;;54028:5;54017:16;;:7;:16;;;:52;;;;54037:32;54054:5;54061:7;54037:16;:32::i;:::-;54017:52;:87;;;;54097:7;54073:31;;:20;54085:7;54073:11;:20::i;:::-;:31;;;54017:87;54009:96;;;53849:264;;;;:::o;57848:1263::-;58007:4;57980:31;;:23;57995:7;57980:14;:23::i;:::-;:31;;;57972:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;58086:1;58072:16;;:2;:16;;;58064:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;58142:42;58163:4;58169:2;58173:7;58182:1;58142:20;:42::i;:::-;58314:4;58287:31;;:23;58302:7;58287:14;:23::i;:::-;:31;;;58279:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;58432:15;:24;58448:7;58432:24;;;;;;;;;;;;58425:31;;;;;;;;;;;58927:1;58908:9;:15;58918:4;58908:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;58960:1;58943:9;:13;58953:2;58943:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;59002:2;58983:7;:16;58991:7;58983:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;59041:7;59037:2;59022:27;;59031:4;59022:27;;;;;;;;;;;;59062:41;59082:4;59088:2;59092:7;59101:1;59062:19;:41::i;:::-;57848:1263;;;:::o;26640:132::-;26715:12;:10;:12::i;:::-;26704:23;;:7;:5;:7::i;:::-;:23;;;26696:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26640:132::o;54455:110::-;54531:26;54541:2;54545:7;54531:26;;;;;;;;;;;;:9;:26::i;:::-;54455:110;;:::o;53124:117::-;53190:7;53217;:16;53225:7;53217:16;;;;;;;;;;;;;;;;;;;;;53210:23;;53124:117;;;:::o;27742:191::-;27816:16;27835:6;;;;;;;;;;;27816:25;;27861:8;27852:6;;:17;;;;;;;;;;;;;;;;;;27916:8;27885:40;;27906:8;27885:40;;;;;;;;;;;;27805:128;27742:191;:::o;59547:315::-;59702:8;59693:17;;:5;:17;;;59685:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;59789:8;59751:18;:25;59770:5;59751:25;;;;;;;;;;;;;;;:35;59777:8;59751:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;59835:8;59813:41;;59828:5;59813:41;;;59845:8;59813:41;;;;;;:::i;:::-;;;;;;;;59547:315;;;:::o;52697:313::-;52853:28;52863:4;52869:2;52873:7;52853:9;:28::i;:::-;52900:47;52923:4;52929:2;52933:7;52942:4;52900:22;:47::i;:::-;52892:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;52697:313;;;;:::o;783:1912::-;841:13;886:1;871:4;:11;:16;867:31;;889:9;;;;;;;;;;;;;;;;867:31;950:19;972:12;;;;;;;;;;;;;;;;;950:34;;1036:18;1082:1;1077;1063:4;:11;:15;;;;:::i;:::-;1062:21;;;;:::i;:::-;1057:1;:27;;;;:::i;:::-;1036:48;;1167:20;1214:2;1201:10;:15;;;;:::i;:::-;1190:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1167:50;;1314:10;1306:6;1299:26;1409:1;1402:5;1398:13;1468:4;1519;1513:11;1504:7;1500:25;1615:2;1607:6;1603:15;1688:754;1707:6;1698:7;1695:19;1688:754;;;1807:1;1798:7;1794:15;1783:26;;1846:7;1840:14;1972:4;1964:5;1960:2;1956:14;1952:25;1942:8;1938:40;1932:47;1921:9;1913:67;2026:1;2015:9;2011:17;1998:30;;2105:4;2097:5;2093:2;2089:14;2085:25;2075:8;2071:40;2065:47;2054:9;2046:67;2159:1;2148:9;2144:17;2131:30;;2238:4;2230:5;2227:1;2222:14;2218:25;2208:8;2204:40;2198:47;2187:9;2179:67;2292:1;2281:9;2277:17;2264:30;;2371:4;2363:5;2351:25;2341:8;2337:40;2331:47;2320:9;2312:67;2425:1;2414:9;2410:17;2397:30;;1731:711;1688:754;;;2515:1;2508:4;2502:11;2498:19;2536:1;2531:54;;;;2604:1;2599:52;;;;2491:160;;2531:54;2575:6;2570:3;2566:16;2562:1;2551:9;2547:17;2540:43;2531:54;;2599:52;2643:4;2638:3;2634:14;2630:1;2619:9;2615:17;2608:41;2491:160;;1239:1423;;;;2681:6;2674:13;;;;;783:1912;;;;:::o;18252:716::-;18308:13;18359:14;18396:1;18376:17;18387:5;18376:10;:17::i;:::-;:21;18359:38;;18412:20;18446:6;18435:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18412:41;;18468:11;18597:6;18593:2;18589:15;18581:6;18577:28;18570:35;;18634:288;18641:4;18634:288;;;18666:5;;;;;;;;18808:8;18803:2;18796:5;18792:14;18787:30;18782:3;18774:44;18864:2;18855:11;;;;;;:::i;:::-;;;;;18898:1;18889:5;:10;18634:288;18885:21;18634:288;18943:6;18936:13;;;;;18252:716;;;:::o;62235:410::-;62425:1;62413:9;:13;62409:229;;;62463:1;62447:18;;:4;:18;;;62443:87;;62505:9;62486;:15;62496:4;62486:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;62443:87;62562:1;62548:16;;:2;:16;;;62544:83;;62602:9;62585;:13;62595:2;62585:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;62544:83;62409:229;62235:410;;;;:::o;63367:158::-;;;;;:::o;54792:319::-;54921:18;54927:2;54931:7;54921:5;:18::i;:::-;54972:53;55003:1;55007:2;55011:7;55020:4;54972:22;:53::i;:::-;54950:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;54792:319;;;:::o;60650:853::-;60804:4;60825:15;:2;:13;;;:15::i;:::-;60821:675;;;60877:2;60861:36;;;60898:12;:10;:12::i;:::-;60912:4;60918:7;60927:4;60861:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;60857:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61119:1;61102:6;:13;:18;61098:328;;61145:60;;;;;;;;;;:::i;:::-;;;;;;;;61098:328;61376:6;61370:13;61361:6;61357:2;61353:15;61346:38;60857:584;60993:41;;;60983:51;;;:6;:51;;;;60976:58;;;;;60821:675;61480:4;61473:11;;60650:853;;;;;;;:::o;15118:922::-;15171:7;15191:14;15208:1;15191:18;;15258:6;15249:5;:15;15245:102;;15294:6;15285:15;;;;;;:::i;:::-;;;;;15329:2;15319:12;;;;15245:102;15374:6;15365:5;:15;15361:102;;15410:6;15401:15;;;;;;:::i;:::-;;;;;15445:2;15435:12;;;;15361:102;15490:6;15481:5;:15;15477:102;;15526:6;15517:15;;;;;;:::i;:::-;;;;;15561:2;15551:12;;;;15477:102;15606:5;15597;:14;15593:99;;15641:5;15632:14;;;;;;:::i;:::-;;;;;15675:1;15665:11;;;;15593:99;15719:5;15710;:14;15706:99;;15754:5;15745:14;;;;;;:::i;:::-;;;;;15788:1;15778:11;;;;15706:99;15832:5;15823;:14;15819:99;;15867:5;15858:14;;;;;;:::i;:::-;;;;;15901:1;15891:11;;;;15819:99;15945:5;15936;:14;15932:66;;15981:1;15971:11;;;;15932:66;16026:6;16019:13;;;15118:922;;;:::o;55447:942::-;55541:1;55527:16;;:2;:16;;;55519:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;55600:16;55608:7;55600;:16::i;:::-;55599:17;55591:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;55662:48;55691:1;55695:2;55699:7;55708:1;55662:20;:48::i;:::-;55809:16;55817:7;55809;:16::i;:::-;55808:17;55800:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;56224:1;56207:9;:13;56217:2;56207:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;56268:2;56249:7;:16;56257:7;56249:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;56313:7;56309:2;56288:33;;56305:1;56288:33;;;;;;;;;;;;56334:47;56362:1;56366:2;56370:7;56379:1;56334:19;:47::i;:::-;55447:942;;:::o;29173:326::-;29233:4;29490:1;29468:7;:19;;;:23;29461:30;;29173:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:98::-;4989:6;5023:5;5017:12;5007:22;;4938:98;;;:::o;5042:168::-;5125:11;5159:6;5154:3;5147:19;5199:4;5194:3;5190:14;5175:29;;5042:168;;;;:::o;5216:360::-;5302:3;5330:38;5362:5;5330:38;:::i;:::-;5384:70;5447:6;5442:3;5384:70;:::i;:::-;5377:77;;5463:52;5508:6;5503:3;5496:4;5489:5;5485:16;5463:52;:::i;:::-;5540:29;5562:6;5540:29;:::i;:::-;5535:3;5531:39;5524:46;;5306:270;5216:360;;;;:::o;5582:309::-;5693:4;5731:2;5720:9;5716:18;5708:26;;5780:9;5774:4;5770:20;5766:1;5755:9;5751:17;5744:47;5808:76;5879:4;5870:6;5808:76;:::i;:::-;5800:84;;5582:309;;;;:::o;5897:619::-;5974:6;5982;5990;6039:2;6027:9;6018:7;6014:23;6010:32;6007:119;;;6045:79;;:::i;:::-;6007:119;6165:1;6190:53;6235:7;6226:6;6215:9;6211:22;6190:53;:::i;:::-;6180:63;;6136:117;6292:2;6318:53;6363:7;6354:6;6343:9;6339:22;6318:53;:::i;:::-;6308:63;;6263:118;6420:2;6446:53;6491:7;6482:6;6471:9;6467:22;6446:53;:::i;:::-;6436:63;;6391:118;5897:619;;;;;:::o;6522:118::-;6609:24;6627:5;6609:24;:::i;:::-;6604:3;6597:37;6522:118;;:::o;6646:222::-;6739:4;6777:2;6766:9;6762:18;6754:26;;6790:71;6858:1;6847:9;6843:17;6834:6;6790:71;:::i;:::-;6646:222;;;;:::o;6874:1927::-;7371:4;7409:3;7398:9;7394:19;7386:27;;7459:9;7453:4;7449:20;7445:1;7434:9;7430:17;7423:47;7487:78;7560:4;7551:6;7487:78;:::i;:::-;7479:86;;7612:9;7606:4;7602:20;7597:2;7586:9;7582:18;7575:48;7640:78;7713:4;7704:6;7640:78;:::i;:::-;7632:86;;7765:9;7759:4;7755:20;7750:2;7739:9;7735:18;7728:48;7793:78;7866:4;7857:6;7793:78;:::i;:::-;7785:86;;7918:9;7912:4;7908:20;7903:2;7892:9;7888:18;7881:48;7946:78;8019:4;8010:6;7946:78;:::i;:::-;7938:86;;8072:9;8066:4;8062:20;8056:3;8045:9;8041:19;8034:49;8100:78;8173:4;8164:6;8100:78;:::i;:::-;8092:86;;8226:9;8220:4;8216:20;8210:3;8199:9;8195:19;8188:49;8254:78;8327:4;8318:6;8254:78;:::i;:::-;8246:86;;8380:9;8374:4;8370:20;8364:3;8353:9;8349:19;8342:49;8408:78;8481:4;8472:6;8408:78;:::i;:::-;8400:86;;8534:9;8528:4;8524:20;8518:3;8507:9;8503:19;8496:49;8562:78;8635:4;8626:6;8562:78;:::i;:::-;8554:86;;8688:9;8682:4;8678:20;8672:3;8661:9;8657:19;8650:49;8716:78;8789:4;8780:6;8716:78;:::i;:::-;8708:86;;6874:1927;;;;;;;;;;;;:::o;8807:117::-;8916:1;8913;8906:12;8930:180;8978:77;8975:1;8968:88;9075:4;9072:1;9065:15;9099:4;9096:1;9089:15;9116:281;9199:27;9221:4;9199:27;:::i;:::-;9191:6;9187:40;9329:6;9317:10;9314:22;9293:18;9281:10;9278:34;9275:62;9272:88;;;9340:18;;:::i;:::-;9272:88;9380:10;9376:2;9369:22;9159:238;9116:281;;:::o;9403:129::-;9437:6;9464:20;;:::i;:::-;9454:30;;9493:33;9521:4;9513:6;9493:33;:::i;:::-;9403:129;;;:::o;9538:117::-;9647:1;9644;9637:12;9661:117;9770:1;9767;9760:12;9784:117;9893:1;9890;9883:12;9907:308;9969:4;10059:18;10051:6;10048:30;10045:56;;;10081:18;;:::i;:::-;10045:56;10119:29;10141:6;10119:29;:::i;:::-;10111:37;;10203:4;10197;10193:15;10185:23;;9907:308;;;:::o;10221:154::-;10305:6;10300:3;10295;10282:30;10367:1;10358:6;10353:3;10349:16;10342:27;10221:154;;;:::o;10381:412::-;10459:5;10484:66;10500:49;10542:6;10500:49;:::i;:::-;10484:66;:::i;:::-;10475:75;;10573:6;10566:5;10559:21;10611:4;10604:5;10600:16;10649:3;10640:6;10635:3;10631:16;10628:25;10625:112;;;10656:79;;:::i;:::-;10625:112;10746:41;10780:6;10775:3;10770;10746:41;:::i;:::-;10465:328;10381:412;;;;;:::o;10813:340::-;10869:5;10918:3;10911:4;10903:6;10899:17;10895:27;10885:122;;10926:79;;:::i;:::-;10885:122;11043:6;11030:20;11068:79;11143:3;11135:6;11128:4;11120:6;11116:17;11068:79;:::i;:::-;11059:88;;10875:278;10813:340;;;;:::o;11185:3248::-;11256:5;11300:6;11288:9;11283:3;11279:19;11275:32;11272:119;;;11310:79;;:::i;:::-;11272:119;11409:23;11425:6;11409:23;:::i;:::-;11400:32;;11520:1;11509:9;11505:17;11492:31;11550:18;11542:6;11539:30;11536:117;;;11572:79;;:::i;:::-;11536:117;11692:59;11747:3;11738:6;11727:9;11723:22;11692:59;:::i;:::-;11685:4;11678:5;11674:16;11667:85;11442:321;11851:2;11840:9;11836:18;11823:32;11882:18;11874:6;11871:30;11868:117;;;11904:79;;:::i;:::-;11868:117;12024:59;12079:3;12070:6;12059:9;12055:22;12024:59;:::i;:::-;12017:4;12010:5;12006:16;11999:85;11773:322;12183:2;12172:9;12168:18;12155:32;12214:18;12206:6;12203:30;12200:117;;;12236:79;;:::i;:::-;12200:117;12356:59;12411:3;12402:6;12391:9;12387:22;12356:59;:::i;:::-;12349:4;12342:5;12338:16;12331:85;12105:322;12515:2;12504:9;12500:18;12487:32;12546:18;12538:6;12535:30;12532:117;;;12568:79;;:::i;:::-;12532:117;12688:59;12743:3;12734:6;12723:9;12719:22;12688:59;:::i;:::-;12681:4;12674:5;12670:16;12663:85;12437:322;12847:3;12836:9;12832:19;12819:33;12879:18;12871:6;12868:30;12865:117;;;12901:79;;:::i;:::-;12865:117;13021:59;13076:3;13067:6;13056:9;13052:22;13021:59;:::i;:::-;13014:4;13007:5;13003:16;12996:85;12769:323;13180:3;13169:9;13165:19;13152:33;13212:18;13204:6;13201:30;13198:117;;;13234:79;;:::i;:::-;13198:117;13354:59;13409:3;13400:6;13389:9;13385:22;13354:59;:::i;:::-;13347:4;13340:5;13336:16;13329:85;13102:323;13513:3;13502:9;13498:19;13485:33;13545:18;13537:6;13534:30;13531:117;;;13567:79;;:::i;:::-;13531:117;13687:59;13742:3;13733:6;13722:9;13718:22;13687:59;:::i;:::-;13680:4;13673:5;13669:16;13662:85;13435:323;13846:3;13835:9;13831:19;13818:33;13878:18;13870:6;13867:30;13864:117;;;13900:79;;:::i;:::-;13864:117;14020:59;14075:3;14066:6;14055:9;14051:22;14020:59;:::i;:::-;14013:4;14006:5;14002:16;13995:85;13768:323;14179:3;14168:9;14164:19;14151:33;14211:18;14203:6;14200:30;14197:117;;;14233:79;;:::i;:::-;14197:117;14355:59;14410:3;14401:6;14390:9;14386:22;14355:59;:::i;:::-;14346:6;14339:5;14335:18;14328:87;14101:325;11185:3248;;;;:::o;14439:77::-;14476:7;14505:5;14494:16;;14439:77;;;:::o;14522:122::-;14595:24;14613:5;14595:24;:::i;:::-;14588:5;14585:35;14575:63;;14634:1;14631;14624:12;14575:63;14522:122;:::o;14650:139::-;14696:5;14734:6;14721:20;14712:29;;14750:33;14777:5;14750:33;:::i;:::-;14650:139;;;;:::o;14795:307::-;14856:4;14946:18;14938:6;14935:30;14932:56;;;14968:18;;:::i;:::-;14932:56;15006:29;15028:6;15006:29;:::i;:::-;14998:37;;15090:4;15084;15080:15;15072:23;;14795:307;;;:::o;15108:410::-;15185:5;15210:65;15226:48;15267:6;15226:48;:::i;:::-;15210:65;:::i;:::-;15201:74;;15298:6;15291:5;15284:21;15336:4;15329:5;15325:16;15374:3;15365:6;15360:3;15356:16;15353:25;15350:112;;;15381:79;;:::i;:::-;15350:112;15471:41;15505:6;15500:3;15495;15471:41;:::i;:::-;15191:327;15108:410;;;;;:::o;15537:338::-;15592:5;15641:3;15634:4;15626:6;15622:17;15618:27;15608:122;;15649:79;;:::i;:::-;15608:122;15766:6;15753:20;15791:78;15865:3;15857:6;15850:4;15842:6;15838:17;15791:78;:::i;:::-;15782:87;;15598:277;15537:338;;;;:::o;15881:1147::-;15998:6;16006;16014;16022;16071:3;16059:9;16050:7;16046:23;16042:33;16039:120;;;16078:79;;:::i;:::-;16039:120;16226:1;16215:9;16211:17;16198:31;16256:18;16248:6;16245:30;16242:117;;;16278:79;;:::i;:::-;16242:117;16383:75;16450:7;16441:6;16430:9;16426:22;16383:75;:::i;:::-;16373:85;;16169:299;16507:2;16533:53;16578:7;16569:6;16558:9;16554:22;16533:53;:::i;:::-;16523:63;;16478:118;16663:2;16652:9;16648:18;16635:32;16694:18;16686:6;16683:30;16680:117;;;16716:79;;:::i;:::-;16680:117;16821:62;16875:7;16866:6;16855:9;16851:22;16821:62;:::i;:::-;16811:72;;16606:287;16932:2;16958:53;17003:7;16994:6;16983:9;16979:22;16958:53;:::i;:::-;16948:63;;16903:118;15881:1147;;;;;;;:::o;17034:60::-;17062:3;17083:5;17076:12;;17034:60;;;:::o;17100:142::-;17150:9;17183:53;17201:34;17210:24;17228:5;17210:24;:::i;:::-;17201:34;:::i;:::-;17183:53;:::i;:::-;17170:66;;17100:142;;;:::o;17248:126::-;17298:9;17331:37;17362:5;17331:37;:::i;:::-;17318:50;;17248:126;;;:::o;17380:150::-;17454:9;17487:37;17518:5;17487:37;:::i;:::-;17474:50;;17380:150;;;:::o;17536:179::-;17647:61;17702:5;17647:61;:::i;:::-;17642:3;17635:74;17536:179;;:::o;17721:270::-;17838:4;17876:2;17865:9;17861:18;17853:26;;17889:95;17981:1;17970:9;17966:17;17957:6;17889:95;:::i;:::-;17721:270;;;;:::o;17997:329::-;18056:6;18105:2;18093:9;18084:7;18080:23;18076:32;18073:119;;;18111:79;;:::i;:::-;18073:119;18231:1;18256:53;18301:7;18292:6;18281:9;18277:22;18256:53;:::i;:::-;18246:63;;18202:117;17997:329;;;;:::o;18332:509::-;18401:6;18450:2;18438:9;18429:7;18425:23;18421:32;18418:119;;;18456:79;;:::i;:::-;18418:119;18604:1;18593:9;18589:17;18576:31;18634:18;18626:6;18623:30;18620:117;;;18656:79;;:::i;:::-;18620:117;18761:63;18816:7;18807:6;18796:9;18792:22;18761:63;:::i;:::-;18751:73;;18547:287;18332:509;;;;:::o;18847:116::-;18917:21;18932:5;18917:21;:::i;:::-;18910:5;18907:32;18897:60;;18953:1;18950;18943:12;18897:60;18847:116;:::o;18969:133::-;19012:5;19050:6;19037:20;19028:29;;19066:30;19090:5;19066:30;:::i;:::-;18969:133;;;;:::o;19108:468::-;19173:6;19181;19230:2;19218:9;19209:7;19205:23;19201:32;19198:119;;;19236:79;;:::i;:::-;19198:119;19356:1;19381:53;19426:7;19417:6;19406:9;19402:22;19381:53;:::i;:::-;19371:63;;19327:117;19483:2;19509:50;19551:7;19542:6;19531:9;19527:22;19509:50;:::i;:::-;19499:60;;19454:115;19108:468;;;;;:::o;19582:943::-;19677:6;19685;19693;19701;19750:3;19738:9;19729:7;19725:23;19721:33;19718:120;;;19757:79;;:::i;:::-;19718:120;19877:1;19902:53;19947:7;19938:6;19927:9;19923:22;19902:53;:::i;:::-;19892:63;;19848:117;20004:2;20030:53;20075:7;20066:6;20055:9;20051:22;20030:53;:::i;:::-;20020:63;;19975:118;20132:2;20158:53;20203:7;20194:6;20183:9;20179:22;20158:53;:::i;:::-;20148:63;;20103:118;20288:2;20277:9;20273:18;20260:32;20319:18;20311:6;20308:30;20305:117;;;20341:79;;:::i;:::-;20305:117;20446:62;20500:7;20491:6;20480:9;20476:22;20446:62;:::i;:::-;20436:72;;20231:287;19582:943;;;;;;;:::o;20531:474::-;20599:6;20607;20656:2;20644:9;20635:7;20631:23;20627:32;20624:119;;;20662:79;;:::i;:::-;20624:119;20782:1;20807:53;20852:7;20843:6;20832:9;20828:22;20807:53;:::i;:::-;20797:63;;20753:117;20909:2;20935:53;20980:7;20971:6;20960:9;20956:22;20935:53;:::i;:::-;20925:63;;20880:118;20531:474;;;;;:::o;21011:180::-;21059:77;21056:1;21049:88;21156:4;21153:1;21146:15;21180:4;21177:1;21170:15;21197:320;21241:6;21278:1;21272:4;21268:12;21258:22;;21325:1;21319:4;21315:12;21346:18;21336:81;;21402:4;21394:6;21390:17;21380:27;;21336:81;21464:2;21456:6;21453:14;21433:18;21430:38;21427:84;;21483:18;;:::i;:::-;21427:84;21248:269;21197:320;;;:::o;21523:220::-;21663:34;21659:1;21651:6;21647:14;21640:58;21732:3;21727:2;21719:6;21715:15;21708:28;21523:220;:::o;21749:366::-;21891:3;21912:67;21976:2;21971:3;21912:67;:::i;:::-;21905:74;;21988:93;22077:3;21988:93;:::i;:::-;22106:2;22101:3;22097:12;22090:19;;21749:366;;;:::o;22121:419::-;22287:4;22325:2;22314:9;22310:18;22302:26;;22374:9;22368:4;22364:20;22360:1;22349:9;22345:17;22338:47;22402:131;22528:4;22402:131;:::i;:::-;22394:139;;22121:419;;;:::o;22546:248::-;22686:34;22682:1;22674:6;22670:14;22663:58;22755:31;22750:2;22742:6;22738:15;22731:56;22546:248;:::o;22800:366::-;22942:3;22963:67;23027:2;23022:3;22963:67;:::i;:::-;22956:74;;23039:93;23128:3;23039:93;:::i;:::-;23157:2;23152:3;23148:12;23141:19;;22800:366;;;:::o;23172:419::-;23338:4;23376:2;23365:9;23361:18;23353:26;;23425:9;23419:4;23415:20;23411:1;23400:9;23396:17;23389:47;23453:131;23579:4;23453:131;:::i;:::-;23445:139;;23172:419;;;:::o;23597:170::-;23737:22;23733:1;23725:6;23721:14;23714:46;23597:170;:::o;23773:366::-;23915:3;23936:67;24000:2;23995:3;23936:67;:::i;:::-;23929:74;;24012:93;24101:3;24012:93;:::i;:::-;24130:2;24125:3;24121:12;24114:19;;23773:366;;;:::o;24145:419::-;24311:4;24349:2;24338:9;24334:18;24326:26;;24398:9;24392:4;24388:20;24384:1;24373:9;24369:17;24362:47;24426:131;24552:4;24426:131;:::i;:::-;24418:139;;24145:419;;;:::o;24570:148::-;24672:11;24709:3;24694:18;;24570:148;;;;:::o;24724:300::-;24864:34;24860:1;24852:6;24848:14;24841:58;24933:34;24928:2;24920:6;24916:15;24909:59;25002:14;24997:2;24989:6;24985:15;24978:39;24724:300;:::o;25030:402::-;25190:3;25211:85;25293:2;25288:3;25211:85;:::i;:::-;25204:92;;25305:93;25394:3;25305:93;:::i;:::-;25423:2;25418:3;25414:12;25407:19;;25030:402;;;:::o;25438:377::-;25544:3;25572:39;25605:5;25572:39;:::i;:::-;25627:89;25709:6;25704:3;25627:89;:::i;:::-;25620:96;;25725:52;25770:6;25765:3;25758:4;25751:5;25747:16;25725:52;:::i;:::-;25802:6;25797:3;25793:16;25786:23;;25548:267;25438:377;;;;:::o;25821:164::-;25961:16;25957:1;25949:6;25945:14;25938:40;25821:164;:::o;25991:402::-;26151:3;26172:85;26254:2;26249:3;26172:85;:::i;:::-;26165:92;;26266:93;26355:3;26266:93;:::i;:::-;26384:2;26379:3;26375:12;26368:19;;25991:402;;;:::o;26399:807::-;26733:3;26755:148;26899:3;26755:148;:::i;:::-;26748:155;;26920:95;27011:3;27002:6;26920:95;:::i;:::-;26913:102;;27032:148;27176:3;27032:148;:::i;:::-;27025:155;;27197:3;27190:10;;26399:807;;;;:::o;27212:232::-;27352:34;27348:1;27340:6;27336:14;27329:58;27421:15;27416:2;27408:6;27404:15;27397:40;27212:232;:::o;27450:366::-;27592:3;27613:67;27677:2;27672:3;27613:67;:::i;:::-;27606:74;;27689:93;27778:3;27689:93;:::i;:::-;27807:2;27802:3;27798:12;27791:19;;27450:366;;;:::o;27822:419::-;27988:4;28026:2;28015:9;28011:18;28003:26;;28075:9;28069:4;28065:20;28061:1;28050:9;28046:17;28039:47;28103:131;28229:4;28103:131;:::i;:::-;28095:139;;27822:419;;;:::o;28247:1555::-;28763:3;28785:95;28876:3;28867:6;28785:95;:::i;:::-;28778:102;;28897:95;28988:3;28979:6;28897:95;:::i;:::-;28890:102;;29009:95;29100:3;29091:6;29009:95;:::i;:::-;29002:102;;29121:95;29212:3;29203:6;29121:95;:::i;:::-;29114:102;;29233:95;29324:3;29315:6;29233:95;:::i;:::-;29226:102;;29345:95;29436:3;29427:6;29345:95;:::i;:::-;29338:102;;29457:95;29548:3;29539:6;29457:95;:::i;:::-;29450:102;;29569:95;29660:3;29651:6;29569:95;:::i;:::-;29562:102;;29681:95;29772:3;29763:6;29681:95;:::i;:::-;29674:102;;29793:3;29786:10;;28247:1555;;;;;;;;;;;;:::o;29808:275::-;29940:3;29962:95;30053:3;30044:6;29962:95;:::i;:::-;29955:102;;30074:3;30067:10;;29808:275;;;;:::o;30089:171::-;30229:23;30225:1;30217:6;30213:14;30206:47;30089:171;:::o;30266:366::-;30408:3;30429:67;30493:2;30488:3;30429:67;:::i;:::-;30422:74;;30505:93;30594:3;30505:93;:::i;:::-;30623:2;30618:3;30614:12;30607:19;;30266:366;;;:::o;30638:419::-;30804:4;30842:2;30831:9;30827:18;30819:26;;30891:9;30885:4;30881:20;30877:1;30866:9;30862:17;30855:47;30919:131;31045:4;30919:131;:::i;:::-;30911:139;;30638:419;;;:::o;31063:158::-;31203:10;31199:1;31191:6;31187:14;31180:34;31063:158;:::o;31227:365::-;31369:3;31390:66;31454:1;31449:3;31390:66;:::i;:::-;31383:73;;31465:93;31554:3;31465:93;:::i;:::-;31583:2;31578:3;31574:12;31567:19;;31227:365;;;:::o;31598:419::-;31764:4;31802:2;31791:9;31787:18;31779:26;;31851:9;31845:4;31841:20;31837:1;31826:9;31822:17;31815:47;31879:131;32005:4;31879:131;:::i;:::-;31871:139;;31598:419;;;:::o;32023:118::-;32110:24;32128:5;32110:24;:::i;:::-;32105:3;32098:37;32023:118;;:::o;32147:419::-;32286:4;32324:2;32313:9;32309:18;32301:26;;32337:71;32405:1;32394:9;32390:17;32381:6;32337:71;:::i;:::-;32455:9;32449:4;32445:20;32440:2;32429:9;32425:18;32418:48;32483:76;32554:4;32545:6;32483:76;:::i;:::-;32475:84;;32147:419;;;;;:::o;32572:143::-;32629:5;32660:6;32654:13;32645:22;;32676:33;32703:5;32676:33;:::i;:::-;32572:143;;;;:::o;32721:351::-;32791:6;32840:2;32828:9;32819:7;32815:23;32811:32;32808:119;;;32846:79;;:::i;:::-;32808:119;32966:1;32991:64;33047:7;33038:6;33027:9;33023:22;32991:64;:::i;:::-;32981:74;;32937:128;32721:351;;;;:::o;33078:168::-;33218:20;33214:1;33206:6;33202:14;33195:44;33078:168;:::o;33252:366::-;33394:3;33415:67;33479:2;33474:3;33415:67;:::i;:::-;33408:74;;33491:93;33580:3;33491:93;:::i;:::-;33609:2;33604:3;33600:12;33593:19;;33252:366;;;:::o;33624:419::-;33790:4;33828:2;33817:9;33813:18;33805:26;;33877:9;33871:4;33867:20;33863:1;33852:9;33848:17;33841:47;33905:131;34031:4;33905:131;:::i;:::-;33897:139;;33624:419;;;:::o;34049:143::-;34106:5;34137:6;34131:13;34122:22;;34153:33;34180:5;34153:33;:::i;:::-;34049:143;;;;:::o;34198:351::-;34268:6;34317:2;34305:9;34296:7;34292:23;34288:32;34285:119;;;34323:79;;:::i;:::-;34285:119;34443:1;34468:64;34524:7;34515:6;34504:9;34500:22;34468:64;:::i;:::-;34458:74;;34414:128;34198:351;;;;:::o;34555:176::-;34695:28;34691:1;34683:6;34679:14;34672:52;34555:176;:::o;34737:366::-;34879:3;34900:67;34964:2;34959:3;34900:67;:::i;:::-;34893:74;;34976:93;35065:3;34976:93;:::i;:::-;35094:2;35089:3;35085:12;35078:19;;34737:366;;;:::o;35109:419::-;35275:4;35313:2;35302:9;35298:18;35290:26;;35362:9;35356:4;35352:20;35348:1;35337:9;35333:17;35326:47;35390:131;35516:4;35390:131;:::i;:::-;35382:139;;35109:419;;;:::o;35534:94::-;35567:8;35615:5;35611:2;35607:14;35586:35;;35534:94;;;:::o;35634:::-;35673:7;35702:20;35716:5;35702:20;:::i;:::-;35691:31;;35634:94;;;:::o;35734:100::-;35773:7;35802:26;35822:5;35802:26;:::i;:::-;35791:37;;35734:100;;;:::o;35840:157::-;35945:45;35965:24;35983:5;35965:24;:::i;:::-;35945:45;:::i;:::-;35940:3;35933:58;35840:157;;:::o;36003:256::-;36115:3;36130:75;36201:3;36192:6;36130:75;:::i;:::-;36230:2;36225:3;36221:12;36214:19;;36250:3;36243:10;;36003:256;;;;:::o;36265:156::-;36405:8;36401:1;36393:6;36389:14;36382:32;36265:156;:::o;36427:365::-;36569:3;36590:66;36654:1;36649:3;36590:66;:::i;:::-;36583:73;;36665:93;36754:3;36665:93;:::i;:::-;36783:2;36778:3;36774:12;36767:19;;36427:365;;;:::o;36798:419::-;36964:4;37002:2;36991:9;36987:18;36979:26;;37051:9;37045:4;37041:20;37037:1;37026:9;37022:17;37015:47;37079:131;37205:4;37079:131;:::i;:::-;37071:139;;36798:419;;;:::o;37223:143::-;37280:5;37311:6;37305:13;37296:22;;37327:33;37354:5;37327:33;:::i;:::-;37223:143;;;;:::o;37372:351::-;37442:6;37491:2;37479:9;37470:7;37466:23;37462:32;37459:119;;;37497:79;;:::i;:::-;37459:119;37617:1;37642:64;37698:7;37689:6;37678:9;37674:22;37642:64;:::i;:::-;37632:74;;37588:128;37372:351;;;;:::o;37729:165::-;37869:17;37865:1;37857:6;37853:14;37846:41;37729:165;:::o;37900:366::-;38042:3;38063:67;38127:2;38122:3;38063:67;:::i;:::-;38056:74;;38139:93;38228:3;38139:93;:::i;:::-;38257:2;38252:3;38248:12;38241:19;;37900:366;;;:::o;38272:419::-;38438:4;38476:2;38465:9;38461:18;38453:26;;38525:9;38519:4;38515:20;38511:1;38500:9;38496:17;38489:47;38553:131;38679:4;38553:131;:::i;:::-;38545:139;;38272:419;;;:::o;38697:180::-;38745:77;38742:1;38735:88;38842:4;38839:1;38832:15;38866:4;38863:1;38856:15;38883:233;38922:3;38945:24;38963:5;38945:24;:::i;:::-;38936:33;;38991:66;38984:5;38981:77;38978:103;;39061:18;;:::i;:::-;38978:103;39108:1;39101:5;39097:13;39090:20;;38883:233;;;:::o;39122:174::-;39262:26;39258:1;39250:6;39246:14;39239:50;39122:174;:::o;39302:366::-;39444:3;39465:67;39529:2;39524:3;39465:67;:::i;:::-;39458:74;;39541:93;39630:3;39541:93;:::i;:::-;39659:2;39654:3;39650:12;39643:19;;39302:366;;;:::o;39674:419::-;39840:4;39878:2;39867:9;39863:18;39855:26;;39927:9;39921:4;39917:20;39913:1;39902:9;39898:17;39891:47;39955:131;40081:4;39955:131;:::i;:::-;39947:139;;39674:419;;;:::o;40099:228::-;40239:34;40235:1;40227:6;40223:14;40216:58;40308:11;40303:2;40295:6;40291:15;40284:36;40099:228;:::o;40333:366::-;40475:3;40496:67;40560:2;40555:3;40496:67;:::i;:::-;40489:74;;40572:93;40661:3;40572:93;:::i;:::-;40690:2;40685:3;40681:12;40674:19;;40333:366;;;:::o;40705:419::-;40871:4;40909:2;40898:9;40894:18;40886:26;;40958:9;40952:4;40948:20;40944:1;40933:9;40929:17;40922:47;40986:131;41112:4;40986:131;:::i;:::-;40978:139;;40705:419;;;:::o;41130:1075::-;41502:3;41524:95;41615:3;41606:6;41524:95;:::i;:::-;41517:102;;41636:95;41727:3;41718:6;41636:95;:::i;:::-;41629:102;;41748:95;41839:3;41830:6;41748:95;:::i;:::-;41741:102;;41860:95;41951:3;41942:6;41860:95;:::i;:::-;41853:102;;41972:95;42063:3;42054:6;41972:95;:::i;:::-;41965:102;;42084:95;42175:3;42166:6;42084:95;:::i;:::-;42077:102;;42196:3;42189:10;;41130:1075;;;;;;;;;:::o;42211:1235::-;42631:3;42653:95;42744:3;42735:6;42653:95;:::i;:::-;42646:102;;42765:95;42856:3;42847:6;42765:95;:::i;:::-;42758:102;;42877:95;42968:3;42959:6;42877:95;:::i;:::-;42870:102;;42989:95;43080:3;43071:6;42989:95;:::i;:::-;42982:102;;43101:95;43192:3;43183:6;43101:95;:::i;:::-;43094:102;;43213:95;43304:3;43295:6;43213:95;:::i;:::-;43206:102;;43325:95;43416:3;43407:6;43325:95;:::i;:::-;43318:102;;43437:3;43430:10;;42211:1235;;;;;;;;;;:::o;43452:147::-;43553:11;43590:3;43575:18;;43452:147;;;;:::o;43605:373::-;43709:3;43737:38;43769:5;43737:38;:::i;:::-;43791:88;43872:6;43867:3;43791:88;:::i;:::-;43784:95;;43888:52;43933:6;43928:3;43921:4;43914:5;43910:16;43888:52;:::i;:::-;43965:6;43960:3;43956:16;43949:23;;43713:265;43605:373;;;;:::o;43984:583::-;44206:3;44228:93;44317:3;44308:6;44228:93;:::i;:::-;44221:100;;44338:93;44427:3;44418:6;44338:93;:::i;:::-;44331:100;;44448:93;44537:3;44528:6;44448:93;:::i;:::-;44441:100;;44558:3;44551:10;;43984:583;;;;;;:::o;44573:255::-;44713:66;44709:1;44701:6;44697:14;44690:90;44814:6;44809:2;44801:6;44797:15;44790:31;44573:255;:::o;44834:402::-;44994:3;45015:85;45097:2;45092:3;45015:85;:::i;:::-;45008:92;;45109:93;45198:3;45109:93;:::i;:::-;45227:2;45222:3;45218:12;45211:19;;44834:402;;;:::o;45242:214::-;45382:66;45378:1;45370:6;45366:14;45359:90;45242:214;:::o;45462:400::-;45622:3;45643:84;45725:1;45720:3;45643:84;:::i;:::-;45636:91;;45736:93;45825:3;45736:93;:::i;:::-;45854:1;45849:3;45845:11;45838:18;;45462:400;;;:::o;45868:807::-;46202:3;46224:148;46368:3;46224:148;:::i;:::-;46217:155;;46389:95;46480:3;46471:6;46389:95;:::i;:::-;46382:102;;46501:148;46645:3;46501:148;:::i;:::-;46494:155;;46666:3;46659:10;;45868:807;;;;:::o;46681:259::-;46821:66;46817:1;46809:6;46805:14;46798:90;46922:10;46917:2;46909:6;46905:15;46898:35;46681:259;:::o;46946:402::-;47106:3;47127:85;47209:2;47204:3;47127:85;:::i;:::-;47120:92;;47221:93;47310:3;47221:93;:::i;:::-;47339:2;47334:3;47330:12;47323:19;;46946:402;;;:::o;47354:807::-;47688:3;47710:148;47854:3;47710:148;:::i;:::-;47703:155;;47875:95;47966:3;47957:6;47875:95;:::i;:::-;47868:102;;47987:148;48131:3;47987:148;:::i;:::-;47980:155;;48152:3;48145:10;;47354:807;;;;:::o;48167:214::-;48307:66;48303:1;48295:6;48291:14;48284:90;48167:214;:::o;48387:402::-;48547:3;48568:85;48650:2;48645:3;48568:85;:::i;:::-;48561:92;;48662:93;48751:3;48662:93;:::i;:::-;48780:2;48775:3;48771:12;48764:19;;48387:402;;;:::o;48795:152::-;48935:4;48931:1;48923:6;48919:14;48912:28;48795:152;:::o;48953:400::-;49113:3;49134:84;49216:1;49211:3;49134:84;:::i;:::-;49127:91;;49227:93;49316:3;49227:93;:::i;:::-;49345:1;49340:3;49336:11;49329:18;;48953:400;;;:::o;49359:214::-;49499:66;49495:1;49487:6;49483:14;49476:90;49359:214;:::o;49579:402::-;49739:3;49760:85;49842:2;49837:3;49760:85;:::i;:::-;49753:92;;49854:93;49943:3;49854:93;:::i;:::-;49972:2;49967:3;49963:12;49956:19;;49579:402;;;:::o;49987:214::-;50127:66;50123:1;50115:6;50111:14;50104:90;49987:214;:::o;50207:402::-;50367:3;50388:85;50470:2;50465:3;50388:85;:::i;:::-;50381:92;;50482:93;50571:3;50482:93;:::i;:::-;50600:2;50595:3;50591:12;50584:19;;50207:402;;;:::o;50615:141::-;50664:4;50687:3;50679:11;;50710:3;50707:1;50700:14;50744:4;50741:1;50731:18;50723:26;;50615:141;;;:::o;50786:845::-;50889:3;50926:5;50920:12;50955:36;50981:9;50955:36;:::i;:::-;51007:89;51089:6;51084:3;51007:89;:::i;:::-;51000:96;;51127:1;51116:9;51112:17;51143:1;51138:137;;;;51289:1;51284:341;;;;51105:520;;51138:137;51222:4;51218:9;51207;51203:25;51198:3;51191:38;51258:6;51253:3;51249:16;51242:23;;51138:137;;51284:341;51351:38;51383:5;51351:38;:::i;:::-;51411:1;51425:154;51439:6;51436:1;51433:13;51425:154;;;51513:7;51507:14;51503:1;51498:3;51494:11;51487:35;51563:1;51554:7;51550:15;51539:26;;51461:4;51458:1;51454:12;51449:17;;51425:154;;;51608:6;51603:3;51599:16;51592:23;;51291:334;;51105:520;;50893:738;;50786:845;;;;:::o;51637:214::-;51777:66;51773:1;51765:6;51761:14;51754:90;51637:214;:::o;51857:402::-;52017:3;52038:85;52120:2;52115:3;52038:85;:::i;:::-;52031:92;;52132:93;52221:3;52132:93;:::i;:::-;52250:2;52245:3;52241:12;52234:19;;51857:402;;;:::o;52265:214::-;52405:66;52401:1;52393:6;52389:14;52382:90;52265:214;:::o;52485:400::-;52645:3;52666:84;52748:1;52743:3;52666:84;:::i;:::-;52659:91;;52759:93;52848:3;52759:93;:::i;:::-;52877:1;52872:3;52868:11;52861:18;;52485:400;;;:::o;52891:3343::-;54109:3;54131:148;54275:3;54131:148;:::i;:::-;54124:155;;54296:95;54387:3;54378:6;54296:95;:::i;:::-;54289:102;;54408:148;54552:3;54408:148;:::i;:::-;54401:155;;54573:95;54664:3;54655:6;54573:95;:::i;:::-;54566:102;;54685:148;54829:3;54685:148;:::i;:::-;54678:155;;54850:148;54994:3;54850:148;:::i;:::-;54843:155;;55015:95;55106:3;55097:6;55015:95;:::i;:::-;55008:102;;55127:148;55271:3;55127:148;:::i;:::-;55120:155;;55292:93;55381:3;55372:6;55292:93;:::i;:::-;55285:100;;55402:93;55491:3;55482:6;55402:93;:::i;:::-;55395:100;;55512:148;55656:3;55512:148;:::i;:::-;55505:155;;55677:92;55765:3;55756:6;55677:92;:::i;:::-;55670:99;;55786:148;55930:3;55786:148;:::i;:::-;55779:155;;55951:92;56039:3;56030:6;55951:92;:::i;:::-;55944:99;;56060:148;56204:3;56060:148;:::i;:::-;56053:155;;56225:3;56218:10;;52891:3343;;;;;;;;;;:::o;56240:179::-;56380:31;56376:1;56368:6;56364:14;56357:55;56240:179;:::o;56425:402::-;56585:3;56606:85;56688:2;56683:3;56606:85;:::i;:::-;56599:92;;56700:93;56789:3;56700:93;:::i;:::-;56818:2;56813:3;56809:12;56802:19;;56425:402;;;:::o;56833:541::-;57066:3;57088:148;57232:3;57088:148;:::i;:::-;57081:155;;57253:95;57344:3;57335:6;57253:95;:::i;:::-;57246:102;;57365:3;57358:10;;56833:541;;;;:::o;57380:225::-;57520:34;57516:1;57508:6;57504:14;57497:58;57589:8;57584:2;57576:6;57572:15;57565:33;57380:225;:::o;57611:366::-;57753:3;57774:67;57838:2;57833:3;57774:67;:::i;:::-;57767:74;;57850:93;57939:3;57850:93;:::i;:::-;57968:2;57963:3;57959:12;57952:19;;57611:366;;;:::o;57983:419::-;58149:4;58187:2;58176:9;58172:18;58164:26;;58236:9;58230:4;58226:20;58222:1;58211:9;58207:17;58200:47;58264:131;58390:4;58264:131;:::i;:::-;58256:139;;57983:419;;;:::o;58408:224::-;58548:34;58544:1;58536:6;58532:14;58525:58;58617:7;58612:2;58604:6;58600:15;58593:32;58408:224;:::o;58638:366::-;58780:3;58801:67;58865:2;58860:3;58801:67;:::i;:::-;58794:74;;58877:93;58966:3;58877:93;:::i;:::-;58995:2;58990:3;58986:12;58979:19;;58638:366;;;:::o;59010:419::-;59176:4;59214:2;59203:9;59199:18;59191:26;;59263:9;59257:4;59253:20;59249:1;59238:9;59234:17;59227:47;59291:131;59417:4;59291:131;:::i;:::-;59283:139;;59010:419;;;:::o;59435:223::-;59575:34;59571:1;59563:6;59559:14;59552:58;59644:6;59639:2;59631:6;59627:15;59620:31;59435:223;:::o;59664:366::-;59806:3;59827:67;59891:2;59886:3;59827:67;:::i;:::-;59820:74;;59903:93;59992:3;59903:93;:::i;:::-;60021:2;60016:3;60012:12;60005:19;;59664:366;;;:::o;60036:419::-;60202:4;60240:2;60229:9;60225:18;60217:26;;60289:9;60283:4;60279:20;60275:1;60264:9;60260:17;60253:47;60317:131;60443:4;60317:131;:::i;:::-;60309:139;;60036:419;;;:::o;60461:182::-;60601:34;60597:1;60589:6;60585:14;60578:58;60461:182;:::o;60649:366::-;60791:3;60812:67;60876:2;60871:3;60812:67;:::i;:::-;60805:74;;60888:93;60977:3;60888:93;:::i;:::-;61006:2;61001:3;60997:12;60990:19;;60649:366;;;:::o;61021:419::-;61187:4;61225:2;61214:9;61210:18;61202:26;;61274:9;61268:4;61264:20;61260:1;61249:9;61245:17;61238:47;61302:131;61428:4;61302:131;:::i;:::-;61294:139;;61021:419;;;:::o;61446:175::-;61586:27;61582:1;61574:6;61570:14;61563:51;61446:175;:::o;61627:366::-;61769:3;61790:67;61854:2;61849:3;61790:67;:::i;:::-;61783:74;;61866:93;61955:3;61866:93;:::i;:::-;61984:2;61979:3;61975:12;61968:19;;61627:366;;;:::o;61999:419::-;62165:4;62203:2;62192:9;62188:18;62180:26;;62252:9;62246:4;62242:20;62238:1;62227:9;62223:17;62216:47;62280:131;62406:4;62280:131;:::i;:::-;62272:139;;61999:419;;;:::o;62424:237::-;62564:34;62560:1;62552:6;62548:14;62541:58;62633:20;62628:2;62620:6;62616:15;62609:45;62424:237;:::o;62667:366::-;62809:3;62830:67;62894:2;62889:3;62830:67;:::i;:::-;62823:74;;62906:93;62995:3;62906:93;:::i;:::-;63024:2;63019:3;63015:12;63008:19;;62667:366;;;:::o;63039:419::-;63205:4;63243:2;63232:9;63228:18;63220:26;;63292:9;63286:4;63282:20;63278:1;63267:9;63263:17;63256:47;63320:131;63446:4;63320:131;:::i;:::-;63312:139;;63039:419;;;:::o;63464:305::-;63504:3;63523:20;63541:1;63523:20;:::i;:::-;63518:25;;63557:20;63575:1;63557:20;:::i;:::-;63552:25;;63711:1;63643:66;63639:74;63636:1;63633:81;63630:107;;;63717:18;;:::i;:::-;63630:107;63761:1;63758;63754:9;63747:16;;63464:305;;;;:::o;63775:180::-;63823:77;63820:1;63813:88;63920:4;63917:1;63910:15;63944:4;63941:1;63934:15;63961:185;64001:1;64018:20;64036:1;64018:20;:::i;:::-;64013:25;;64052:20;64070:1;64052:20;:::i;:::-;64047:25;;64091:1;64081:35;;64096:18;;:::i;:::-;64081:35;64138:1;64135;64131:9;64126:14;;63961:185;;;;:::o;64152:348::-;64192:7;64215:20;64233:1;64215:20;:::i;:::-;64210:25;;64249:20;64267:1;64249:20;:::i;:::-;64244:25;;64437:1;64369:66;64365:74;64362:1;64359:81;64354:1;64347:9;64340:17;64336:105;64333:131;;;64444:18;;:::i;:::-;64333:131;64492:1;64489;64485:9;64474:20;;64152:348;;;;:::o;64506:191::-;64546:4;64566:20;64584:1;64566:20;:::i;:::-;64561:25;;64600:20;64618:1;64600:20;:::i;:::-;64595:25;;64639:1;64636;64633:8;64630:34;;;64644:18;;:::i;:::-;64630:34;64689:1;64686;64682:9;64674:17;;64506:191;;;;:::o;64703:640::-;64898:4;64936:3;64925:9;64921:19;64913:27;;64950:71;65018:1;65007:9;65003:17;64994:6;64950:71;:::i;:::-;65031:72;65099:2;65088:9;65084:18;65075:6;65031:72;:::i;:::-;65113;65181:2;65170:9;65166:18;65157:6;65113:72;:::i;:::-;65232:9;65226:4;65222:20;65217:2;65206:9;65202:18;65195:48;65260:76;65331:4;65322:6;65260:76;:::i;:::-;65252:84;;64703:640;;;;;;;:::o;65349:141::-;65405:5;65436:6;65430:13;65421:22;;65452:32;65478:5;65452:32;:::i;:::-;65349:141;;;;:::o;65496:349::-;65565:6;65614:2;65602:9;65593:7;65589:23;65585:32;65582:119;;;65620:79;;:::i;:::-;65582:119;65740:1;65765:63;65820:7;65811:6;65800:9;65796:22;65765:63;:::i;:::-;65755:73;;65711:127;65496:349;;;;:::o;65851:182::-;65991:34;65987:1;65979:6;65975:14;65968:58;65851:182;:::o;66039:366::-;66181:3;66202:67;66266:2;66261:3;66202:67;:::i;:::-;66195:74;;66278:93;66367:3;66278:93;:::i;:::-;66396:2;66391:3;66387:12;66380:19;;66039:366;;;:::o;66411:419::-;66577:4;66615:2;66604:9;66600:18;66592:26;;66664:9;66658:4;66654:20;66650:1;66639:9;66635:17;66628:47;66692:131;66818:4;66692:131;:::i;:::-;66684:139;;66411:419;;;:::o;66836:178::-;66976:30;66972:1;66964:6;66960:14;66953:54;66836:178;:::o;67020:366::-;67162:3;67183:67;67247:2;67242:3;67183:67;:::i;:::-;67176:74;;67259:93;67348:3;67259:93;:::i;:::-;67377:2;67372:3;67368:12;67361:19;;67020:366;;;:::o;67392:419::-;67558:4;67596:2;67585:9;67581:18;67573:26;;67645:9;67639:4;67635:20;67631:1;67620:9;67616:17;67609:47;67673:131;67799:4;67673:131;:::i;:::-;67665:139;;67392:419;;;:::o

Swarm Source

ipfs://3c3b21ab7a51e4526431a7279646fa9b3ac952ed26848eb153c8a904e03f74ab
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.