ETH Price: $2,334.32 (-0.60%)

LUCKY404 (LUCKY404)
 

Overview

TokenID

7

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

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:
Pandora

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-02-19
*/

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/math/SignedMath.sol

// WELCOME TO LUCKY404

//  /$$             /$$   /$$        /$$$$$$        /$$   /$$       /$$     /$$       /$$   /$$        /$$$$$$        /$$   /$$
// | $$            | $$  | $$       /$$__  $$      | $$  /$$/      |  $$   /$$/      | $$  | $$       /$$$_  $$      | $$  | $$
// | $$            | $$  | $$      | $$  \__/      | $$ /$$/        \  $$ /$$/       | $$  | $$      | $$$$\ $$      | $$  | $$
// | $$            | $$  | $$      | $$            | $$$$$/          \  $$$$/        | $$$$$$$$      | $$ $$ $$      | $$$$$$$$
// | $$            | $$  | $$      | $$            | $$  $$           \  $$/         |_____  $$      | $$\ $$$$      |_____  $$
// | $$            | $$  | $$      | $$    $$      | $$\  $$           | $$                | $$      | $$ \ $$$            | $$
// | $$$$$$$$      |  $$$$$$/      |  $$$$$$/      | $$ \  $$          | $$                | $$      |  $$$$$$/            | $$
// |________/       \______/        \______/       |__/  \__/          |__/                |__/       \______/             |__/
                                                                                                                    

// LUCKY 404 is a ERC-404 based semi fungible token in which if you are lucky you 
// could win a lambo and many other big prizes with our lucky NFTS

// https://www.lucky404.art/
// https://twitter.com/Luckyerc404
// https://t.co/fe33bOP5S2


// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol)

pragma solidity ^0.8.20;

/**
 * @dev Standard signed math utilities missing in the Solidity language.
 */
library SignedMath {
    /**
     * @dev Returns the largest of two signed numbers.
     */
    function max(int256 a, int256 b) internal pure returns (int256) {
        return a > b ? a : b;
    }

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

    /**
     * @dev Returns the average of two signed numbers without overflow.
     * The result is rounded towards zero.
     */
    function average(int256 a, int256 b) internal pure returns (int256) {
        // Formula from the book "Hacker's Delight"
        int256 x = (a & b) + ((a ^ b) >> 1);
        return x + (int256(uint256(x) >> 255) & (a ^ b));
    }

    /**
     * @dev Returns the absolute unsigned value of a signed value.
     */
    function abs(int256 n) internal pure returns (uint256) {
        unchecked {
            // must be unchecked in order to support `n = type(int256).min`
            return uint256(n >= 0 ? n : -n);
        }
    }
}

// File: @openzeppelin/contracts/utils/math/Math.sol


// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol)

pragma solidity ^0.8.20;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Muldiv operation overflow.
     */
    error MathOverflowedMulDiv();

    enum Rounding {
        Floor, // Toward negative infinity
        Ceil, // Toward positive infinity
        Trunc, // Toward zero
        Expand // Away from zero
    }

    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the 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 towards infinity instead
     * of rounding towards zero.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        if (b == 0) {
            // Guarantee the same behavior as in a regular Solidity division.
            return a / b;
        }

        // (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 = x * y; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                // Solidity will revert if denominator == 0, unlike the div opcode on its own.
                // The surrounding unchecked block does not change this fact.
                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            if (denominator <= prod1) {
                revert MathOverflowedMulDiv();
            }

            ///////////////////////////////////////////////
            // 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.

            uint256 twos = denominator & (0 - denominator);
            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 (unsignedRoundsUp(rounding) && 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
     * towards zero.
     *
     * 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 + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2 of a positive value rounded towards zero.
     * 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 + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10 of a positive value rounded towards zero.
     * 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 + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256 of a positive value rounded towards zero.
     * 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 256, 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 + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0);
        }
    }

    /**
     * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.
     */
    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {
        return uint8(rounding) % 2 == 1;
    }
}

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


// OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol)

pragma solidity ^0.8.20;



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

    /**
     * @dev The `value` string doesn't fit in the specified `length`.
     */
    error StringsInsufficientHexLength(uint256 value, uint256 length);

    /**
     * @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), HEX_DIGITS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `int256` to its ASCII `string` decimal representation.
     */
    function toStringSigned(int256 value) internal pure returns (string memory) {
        return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value)));
    }

    /**
     * @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) {
        uint256 localValue = value;
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = HEX_DIGITS[localValue & 0xf];
            localValue >>= 4;
        }
        if (localValue != 0) {
            revert StringsInsufficientHexLength(value, length);
        }
        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);
    }

    /**
     * @dev Returns true if the two strings are equal.
     */
    function equal(string memory a, string memory b) internal pure returns (bool) {
        return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));
    }
}

// File: contracts/ERC404.sol


pragma solidity ^0.8.0;

abstract contract Ownable {
    event OwnershipTransferred(address indexed user, address indexed newOwner);

    error Unauthorized();
    error InvalidOwner();

    address public owner;

    modifier onlyOwner() virtual {
        if (msg.sender != owner) revert Unauthorized();

        _;
    }

    constructor(address _owner) {
        if (_owner == address(0)) revert InvalidOwner();

        owner = _owner;

        emit OwnershipTransferred(address(0), _owner);
    }

    function transferOwnership(address _owner) public virtual onlyOwner {
        if (_owner == address(0)) revert InvalidOwner();

        owner = _owner;

        emit OwnershipTransferred(msg.sender, _owner);
    }

    function revokeOwnership() public virtual onlyOwner {
        owner = address(0);

        emit OwnershipTransferred(msg.sender, address(0));
    }
}

abstract contract ERC721Receiver {
    function onERC721Received(
        address,
        address,
        uint256,
        bytes calldata
    ) external virtual returns (bytes4) {
        return ERC721Receiver.onERC721Received.selector;
    }
}

/// @notice ERC404
///         A gas-efficient, mixed ERC20 / ERC721 implementation
///         with native liquidity and fractionalization.
///
///         This is an experimental standard designed to integrate
///         with pre-existing ERC20 / ERC721 support as smoothly as
///         possible.
///
/// @dev    In order to support full functionality of ERC20 and ERC721
///         supply assumptions are made that slightly constraint usage.
///         Ensure decimals are sufficiently large (standard 18 recommended)
///         as ids are effectively encoded in the lowest range of amounts.
///
///         NFTs are spent on ERC20 functions in a FILO queue, this is by
///         design.
///
abstract contract ERC404 is Ownable {
    // Events
    event ERC20Transfer(
        address indexed from,
        address indexed to,
        uint256 amount
    );
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 amount
    );
    event Transfer(
        address indexed from,
        address indexed to,
        uint256 indexed id
    );
    event ERC721Approval(
        address indexed owner,
        address indexed spender,
        uint256 indexed id
    );
    event ApprovalForAll(
        address indexed owner,
        address indexed operator,
        bool approved
    );

    // Errors
    error NotFound();
    error AlreadyExists();
    error InvalidRecipient();
    error InvalidSender();
    error UnsafeRecipient();

    // Metadata
    /// @dev Token name
    string public name;

    /// @dev Token symbol
    string public symbol;

    /// @dev Decimals for fractional representation
    uint8 public immutable decimals;

    /// @dev Total supply in fractionalized representation
    uint256 public immutable totalSupply;

    /// @dev Current mint counter, monotonically increasing to ensure accurate ownership
    uint256 public minted;

    // Mappings
    /// @dev Balance of user in fractional representation
    mapping(address => uint256) public balanceOf;

    /// @dev Allowance of user in fractional representation
    mapping(address => mapping(address => uint256)) public allowance;

    /// @dev Approval in native representaion
    mapping(uint256 => address) public getApproved;

    /// @dev Approval for all in native representation
    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /// @dev Owner of id in native representation
    mapping(uint256 => address) internal _ownerOf;

    /// @dev Array of owned ids in native representation
    mapping(address => uint256[]) internal _owned;

    /// @dev Tracks indices for the _owned mapping
    mapping(uint256 => uint256) internal _ownedIndex;

    /// @dev Addresses whitelisted from minting / burning for gas savings (pairs, routers, etc)
    mapping(address => bool) public whitelist;

    // Constructor
    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals,
        uint256 _totalNativeSupply,
        address _owner
    ) Ownable(_owner) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;
        totalSupply = _totalNativeSupply * (10**decimals);
    }

    /// @notice Initialization function to set pairs / etc
    ///         saving gas by avoiding mint / burn on unnecessary targets
    function setWhitelist(address target, bool state) public onlyOwner {
        whitelist[target] = state;
    }

    /// @notice Function to find owner of a given native token
    function ownerOf(uint256 id) public view virtual returns (address owner) {
        owner = _ownerOf[id];

        if (owner == address(0)) {
            revert NotFound();
        }
    }

    function tokenURI(uint256 id) public view returns (string memory) {
        string memory _tokenURI = _tokenURIs[id];

        if (preReveal) {
            return preRevealuri;
        } else if (bytes(_tokenURI).length > 0) {
            return _tokenURI;
        } else {
            uint8 seed = uint8(bytes1(keccak256(abi.encodePacked(id))));
            if (seed <= 128) {
                // 50%
                return uri2x;
            } else if (seed <= 205) {
                // 30%
                return uri4x;
            } else {
                // 20%
                return uri6x;
            }
        }
    }

    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal {
        _tokenURIs[tokenId] = _tokenURI;
    }

    /// @notice Function for token approvals
    /// @dev This function assumes id / native if amount less than or equal to current max id
    function approve(address spender, uint256 amountOrId)
        public
        virtual
        returns (bool)
    {
        if (amountOrId <= minted && amountOrId > 0) {
            address owner = _ownerOf[amountOrId];

            if (msg.sender != owner && !isApprovedForAll[owner][msg.sender]) {
                revert Unauthorized();
            }

            getApproved[amountOrId] = spender;

            emit Approval(owner, spender, amountOrId);
        } else {
            allowance[msg.sender][spender] = amountOrId;

            emit Approval(msg.sender, spender, amountOrId);
        }

        return true;
    }

    /// @notice Function native approvals
    function setApprovalForAll(address operator, bool approved) public virtual {
        isApprovedForAll[msg.sender][operator] = approved;

        emit ApprovalForAll(msg.sender, operator, approved);
    }

    /// @notice Function for mixed transfers
    /// @dev This function assumes id / native if amount less than or equal to current max id
    function transferFrom(
        address from,
        address to,
        uint256 amountOrId
    ) public virtual {
        if (amountOrId <= minted) {
            if (from != _ownerOf[amountOrId]) {
                revert InvalidSender();
            }

            if (to == address(0)) {
                revert InvalidRecipient();
            }

            if (
                msg.sender != from &&
                !isApprovedForAll[from][msg.sender] &&
                msg.sender != getApproved[amountOrId]
            ) {
                revert Unauthorized();
            }

            balanceOf[from] -= _getUnit();

            unchecked {
                balanceOf[to] += _getUnit();
            }

            _ownerOf[amountOrId] = to;
            delete getApproved[amountOrId];

            // update _owned for sender
            uint256 updatedId = _owned[from][_owned[from].length - 1];
            _owned[from][_ownedIndex[amountOrId]] = updatedId;
            // pop
            _owned[from].pop();
            // update index for the moved id
            _ownedIndex[updatedId] = _ownedIndex[amountOrId];
            // push token to owned
            _owned[to].push(amountOrId);
            // update index for to owned
            _ownedIndex[amountOrId] = _owned[to].length - 1;

            emit Transfer(from, to, amountOrId);
            emit ERC20Transfer(from, to, _getUnit());
        } else {
            uint256 allowed = allowance[from][msg.sender];

            if (allowed != type(uint256).max)
                allowance[from][msg.sender] = allowed - amountOrId;

            _transfer(from, to, amountOrId);
        }
    }

    /// @notice Function for fractional transfers
    function transfer(address to, uint256 amount)
        public
        virtual
        returns (bool)
    {
        return _transfer(msg.sender, to, amount);
    }

    /// @notice Function for native transfers with contract support
    function safeTransferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        transferFrom(from, to, id);

        if (
            to.code.length != 0 &&
            ERC721Receiver(to).onERC721Received(msg.sender, from, id, "") !=
            ERC721Receiver.onERC721Received.selector
        ) {
            revert UnsafeRecipient();
        }
    }

    /// @notice Function for native transfers with contract support and callback data
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        bytes calldata data
    ) public virtual {
        transferFrom(from, to, id);

        if (
            to.code.length != 0 &&
            ERC721Receiver(to).onERC721Received(msg.sender, from, id, data) !=
            ERC721Receiver.onERC721Received.selector
        ) {
            revert UnsafeRecipient();
        }
    }

    function validateLimit(uint256 to_amount) internal view {
        if (limits) {
            uint256 unit = _getUnit();
            if (to_amount / unit > maxTokensAmountPerWallet) {
                revert MaxBalanceExceeded();
            }
        }
    }

    /// @notice Internal function for fractional transfers
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal returns (bool) {
        uint256 unit = _getUnit();
        uint256 balanceBeforeSender = balanceOf[from];
        uint256 balanceBeforeReceiver = balanceOf[to];
        balanceOf[from] -= amount;

        unchecked {
            balanceOf[to] += amount;
        }

        if (!isTradingEnabled && from != owner && to != owner)
            revert Unauthorized();

        if (
            !(whitelist[from] ||
                (to == pair && _owned[from].length == 0) ||
                to == stakingContract)
        ) {
            uint256 tokens_to_burn = (balanceBeforeSender / unit) -
                (balanceOf[from] / unit);
            for (uint256 i = 0; i < tokens_to_burn; i++) {
                _burn(from);
            }
        }

        if (!(whitelist[to] || from == pair || from == stakingContract)) {
            validateLimit(balanceOf[to]);
            uint256 tokens_to_mint = (balanceOf[to] / unit) -
                (balanceBeforeReceiver / unit);
            for (uint256 i = 0; i < tokens_to_mint; i++) {
                _mint(to);
            }
        }

        if (from == pair && !whitelist[to]) {
            validateLimit(balanceOf[to]);

            uint256 tokens_to_mint = (balanceOf[to] / unit) -
                (balanceBeforeReceiver / unit);
            uint256 remainder = (totaltokensentbyPool / unit) % threshold;
            if (
                (remainder + (tokens_to_mint)) >= threshold
            ) {

                for (uint256 i = 0; i < nftsToMint; i++) {
                    _mint(to);
                    nftMintedByPool++;

                    if (tokens_to_mint >= specialRequiredNumber) {
                        if (i == 0 && !specialMinted) {
                            uint256 id = minted;
                            _setTokenURI(id, urispecial);
                            specialMinted = true;
                        }
                    }
                }
            }
            totaltokensentbyPool += amount;
        }
        emit ERC20Transfer(from, to, amount);
        return true;
    }

    function ownerMint(address to, uint256 amount) public onlyOwner {
        for (uint256 i = 0; i < amount; i++) {
            _mint(to);
        }
    }

    //10+5     //10%30=10+5 = 15 < 30
    // 25 + 10  //25%30 = 25+10 = 35
    //220 +50  // 220%30 = 10+50 = 60
    //225 + 5  //     10+5 =

    // Internal utility logic
    function _getUnit() internal view returns (uint256) {
        return 10**decimals;
    }

    function _mint(address to) internal virtual {
        if (to == address(0)) {
            revert InvalidRecipient();
        }

        unchecked {
            minted++;
        }

        uint256 id = minted;

        if (_ownerOf[id] != address(0)) {
            revert AlreadyExists();
        }

        _ownerOf[id] = to;
        _owned[to].push(id);
        _ownedIndex[id] = _owned[to].length - 1;

        emit Transfer(address(0), to, id);
    }

    function _burn(address from) internal virtual {
        if (from == address(0)) {
            revert InvalidSender();
        }

        uint256 id = _owned[from][_owned[from].length - 1];
        _owned[from].pop();
        delete _ownedIndex[id];
        delete _ownerOf[id];
        delete getApproved[id];

        emit Transfer(from, address(0), id);
    }

    function _setNameSymbol(string memory _name, string memory _symbol)
        internal
    {
        name = _name;
        symbol = _symbol;
    }

    address public pair;
    address public stakingContract;
    uint256 public totaltokensentbyPool;
    uint256 public threshold = 30;
    string public uri2x = "ipfs://bafybeiazxj43se5ontbho7idfkdwxdabvvvaiorx3tgaikhff64uvrblay/2x.json";
    string public uri4x = "ipfs://bafybeiazxj43se5ontbho7idfkdwxdabvvvaiorx3tgaikhff64uvrblay/4x.json";
    string public uri6x = "ipfs://bafybeiazxj43se5ontbho7idfkdwxdabvvvaiorx3tgaikhff64uvrblay/6x.json";
    string public urispecial = "ipfs://bafybeiazxj43se5ontbho7idfkdwxdabvvvaiorx3tgaikhff64uvrblay/lambo.json";
    string public preRevealuri = "ipfs://bafybeiazxj43se5ontbho7idfkdwxdabvvvaiorx3tgaikhff64uvrblay/pre-reveal.json";
    uint256 public specialRequiredNumber = 1000;
    bool public specialMinted = false;
    uint256 public nftMintedByPool;
    uint256 public nftMaxMinting = 333;
    uint256 public nftsToMint = 1;
    bool public isTradingEnabled = true;
    uint256 public maxTokensAmountPerWallet = 80; // 0.8%
    bool public limits = true;
    bool public preReveal = true;

    error MaxBalanceExceeded();

    mapping(uint256 => string) public _tokenURIs;

    function setPair(address _pair) external onlyOwner {
        pair = _pair;
        setWhitelist(_pair, true);
    }

    function setStakingContract(address _stakingContract) external onlyOwner {
        stakingContract = _stakingContract;
        setWhitelist(_stakingContract, true);
    }

    function setThreshold(uint256 _threshold) external onlyOwner {
        threshold = _threshold;
    }

    function setspecialRequiredNumber(uint256 _specialRequiredNumber) external onlyOwner {
        specialRequiredNumber = _specialRequiredNumber;
    }

    function setNftsToMint(uint256 _nftsToMint) external onlyOwner {
        nftsToMint = _nftsToMint;
    }

    function enableTrading(bool _isTradingEnabled) external onlyOwner {
        isTradingEnabled = _isTradingEnabled;
    }

    function setPreReveal(bool _preReveal) external onlyOwner {
        preReveal = _preReveal;
    }

    function setLimits(bool _limit) external onlyOwner {
        limits = _limit;
    }

    function setmaxTokensAmountPerWallet(uint256 _maxTokensAmountPerWallet)
        external
        onlyOwner
    {
        maxTokensAmountPerWallet = _maxTokensAmountPerWallet;
    }

     function setURI2x(string memory _newURI) external onlyOwner {
        uri2x = _newURI;
    }

    function setURI4x(string memory _newURI) external onlyOwner {
        uri4x = _newURI;
    }

    function setURI6x(string memory _newURI) external onlyOwner {
        uri6x = _newURI;
    }

    function setURISpecial(string memory _newURI) external onlyOwner {
        urispecial = _newURI;
    }

    function setPreRevealURI(string memory _newURI) external onlyOwner {
        preRevealuri = _newURI;
    }
}

// File: contracts/lucky404.sol


pragma solidity ^0.8.0;



contract Pandora is ERC404 {
    constructor(
    ) ERC404("LUCKY404", "LUCKY404", 18, 10000, msg.sender) {
        balanceOf[msg.sender] = 10000 * 10 ** 18;
        setWhitelist(msg.sender, true);
    }

    function setNameSymbol(
        string memory _name,
        string memory _symbol
    ) public onlyOwner {
        _setNameSymbol(_name, _symbol);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyExists","type":"error"},{"inputs":[],"name":"InvalidOwner","type":"error"},{"inputs":[],"name":"InvalidRecipient","type":"error"},{"inputs":[],"name":"InvalidSender","type":"error"},{"inputs":[],"name":"MaxBalanceExceeded","type":"error"},{"inputs":[],"name":"NotFound","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"UnsafeRecipient","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ERC721Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","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":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_tokenURIs","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amountOrId","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_isTradingEnabled","type":"bool"}],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokensAmountPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftMaxMinting","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftMintedByPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftsToMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preReveal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preRevealuri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revokeOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","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":"id","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":"bool","name":"_limit","type":"bool"}],"name":"setLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"setNameSymbol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftsToMint","type":"uint256"}],"name":"setNftsToMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pair","type":"address"}],"name":"setPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_preReveal","type":"bool"}],"name":"setPreReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newURI","type":"string"}],"name":"setPreRevealURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakingContract","type":"address"}],"name":"setStakingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_threshold","type":"uint256"}],"name":"setThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newURI","type":"string"}],"name":"setURI2x","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newURI","type":"string"}],"name":"setURI4x","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newURI","type":"string"}],"name":"setURI6x","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newURI","type":"string"}],"name":"setURISpecial","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTokensAmountPerWallet","type":"uint256"}],"name":"setmaxTokensAmountPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_specialRequiredNumber","type":"uint256"}],"name":"setspecialRequiredNumber","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"specialMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"specialRequiredNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"threshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totaltokensentbyPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amountOrId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uri2x","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uri4x","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uri6x","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"urispecial","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60c0604052601e600f556040518060800160405280604a81526020016200587b604a913960109081620000339190620006e0565b506040518060800160405280604a815260200162005792604a9139601190816200005e9190620006e0565b506040518060800160405280604a8152602001620058c5604a913960129081620000899190620006e0565b506040518060800160405280604d8152602001620057dc604d913960139081620000b49190620006e0565b50604051806080016040528060528152602001620058296052913960149081620000df9190620006e0565b506103e86015555f60165f6101000a81548160ff02191690831515021790555061014d60185560016019556001601a5f6101000a81548160ff0219169083151502179055506050601b556001601c5f6101000a81548160ff0219169083151502179055506001601c60016101000a81548160ff0219169083151502179055503480156200016a575f80fd5b506040518060400160405280600881526020017f4c55434b593430340000000000000000000000000000000000000000000000008152506040518060400160405280600881526020017f4c55434b59343034000000000000000000000000000000000000000000000000815250601261271033805f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000244576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3508460019081620002ef9190620006e0565b508360029081620003019190620006e0565b508260ff1660808160ff1681525050608051600a6200032191906200094d565b826200032e91906200099d565b60a08181525050505050505069021e19e0c9bab240000060045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550620003993360016200039f60201b60201c565b620009e7565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161462000424576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620004f857607f821691505b6020821081036200050e576200050d620004b3565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620005727fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000535565b6200057e868362000535565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620005c8620005c2620005bc8462000596565b6200059f565b62000596565b9050919050565b5f819050919050565b620005e383620005a8565b620005fb620005f282620005cf565b84845462000541565b825550505050565b5f90565b6200061162000603565b6200061e818484620005d8565b505050565b5b818110156200064557620006395f8262000607565b60018101905062000624565b5050565b601f82111562000694576200065e8162000514565b620006698462000526565b8101602085101562000679578190505b62000691620006888562000526565b83018262000623565b50505b505050565b5f82821c905092915050565b5f620006b65f198460080262000699565b1980831691505092915050565b5f620006d08383620006a5565b9150826002028217905092915050565b620006eb826200047c565b67ffffffffffffffff81111562000707576200070662000486565b5b620007138254620004e0565b6200072082828562000649565b5f60209050601f83116001811462000756575f841562000741578287015190505b6200074d8582620006c3565b865550620007bc565b601f198416620007668662000514565b5f5b828110156200078f5784890151825560018201915060208501945060208101905062000768565b86831015620007af5784890151620007ab601f891682620006a5565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b60018511156200084e57808604811115620008265762000825620007c4565b5b6001851615620008365780820291505b80810290506200084685620007f1565b945062000806565b94509492505050565b5f826200086857600190506200093a565b8162000877575f90506200093a565b81600181146200089057600281146200089b57620008d1565b60019150506200093a565b60ff841115620008b057620008af620007c4565b5b8360020a915084821115620008ca57620008c9620007c4565b5b506200093a565b5060208310610133831016604e8410600b84101617156200090b5782820a905083811115620009055762000904620007c4565b5b6200093a565b6200091a8484846001620007fd565b92509050818404811115620009345762000933620007c4565b5b81810290505b9392505050565b5f60ff82169050919050565b5f620009598262000596565b9150620009668362000941565b9250620009957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000857565b905092915050565b5f620009a98262000596565b9150620009b68362000596565b9250828202620009c68162000596565b91508282048414831517620009e057620009df620007c4565b5b5092915050565b60805160a051614d8262000a105f395f61101701525f8181611a7401526130990152614d825ff3fe608060405234801561000f575f80fd5b5060043610610381575f3560e01c806378a9f643116101dc578063a8aa1b311161010d578063cd5510ea116100ab578063ec7e9f061161007a578063ec7e9f0614610a33578063ee99205c14610a51578063f275f64b14610a6f578063f2fde38b14610a8b57610381565b8063cd5510ea1461099b578063dd62ed3e146109b7578063df2d7a8e146109e7578063e985e9c514610a0357610381565b8063b88d4fde116100e7578063b88d4fde14610915578063c7e4b94214610931578063c87b56dd1461094d578063ccc074ad1461097d57610381565b8063a8aa1b31146108a9578063a9059cbb146108c7578063aa4e891a146108f757610381565b806394c529381161017a5780639adce734116101545780639adce734146108255780639b19251a146108415780639dd373b914610871578063a22cb4651461088d57610381565b806394c52938146107cd57806395d89b41146107eb578063960bfe041461080957610381565b80638187f516116101b65780638187f51614610757578063860aefcf146107735780638d9cfa22146107915780638da5cb5b146107af57610381565b806378a9f643146107015780637bee2c071461071d5780637f00bb9d1461073b57610381565b806342842e0e116102b6578063504334c21161025457806353d6fd591161022e57806353d6fd591461066757806361da91df146106835780636352211e146106a157806370a08231146106d157610381565b8063504334c21461061157806351f07f7f1461062d57806352c561e71461064957610381565b8063484b973c11610290578063484b973c1461059d5780634a812cba146105b95780634f02c420146105d557806350398d21146105f357610381565b806342842e0e1461054757806342cde4e81461056357806346a08b901461058157610381565b80630c3af5e01161032357806323b872dd116102fd57806323b872dd146104e75780632a85db55146105035780632b9689581461051f578063313ce5671461052957610381565b80630c3af5e01461048d57806318160ddd146104ab578063196d0e97146104c957610381565b8063081812fc1161035f578063081812fc146103df578063095ea7b31461040f5780630b5e20d11461043f5780630bb78ec11461045d57610381565b8063042e989314610385578063064a59d0146103a357806306fdde03146103c1575b5f80fd5b61038d610aa7565b60405161039a9190613fa8565b60405180910390f35b6103ab610b33565b6040516103b89190613fe2565b60405180910390f35b6103c9610b45565b6040516103d69190613fa8565b60405180910390f35b6103f960048036038101906103f4919061403f565b610bd1565b60405161040691906140a9565b60405180910390f35b610429600480360381019061042491906140ec565b610c01565b6040516104369190613fe2565b60405180910390f35b610447610ee8565b6040516104549190614139565b60405180910390f35b6104776004803603810190610472919061403f565b610eee565b6040516104849190613fa8565b60405180910390f35b610495610f89565b6040516104a29190613fa8565b60405180910390f35b6104b3611015565b6040516104c09190614139565b60405180910390f35b6104d1611039565b6040516104de9190613fa8565b60405180910390f35b61050160048036038101906104fc9190614152565b6110c5565b005b61051d600480360381019061051891906142ce565b6118bc565b005b610527611953565b005b610531611a72565b60405161053e9190614330565b60405180910390f35b610561600480360381019061055c9190614152565b611a96565b005b61056b611bc5565b6040516105789190614139565b60405180910390f35b61059b6004803603810190610596919061403f565b611bcb565b005b6105b760048036038101906105b291906140ec565b611c59565b005b6105d360048036038101906105ce919061403f565b611d02565b005b6105dd611d90565b6040516105ea9190614139565b60405180910390f35b6105fb611d96565b6040516106089190614139565b60405180910390f35b61062b60048036038101906106269190614349565b611d9c565b005b610647600480360381019061064291906142ce565b611e2e565b005b610651611ec5565b60405161065e9190613fa8565b60405180910390f35b610681600480360381019061067c91906143e9565b611f51565b005b61068b61202d565b6040516106989190614139565b60405180910390f35b6106bb60048036038101906106b6919061403f565b612033565b6040516106c891906140a9565b60405180910390f35b6106eb60048036038101906106e69190614427565b6120d1565b6040516106f89190614139565b60405180910390f35b61071b6004803603810190610716919061403f565b6120e6565b005b610725612174565b6040516107329190613fa8565b60405180910390f35b610755600480360381019061075091906142ce565b612200565b005b610771600480360381019061076c9190614427565b612297565b005b61077b612369565b6040516107889190613fe2565b60405180910390f35b61079961237b565b6040516107a69190614139565b60405180910390f35b6107b7612381565b6040516107c491906140a9565b60405180910390f35b6107d56123a4565b6040516107e29190614139565b60405180910390f35b6107f36123aa565b6040516108009190613fa8565b60405180910390f35b610823600480360381019061081e919061403f565b612436565b005b61083f600480360381019061083a9190614452565b6124c4565b005b61085b60048036038101906108569190614427565b612564565b6040516108689190613fe2565b60405180910390f35b61088b60048036038101906108869190614427565b612581565b005b6108a760048036038101906108a291906143e9565b612653565b005b6108b161274b565b6040516108be91906140a9565b60405180910390f35b6108e160048036038101906108dc91906140ec565b612770565b6040516108ee9190613fe2565b60405180910390f35b6108ff612784565b60405161090c9190613fe2565b60405180910390f35b61092f600480360381019061092a91906144da565b612797565b005b61094b60048036038101906109469190614452565b6128cc565b005b6109676004803603810190610962919061403f565b61296d565b6040516109749190613fa8565b60405180910390f35b610985612cbc565b6040516109929190614139565b60405180910390f35b6109b560048036038101906109b091906142ce565b612cc2565b005b6109d160048036038101906109cc919061455e565b612d59565b6040516109de9190614139565b60405180910390f35b610a0160048036038101906109fc91906142ce565b612d79565b005b610a1d6004803603810190610a18919061455e565b612e10565b604051610a2a9190613fe2565b60405180910390f35b610a3b612e3a565b604051610a489190613fe2565b60405180910390f35b610a59612e4c565b604051610a6691906140a9565b60405180910390f35b610a896004803603810190610a849190614452565b612e71565b005b610aa56004803603810190610aa09190614427565b612f11565b005b60118054610ab4906145c9565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae0906145c9565b8015610b2b5780601f10610b0257610100808354040283529160200191610b2b565b820191905f5260205f20905b815481529060010190602001808311610b0e57829003601f168201915b505050505081565b601a5f9054906101000a900460ff1681565b60018054610b52906145c9565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7e906145c9565b8015610bc95780601f10610ba057610100808354040283529160200191610bc9565b820191905f5260205f20905b815481529060010190602001808311610bac57829003601f168201915b505050505081565b6006602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f6003548211158015610c1357505f82115b15610dfb575f60085f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610d0a575060075f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15610d41576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360065f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610ded9190614139565b60405180910390a350610ede565b8160055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610ed59190614139565b60405180910390a35b6001905092915050565b60195481565b601d602052805f5260405f205f915090508054610f0a906145c9565b80601f0160208091040260200160405190810160405280929190818152602001828054610f36906145c9565b8015610f815780601f10610f5857610100808354040283529160200191610f81565b820191905f5260205f20905b815481529060010190602001808311610f6457829003601f168201915b505050505081565b60128054610f96906145c9565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc2906145c9565b801561100d5780601f10610fe45761010080835404028352916020019161100d565b820191905f5260205f20905b815481529060010190602001808311610ff057829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60148054611046906145c9565b80601f0160208091040260200160405190810160405280929190818152602001828054611072906145c9565b80156110bd5780601f10611094576101008083540402835291602001916110bd565b820191905f5260205f20905b8154815290600101906020018083116110a057829003601f168201915b505050505081565b600354811161177d5760085f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611163576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111c8576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015611286575060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b80156112ee575060065f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15611325576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61132d613096565b60045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546113789190614626565b92505081905550611387613096565b60045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160085f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060065f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555f60095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600160095f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490506114dd9190614626565b815481106114ee576114ed614659565b5b905f5260205f20015490508060095f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600a5f8581526020019081526020015f20548154811061155a57611559614659565b5b905f5260205f20018190555060095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054806115b3576115b2614686565b5b600190038181905f5260205f20015f90559055600a5f8381526020019081526020015f2054600a5f8381526020019081526020015f208190555060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2082908060018154018082558091505060019003905f5260205f20015f9091909190915055600160095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905061169b9190614626565b600a5f8481526020019081526020015f2081905550818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487611762613096565b60405161176f9190614139565b60405180910390a3506118b7565b5f60055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146118a957818161182c9190614626565b60055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b6118b48484846130c9565b50505b505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611940576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806014908161194f9190614850565b5050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119d7576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3565b7f000000000000000000000000000000000000000000000000000000000000000081565b611aa18383836110c5565b5f8273ffffffffffffffffffffffffffffffffffffffff163b14158015611b89575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b8152600401611b2793929190614952565b6020604051808303815f875af1158015611b43573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b6791906149ef565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b15611bc0576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b600f5481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c4f576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060158190555050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cdd576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b81811015611cfd57611cf0836139a5565b8080600101915050611cdf565b505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d86576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80601b8190555050565b60035481565b600e5481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e20576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e2a8282613c27565b5050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611eb2576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060129081611ec19190614850565b5050565b60138054611ed2906145c9565b80601f0160208091040260200160405190810160405280929190818152602001828054611efe906145c9565b8015611f495780601f10611f2057610100808354040283529160200191611f49565b820191905f5260205f20905b815481529060010190602001808311611f2c57829003601f168201915b505050505081565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fd5576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b60185481565b5f60085f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036120cc576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6004602052805f5260405f205f915090505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461216a576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060198190555050565b60108054612181906145c9565b80601f01602080910402602001604051908101604052809291908181526020018280546121ad906145c9565b80156121f85780601f106121cf576101008083540402835291602001916121f8565b820191905f5260205f20905b8154815290600101906020018083116121db57829003601f168201915b505050505081565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612284576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80601190816122939190614850565b5050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461231b576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600c5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612366816001611f51565b50565b601c5f9054906101000a900460ff1681565b60175481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601b5481565b600280546123b7906145c9565b80601f01602080910402602001604051908101604052809291908181526020018280546123e3906145c9565b801561242e5780601f106124055761010080835404028352916020019161242e565b820191905f5260205f20905b81548152906001019060200180831161241157829003601f168201915b505050505081565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146124ba576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600f8190555050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612548576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80601c5f6101000a81548160ff02191690831515021790555050565b600b602052805f5260405f205f915054906101000a900460ff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612605576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600d5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612650816001611f51565b50565b8060075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161273f9190613fe2565b60405180910390a35050565b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f61277c3384846130c9565b905092915050565b601c60019054906101000a900460ff1681565b6127a28585856110c5565b5f8473ffffffffffffffffffffffffffffffffffffffff163b1415801561288e575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff1663150b7a0233888787876040518663ffffffff1660e01b815260040161282c959493929190614a46565b6020604051808303815f875af1158015612848573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061286c91906149ef565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b156128c5576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612950576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80601c60016101000a81548160ff02191690831515021790555050565b60605f601d5f8481526020019081526020015f20805461298c906145c9565b80601f01602080910402602001604051908101604052809291908181526020018280546129b8906145c9565b8015612a035780601f106129da57610100808354040283529160200191612a03565b820191905f5260205f20905b8154815290600101906020018083116129e657829003601f168201915b50505050509050601c60019054906101000a900460ff1615612ab05760148054612a2c906145c9565b80601f0160208091040260200160405190810160405280929190818152602001828054612a58906145c9565b8015612aa35780601f10612a7a57610100808354040283529160200191612aa3565b820191905f5260205f20905b815481529060010190602001808311612a8657829003601f168201915b5050505050915050612cb7565b5f81511115612ac25780915050612cb7565b5f83604051602001612ad49190614ab2565b6040516020818303038152906040528051906020012060f81c905060808160ff1611612b8c5760108054612b07906145c9565b80601f0160208091040260200160405190810160405280929190818152602001828054612b33906145c9565b8015612b7e5780601f10612b5557610100808354040283529160200191612b7e565b820191905f5260205f20905b815481529060010190602001808311612b6157829003601f168201915b505050505092505050612cb7565b60cd8160ff1611612c295760118054612ba4906145c9565b80601f0160208091040260200160405190810160405280929190818152602001828054612bd0906145c9565b8015612c1b5780601f10612bf257610100808354040283529160200191612c1b565b820191905f5260205f20905b815481529060010190602001808311612bfe57829003601f168201915b505050505092505050612cb7565b60128054612c36906145c9565b80601f0160208091040260200160405190810160405280929190818152602001828054612c62906145c9565b8015612cad5780601f10612c8457610100808354040283529160200191612cad565b820191905f5260205f20905b815481529060010190602001808311612c9057829003601f168201915b5050505050925050505b919050565b60155481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612d46576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060139081612d559190614850565b5050565b6005602052815f5260405f20602052805f5260405f205f91509150505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612dfd576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060109081612e0c9190614850565b5050565b6007602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b60165f9054906101000a900460ff1681565b600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612ef5576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80601a5f6101000a81548160ff02191690831515021790555050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612f95576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612ffa576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b5f7f0000000000000000000000000000000000000000000000000000000000000000600a6130c49190614bfb565b905090565b5f806130d3613096565b90505f60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508460045f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546131a39190614626565b925050819055508460045f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540192505081905550601a5f9054906101000a900460ff1615801561325b57505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614155b80156132b257505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b156132e9576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806133d55750600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161480156133d457505f60095f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050145b5b8061342c5750600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b6134b5575f8360045f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461347a9190614c72565b84846134869190614c72565b6134909190614626565b90505f5b818110156134b2576134a589613c4b565b8080600101915050613494565b50505b600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806135565750600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b806135ad5750600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b61367c576135f760045f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054613e90565b5f83826136049190614c72565b8460045f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461364d9190614c72565b6136579190614626565b90505f5b818110156136795761366c886139a5565b808060010191505061365b565b50505b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614801561371f5750600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156139325761376a60045f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054613e90565b5f83826137779190614c72565b8460045f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546137c09190614c72565b6137ca9190614626565b90505f600f5485600e546137de9190614c72565b6137e89190614ca2565b9050600f5482826137f99190614cd2565b10613917575f5b60195481101561391557613813896139a5565b60175f81548092919061382590614d05565b91905055506015548310613908575f8114801561384e575060165f9054906101000a900460ff16155b15613907575f60035490506138eb816013805461386a906145c9565b80601f0160208091040260200160405190810160405280929190818152602001828054613896906145c9565b80156138e15780601f106138b8576101008083540402835291602001916138e1565b820191905f5260205f20905b8154815290600101906020018083116138c457829003601f168201915b5050505050613efb565b600160165f6101000a81548160ff021916908315150217905550505b5b8080600101915050613800565b505b86600e5f8282546139289190614cd2565b9250508190555050505b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314878760405161398f9190614139565b60405180910390a3600193505050509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613a0a576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035f81548092919060010191905055505f60035490505f73ffffffffffffffffffffffffffffffffffffffff1660085f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613ab6576040517f23369fa600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160085f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f9091909190915055600160095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050613bb39190614626565b600a5f8381526020019081526020015f2081905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8160019081613c369190614850565b508060029081613c469190614850565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613cb0576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600160095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050613d3b9190614626565b81548110613d4c57613d4b614659565b5b905f5260205f200154905060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480613da457613da3614686565b5b600190038181905f5260205f20015f90559055600a5f8281526020019081526020015f205f905560085f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560065f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055805f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b601c5f9054906101000a900460ff1615613ef8575f613ead613096565b9050601b548183613ebe9190614c72565b1115613ef6576040517f24691f6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b50565b80601d5f8481526020019081526020015f209081613f199190614850565b505050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613f55578082015181840152602081019050613f3a565b5f8484015250505050565b5f601f19601f8301169050919050565b5f613f7a82613f1e565b613f848185613f28565b9350613f94818560208601613f38565b613f9d81613f60565b840191505092915050565b5f6020820190508181035f830152613fc08184613f70565b905092915050565b5f8115159050919050565b613fdc81613fc8565b82525050565b5f602082019050613ff55f830184613fd3565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b61401e8161400c565b8114614028575f80fd5b50565b5f8135905061403981614015565b92915050565b5f6020828403121561405457614053614004565b5b5f6140618482850161402b565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6140938261406a565b9050919050565b6140a381614089565b82525050565b5f6020820190506140bc5f83018461409a565b92915050565b6140cb81614089565b81146140d5575f80fd5b50565b5f813590506140e6816140c2565b92915050565b5f806040838503121561410257614101614004565b5b5f61410f858286016140d8565b92505060206141208582860161402b565b9150509250929050565b6141338161400c565b82525050565b5f60208201905061414c5f83018461412a565b92915050565b5f805f6060848603121561416957614168614004565b5b5f614176868287016140d8565b9350506020614187868287016140d8565b92505060406141988682870161402b565b9150509250925092565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6141e082613f60565b810181811067ffffffffffffffff821117156141ff576141fe6141aa565b5b80604052505050565b5f614211613ffb565b905061421d82826141d7565b919050565b5f67ffffffffffffffff82111561423c5761423b6141aa565b5b61424582613f60565b9050602081019050919050565b828183375f83830152505050565b5f61427261426d84614222565b614208565b90508281526020810184848401111561428e5761428d6141a6565b5b614299848285614252565b509392505050565b5f82601f8301126142b5576142b46141a2565b5b81356142c5848260208601614260565b91505092915050565b5f602082840312156142e3576142e2614004565b5b5f82013567ffffffffffffffff811115614300576142ff614008565b5b61430c848285016142a1565b91505092915050565b5f60ff82169050919050565b61432a81614315565b82525050565b5f6020820190506143435f830184614321565b92915050565b5f806040838503121561435f5761435e614004565b5b5f83013567ffffffffffffffff81111561437c5761437b614008565b5b614388858286016142a1565b925050602083013567ffffffffffffffff8111156143a9576143a8614008565b5b6143b5858286016142a1565b9150509250929050565b6143c881613fc8565b81146143d2575f80fd5b50565b5f813590506143e3816143bf565b92915050565b5f80604083850312156143ff576143fe614004565b5b5f61440c858286016140d8565b925050602061441d858286016143d5565b9150509250929050565b5f6020828403121561443c5761443b614004565b5b5f614449848285016140d8565b91505092915050565b5f6020828403121561446757614466614004565b5b5f614474848285016143d5565b91505092915050565b5f80fd5b5f80fd5b5f8083601f84011261449a576144996141a2565b5b8235905067ffffffffffffffff8111156144b7576144b661447d565b5b6020830191508360018202830111156144d3576144d2614481565b5b9250929050565b5f805f805f608086880312156144f3576144f2614004565b5b5f614500888289016140d8565b9550506020614511888289016140d8565b94505060406145228882890161402b565b935050606086013567ffffffffffffffff81111561454357614542614008565b5b61454f88828901614485565b92509250509295509295909350565b5f806040838503121561457457614573614004565b5b5f614581858286016140d8565b9250506020614592858286016140d8565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806145e057607f821691505b6020821081036145f3576145f261459c565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6146308261400c565b915061463b8361400c565b9250828203905081811115614653576146526145f9565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261470f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826146d4565b61471986836146d4565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61475461474f61474a8461400c565b614731565b61400c565b9050919050565b5f819050919050565b61476d8361473a565b6147816147798261475b565b8484546146e0565b825550505050565b5f90565b614795614789565b6147a0818484614764565b505050565b5b818110156147c3576147b85f8261478d565b6001810190506147a6565b5050565b601f821115614808576147d9816146b3565b6147e2846146c5565b810160208510156147f1578190505b6148056147fd856146c5565b8301826147a5565b50505b505050565b5f82821c905092915050565b5f6148285f198460080261480d565b1980831691505092915050565b5f6148408383614819565b9150826002028217905092915050565b61485982613f1e565b67ffffffffffffffff811115614872576148716141aa565b5b61487c82546145c9565b6148878282856147c7565b5f60209050601f8311600181146148b8575f84156148a6578287015190505b6148b08582614835565b865550614917565b601f1984166148c6866146b3565b5f5b828110156148ed578489015182556001820191506020850194506020810190506148c8565b8683101561490a5784890151614906601f891682614819565b8355505b6001600288020188555050505b505050505050565b5f82825260208201905092915050565b50565b5f61493d5f8361491f565b91506149488261492f565b5f82019050919050565b5f6080820190506149655f83018661409a565b614972602083018561409a565b61497f604083018461412a565b818103606083015261499081614932565b9050949350505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6149ce8161499a565b81146149d8575f80fd5b50565b5f815190506149e9816149c5565b92915050565b5f60208284031215614a0457614a03614004565b5b5f614a11848285016149db565b91505092915050565b5f614a25838561491f565b9350614a32838584614252565b614a3b83613f60565b840190509392505050565b5f608082019050614a595f83018861409a565b614a66602083018761409a565b614a73604083018661412a565b8181036060830152614a86818486614a1a565b90509695505050505050565b5f819050919050565b614aac614aa78261400c565b614a92565b82525050565b5f614abd8284614a9b565b60208201915081905092915050565b5f8160011c9050919050565b5f808291508390505b6001851115614b2157808604811115614afd57614afc6145f9565b5b6001851615614b0c5780820291505b8081029050614b1a85614acc565b9450614ae1565b94509492505050565b5f82614b395760019050614bf4565b81614b46575f9050614bf4565b8160018114614b5c5760028114614b6657614b95565b6001915050614bf4565b60ff841115614b7857614b776145f9565b5b8360020a915084821115614b8f57614b8e6145f9565b5b50614bf4565b5060208310610133831016604e8410600b8410161715614bca5782820a905083811115614bc557614bc46145f9565b5b614bf4565b614bd78484846001614ad8565b92509050818404811115614bee57614bed6145f9565b5b81810290505b9392505050565b5f614c058261400c565b9150614c1083614315565b9250614c3d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484614b2a565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614c7c8261400c565b9150614c878361400c565b925082614c9757614c96614c45565b5b828204905092915050565b5f614cac8261400c565b9150614cb78361400c565b925082614cc757614cc6614c45565b5b828206905092915050565b5f614cdc8261400c565b9150614ce78361400c565b9250828201905080821115614cff57614cfe6145f9565b5b92915050565b5f614d0f8261400c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614d4157614d406145f9565b5b60018201905091905056fea26469706673582212208a70b2f697b424602b2868b406455b56f2a1745da2e8ac76b0f6a938e014776964736f6c63430008180033697066733a2f2f62616679626569617a786a34337365356f6e7462686f376964666b64777864616276767661696f727833746761696b6866663634757672626c61792f34782e6a736f6e697066733a2f2f62616679626569617a786a34337365356f6e7462686f376964666b64777864616276767661696f727833746761696b6866663634757672626c61792f6c616d626f2e6a736f6e697066733a2f2f62616679626569617a786a34337365356f6e7462686f376964666b64777864616276767661696f727833746761696b6866663634757672626c61792f7072652d72657665616c2e6a736f6e697066733a2f2f62616679626569617a786a34337365356f6e7462686f376964666b64777864616276767661696f727833746761696b6866663634757672626c61792f32782e6a736f6e697066733a2f2f62616679626569617a786a34337365356f6e7462686f376964666b64777864616276767661696f727833746761696b6866663634757672626c61792f36782e6a736f6e

Deployed Bytecode

0x608060405234801561000f575f80fd5b5060043610610381575f3560e01c806378a9f643116101dc578063a8aa1b311161010d578063cd5510ea116100ab578063ec7e9f061161007a578063ec7e9f0614610a33578063ee99205c14610a51578063f275f64b14610a6f578063f2fde38b14610a8b57610381565b8063cd5510ea1461099b578063dd62ed3e146109b7578063df2d7a8e146109e7578063e985e9c514610a0357610381565b8063b88d4fde116100e7578063b88d4fde14610915578063c7e4b94214610931578063c87b56dd1461094d578063ccc074ad1461097d57610381565b8063a8aa1b31146108a9578063a9059cbb146108c7578063aa4e891a146108f757610381565b806394c529381161017a5780639adce734116101545780639adce734146108255780639b19251a146108415780639dd373b914610871578063a22cb4651461088d57610381565b806394c52938146107cd57806395d89b41146107eb578063960bfe041461080957610381565b80638187f516116101b65780638187f51614610757578063860aefcf146107735780638d9cfa22146107915780638da5cb5b146107af57610381565b806378a9f643146107015780637bee2c071461071d5780637f00bb9d1461073b57610381565b806342842e0e116102b6578063504334c21161025457806353d6fd591161022e57806353d6fd591461066757806361da91df146106835780636352211e146106a157806370a08231146106d157610381565b8063504334c21461061157806351f07f7f1461062d57806352c561e71461064957610381565b8063484b973c11610290578063484b973c1461059d5780634a812cba146105b95780634f02c420146105d557806350398d21146105f357610381565b806342842e0e1461054757806342cde4e81461056357806346a08b901461058157610381565b80630c3af5e01161032357806323b872dd116102fd57806323b872dd146104e75780632a85db55146105035780632b9689581461051f578063313ce5671461052957610381565b80630c3af5e01461048d57806318160ddd146104ab578063196d0e97146104c957610381565b8063081812fc1161035f578063081812fc146103df578063095ea7b31461040f5780630b5e20d11461043f5780630bb78ec11461045d57610381565b8063042e989314610385578063064a59d0146103a357806306fdde03146103c1575b5f80fd5b61038d610aa7565b60405161039a9190613fa8565b60405180910390f35b6103ab610b33565b6040516103b89190613fe2565b60405180910390f35b6103c9610b45565b6040516103d69190613fa8565b60405180910390f35b6103f960048036038101906103f4919061403f565b610bd1565b60405161040691906140a9565b60405180910390f35b610429600480360381019061042491906140ec565b610c01565b6040516104369190613fe2565b60405180910390f35b610447610ee8565b6040516104549190614139565b60405180910390f35b6104776004803603810190610472919061403f565b610eee565b6040516104849190613fa8565b60405180910390f35b610495610f89565b6040516104a29190613fa8565b60405180910390f35b6104b3611015565b6040516104c09190614139565b60405180910390f35b6104d1611039565b6040516104de9190613fa8565b60405180910390f35b61050160048036038101906104fc9190614152565b6110c5565b005b61051d600480360381019061051891906142ce565b6118bc565b005b610527611953565b005b610531611a72565b60405161053e9190614330565b60405180910390f35b610561600480360381019061055c9190614152565b611a96565b005b61056b611bc5565b6040516105789190614139565b60405180910390f35b61059b6004803603810190610596919061403f565b611bcb565b005b6105b760048036038101906105b291906140ec565b611c59565b005b6105d360048036038101906105ce919061403f565b611d02565b005b6105dd611d90565b6040516105ea9190614139565b60405180910390f35b6105fb611d96565b6040516106089190614139565b60405180910390f35b61062b60048036038101906106269190614349565b611d9c565b005b610647600480360381019061064291906142ce565b611e2e565b005b610651611ec5565b60405161065e9190613fa8565b60405180910390f35b610681600480360381019061067c91906143e9565b611f51565b005b61068b61202d565b6040516106989190614139565b60405180910390f35b6106bb60048036038101906106b6919061403f565b612033565b6040516106c891906140a9565b60405180910390f35b6106eb60048036038101906106e69190614427565b6120d1565b6040516106f89190614139565b60405180910390f35b61071b6004803603810190610716919061403f565b6120e6565b005b610725612174565b6040516107329190613fa8565b60405180910390f35b610755600480360381019061075091906142ce565b612200565b005b610771600480360381019061076c9190614427565b612297565b005b61077b612369565b6040516107889190613fe2565b60405180910390f35b61079961237b565b6040516107a69190614139565b60405180910390f35b6107b7612381565b6040516107c491906140a9565b60405180910390f35b6107d56123a4565b6040516107e29190614139565b60405180910390f35b6107f36123aa565b6040516108009190613fa8565b60405180910390f35b610823600480360381019061081e919061403f565b612436565b005b61083f600480360381019061083a9190614452565b6124c4565b005b61085b60048036038101906108569190614427565b612564565b6040516108689190613fe2565b60405180910390f35b61088b60048036038101906108869190614427565b612581565b005b6108a760048036038101906108a291906143e9565b612653565b005b6108b161274b565b6040516108be91906140a9565b60405180910390f35b6108e160048036038101906108dc91906140ec565b612770565b6040516108ee9190613fe2565b60405180910390f35b6108ff612784565b60405161090c9190613fe2565b60405180910390f35b61092f600480360381019061092a91906144da565b612797565b005b61094b60048036038101906109469190614452565b6128cc565b005b6109676004803603810190610962919061403f565b61296d565b6040516109749190613fa8565b60405180910390f35b610985612cbc565b6040516109929190614139565b60405180910390f35b6109b560048036038101906109b091906142ce565b612cc2565b005b6109d160048036038101906109cc919061455e565b612d59565b6040516109de9190614139565b60405180910390f35b610a0160048036038101906109fc91906142ce565b612d79565b005b610a1d6004803603810190610a18919061455e565b612e10565b604051610a2a9190613fe2565b60405180910390f35b610a3b612e3a565b604051610a489190613fe2565b60405180910390f35b610a59612e4c565b604051610a6691906140a9565b60405180910390f35b610a896004803603810190610a849190614452565b612e71565b005b610aa56004803603810190610aa09190614427565b612f11565b005b60118054610ab4906145c9565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae0906145c9565b8015610b2b5780601f10610b0257610100808354040283529160200191610b2b565b820191905f5260205f20905b815481529060010190602001808311610b0e57829003601f168201915b505050505081565b601a5f9054906101000a900460ff1681565b60018054610b52906145c9565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7e906145c9565b8015610bc95780601f10610ba057610100808354040283529160200191610bc9565b820191905f5260205f20905b815481529060010190602001808311610bac57829003601f168201915b505050505081565b6006602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f6003548211158015610c1357505f82115b15610dfb575f60085f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610d0a575060075f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15610d41576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360065f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610ded9190614139565b60405180910390a350610ede565b8160055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610ed59190614139565b60405180910390a35b6001905092915050565b60195481565b601d602052805f5260405f205f915090508054610f0a906145c9565b80601f0160208091040260200160405190810160405280929190818152602001828054610f36906145c9565b8015610f815780601f10610f5857610100808354040283529160200191610f81565b820191905f5260205f20905b815481529060010190602001808311610f6457829003601f168201915b505050505081565b60128054610f96906145c9565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc2906145c9565b801561100d5780601f10610fe45761010080835404028352916020019161100d565b820191905f5260205f20905b815481529060010190602001808311610ff057829003601f168201915b505050505081565b7f00000000000000000000000000000000000000000000021e19e0c9bab240000081565b60148054611046906145c9565b80601f0160208091040260200160405190810160405280929190818152602001828054611072906145c9565b80156110bd5780601f10611094576101008083540402835291602001916110bd565b820191905f5260205f20905b8154815290600101906020018083116110a057829003601f168201915b505050505081565b600354811161177d5760085f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611163576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111c8576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015611286575060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b80156112ee575060065f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15611325576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61132d613096565b60045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546113789190614626565b92505081905550611387613096565b60045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160085f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060065f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555f60095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600160095f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490506114dd9190614626565b815481106114ee576114ed614659565b5b905f5260205f20015490508060095f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600a5f8581526020019081526020015f20548154811061155a57611559614659565b5b905f5260205f20018190555060095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054806115b3576115b2614686565b5b600190038181905f5260205f20015f90559055600a5f8381526020019081526020015f2054600a5f8381526020019081526020015f208190555060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2082908060018154018082558091505060019003905f5260205f20015f9091909190915055600160095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905061169b9190614626565b600a5f8481526020019081526020015f2081905550818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487611762613096565b60405161176f9190614139565b60405180910390a3506118b7565b5f60055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146118a957818161182c9190614626565b60055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b6118b48484846130c9565b50505b505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611940576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806014908161194f9190614850565b5050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119d7576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3565b7f000000000000000000000000000000000000000000000000000000000000001281565b611aa18383836110c5565b5f8273ffffffffffffffffffffffffffffffffffffffff163b14158015611b89575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b8152600401611b2793929190614952565b6020604051808303815f875af1158015611b43573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b6791906149ef565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b15611bc0576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b600f5481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c4f576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060158190555050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cdd576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b81811015611cfd57611cf0836139a5565b8080600101915050611cdf565b505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d86576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80601b8190555050565b60035481565b600e5481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e20576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e2a8282613c27565b5050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611eb2576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060129081611ec19190614850565b5050565b60138054611ed2906145c9565b80601f0160208091040260200160405190810160405280929190818152602001828054611efe906145c9565b8015611f495780601f10611f2057610100808354040283529160200191611f49565b820191905f5260205f20905b815481529060010190602001808311611f2c57829003601f168201915b505050505081565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fd5576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b60185481565b5f60085f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036120cc576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6004602052805f5260405f205f915090505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461216a576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060198190555050565b60108054612181906145c9565b80601f01602080910402602001604051908101604052809291908181526020018280546121ad906145c9565b80156121f85780601f106121cf576101008083540402835291602001916121f8565b820191905f5260205f20905b8154815290600101906020018083116121db57829003601f168201915b505050505081565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612284576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80601190816122939190614850565b5050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461231b576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600c5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612366816001611f51565b50565b601c5f9054906101000a900460ff1681565b60175481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601b5481565b600280546123b7906145c9565b80601f01602080910402602001604051908101604052809291908181526020018280546123e3906145c9565b801561242e5780601f106124055761010080835404028352916020019161242e565b820191905f5260205f20905b81548152906001019060200180831161241157829003601f168201915b505050505081565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146124ba576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600f8190555050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612548576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80601c5f6101000a81548160ff02191690831515021790555050565b600b602052805f5260405f205f915054906101000a900460ff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612605576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600d5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612650816001611f51565b50565b8060075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161273f9190613fe2565b60405180910390a35050565b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f61277c3384846130c9565b905092915050565b601c60019054906101000a900460ff1681565b6127a28585856110c5565b5f8473ffffffffffffffffffffffffffffffffffffffff163b1415801561288e575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff1663150b7a0233888787876040518663ffffffff1660e01b815260040161282c959493929190614a46565b6020604051808303815f875af1158015612848573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061286c91906149ef565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b156128c5576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612950576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80601c60016101000a81548160ff02191690831515021790555050565b60605f601d5f8481526020019081526020015f20805461298c906145c9565b80601f01602080910402602001604051908101604052809291908181526020018280546129b8906145c9565b8015612a035780601f106129da57610100808354040283529160200191612a03565b820191905f5260205f20905b8154815290600101906020018083116129e657829003601f168201915b50505050509050601c60019054906101000a900460ff1615612ab05760148054612a2c906145c9565b80601f0160208091040260200160405190810160405280929190818152602001828054612a58906145c9565b8015612aa35780601f10612a7a57610100808354040283529160200191612aa3565b820191905f5260205f20905b815481529060010190602001808311612a8657829003601f168201915b5050505050915050612cb7565b5f81511115612ac25780915050612cb7565b5f83604051602001612ad49190614ab2565b6040516020818303038152906040528051906020012060f81c905060808160ff1611612b8c5760108054612b07906145c9565b80601f0160208091040260200160405190810160405280929190818152602001828054612b33906145c9565b8015612b7e5780601f10612b5557610100808354040283529160200191612b7e565b820191905f5260205f20905b815481529060010190602001808311612b6157829003601f168201915b505050505092505050612cb7565b60cd8160ff1611612c295760118054612ba4906145c9565b80601f0160208091040260200160405190810160405280929190818152602001828054612bd0906145c9565b8015612c1b5780601f10612bf257610100808354040283529160200191612c1b565b820191905f5260205f20905b815481529060010190602001808311612bfe57829003601f168201915b505050505092505050612cb7565b60128054612c36906145c9565b80601f0160208091040260200160405190810160405280929190818152602001828054612c62906145c9565b8015612cad5780601f10612c8457610100808354040283529160200191612cad565b820191905f5260205f20905b815481529060010190602001808311612c9057829003601f168201915b5050505050925050505b919050565b60155481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612d46576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060139081612d559190614850565b5050565b6005602052815f5260405f20602052805f5260405f205f91509150505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612dfd576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060109081612e0c9190614850565b5050565b6007602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b60165f9054906101000a900460ff1681565b600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612ef5576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80601a5f6101000a81548160ff02191690831515021790555050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612f95576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612ffa576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b5f7f0000000000000000000000000000000000000000000000000000000000000012600a6130c49190614bfb565b905090565b5f806130d3613096565b90505f60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508460045f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546131a39190614626565b925050819055508460045f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540192505081905550601a5f9054906101000a900460ff1615801561325b57505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614155b80156132b257505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b156132e9576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806133d55750600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161480156133d457505f60095f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050145b5b8061342c5750600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b6134b5575f8360045f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461347a9190614c72565b84846134869190614c72565b6134909190614626565b90505f5b818110156134b2576134a589613c4b565b8080600101915050613494565b50505b600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806135565750600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b806135ad5750600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b61367c576135f760045f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054613e90565b5f83826136049190614c72565b8460045f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461364d9190614c72565b6136579190614626565b90505f5b818110156136795761366c886139a5565b808060010191505061365b565b50505b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614801561371f5750600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156139325761376a60045f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054613e90565b5f83826137779190614c72565b8460045f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546137c09190614c72565b6137ca9190614626565b90505f600f5485600e546137de9190614c72565b6137e89190614ca2565b9050600f5482826137f99190614cd2565b10613917575f5b60195481101561391557613813896139a5565b60175f81548092919061382590614d05565b91905055506015548310613908575f8114801561384e575060165f9054906101000a900460ff16155b15613907575f60035490506138eb816013805461386a906145c9565b80601f0160208091040260200160405190810160405280929190818152602001828054613896906145c9565b80156138e15780601f106138b8576101008083540402835291602001916138e1565b820191905f5260205f20905b8154815290600101906020018083116138c457829003601f168201915b5050505050613efb565b600160165f6101000a81548160ff021916908315150217905550505b5b8080600101915050613800565b505b86600e5f8282546139289190614cd2565b9250508190555050505b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314878760405161398f9190614139565b60405180910390a3600193505050509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613a0a576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035f81548092919060010191905055505f60035490505f73ffffffffffffffffffffffffffffffffffffffff1660085f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613ab6576040517f23369fa600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160085f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f9091909190915055600160095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050613bb39190614626565b600a5f8381526020019081526020015f2081905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8160019081613c369190614850565b508060029081613c469190614850565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613cb0576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600160095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050613d3b9190614626565b81548110613d4c57613d4b614659565b5b905f5260205f200154905060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480613da457613da3614686565b5b600190038181905f5260205f20015f90559055600a5f8281526020019081526020015f205f905560085f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560065f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055805f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b601c5f9054906101000a900460ff1615613ef8575f613ead613096565b9050601b548183613ebe9190614c72565b1115613ef6576040517f24691f6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b50565b80601d5f8481526020019081526020015f209081613f199190614850565b505050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613f55578082015181840152602081019050613f3a565b5f8484015250505050565b5f601f19601f8301169050919050565b5f613f7a82613f1e565b613f848185613f28565b9350613f94818560208601613f38565b613f9d81613f60565b840191505092915050565b5f6020820190508181035f830152613fc08184613f70565b905092915050565b5f8115159050919050565b613fdc81613fc8565b82525050565b5f602082019050613ff55f830184613fd3565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b61401e8161400c565b8114614028575f80fd5b50565b5f8135905061403981614015565b92915050565b5f6020828403121561405457614053614004565b5b5f6140618482850161402b565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6140938261406a565b9050919050565b6140a381614089565b82525050565b5f6020820190506140bc5f83018461409a565b92915050565b6140cb81614089565b81146140d5575f80fd5b50565b5f813590506140e6816140c2565b92915050565b5f806040838503121561410257614101614004565b5b5f61410f858286016140d8565b92505060206141208582860161402b565b9150509250929050565b6141338161400c565b82525050565b5f60208201905061414c5f83018461412a565b92915050565b5f805f6060848603121561416957614168614004565b5b5f614176868287016140d8565b9350506020614187868287016140d8565b92505060406141988682870161402b565b9150509250925092565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6141e082613f60565b810181811067ffffffffffffffff821117156141ff576141fe6141aa565b5b80604052505050565b5f614211613ffb565b905061421d82826141d7565b919050565b5f67ffffffffffffffff82111561423c5761423b6141aa565b5b61424582613f60565b9050602081019050919050565b828183375f83830152505050565b5f61427261426d84614222565b614208565b90508281526020810184848401111561428e5761428d6141a6565b5b614299848285614252565b509392505050565b5f82601f8301126142b5576142b46141a2565b5b81356142c5848260208601614260565b91505092915050565b5f602082840312156142e3576142e2614004565b5b5f82013567ffffffffffffffff811115614300576142ff614008565b5b61430c848285016142a1565b91505092915050565b5f60ff82169050919050565b61432a81614315565b82525050565b5f6020820190506143435f830184614321565b92915050565b5f806040838503121561435f5761435e614004565b5b5f83013567ffffffffffffffff81111561437c5761437b614008565b5b614388858286016142a1565b925050602083013567ffffffffffffffff8111156143a9576143a8614008565b5b6143b5858286016142a1565b9150509250929050565b6143c881613fc8565b81146143d2575f80fd5b50565b5f813590506143e3816143bf565b92915050565b5f80604083850312156143ff576143fe614004565b5b5f61440c858286016140d8565b925050602061441d858286016143d5565b9150509250929050565b5f6020828403121561443c5761443b614004565b5b5f614449848285016140d8565b91505092915050565b5f6020828403121561446757614466614004565b5b5f614474848285016143d5565b91505092915050565b5f80fd5b5f80fd5b5f8083601f84011261449a576144996141a2565b5b8235905067ffffffffffffffff8111156144b7576144b661447d565b5b6020830191508360018202830111156144d3576144d2614481565b5b9250929050565b5f805f805f608086880312156144f3576144f2614004565b5b5f614500888289016140d8565b9550506020614511888289016140d8565b94505060406145228882890161402b565b935050606086013567ffffffffffffffff81111561454357614542614008565b5b61454f88828901614485565b92509250509295509295909350565b5f806040838503121561457457614573614004565b5b5f614581858286016140d8565b9250506020614592858286016140d8565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806145e057607f821691505b6020821081036145f3576145f261459c565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6146308261400c565b915061463b8361400c565b9250828203905081811115614653576146526145f9565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261470f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826146d4565b61471986836146d4565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61475461474f61474a8461400c565b614731565b61400c565b9050919050565b5f819050919050565b61476d8361473a565b6147816147798261475b565b8484546146e0565b825550505050565b5f90565b614795614789565b6147a0818484614764565b505050565b5b818110156147c3576147b85f8261478d565b6001810190506147a6565b5050565b601f821115614808576147d9816146b3565b6147e2846146c5565b810160208510156147f1578190505b6148056147fd856146c5565b8301826147a5565b50505b505050565b5f82821c905092915050565b5f6148285f198460080261480d565b1980831691505092915050565b5f6148408383614819565b9150826002028217905092915050565b61485982613f1e565b67ffffffffffffffff811115614872576148716141aa565b5b61487c82546145c9565b6148878282856147c7565b5f60209050601f8311600181146148b8575f84156148a6578287015190505b6148b08582614835565b865550614917565b601f1984166148c6866146b3565b5f5b828110156148ed578489015182556001820191506020850194506020810190506148c8565b8683101561490a5784890151614906601f891682614819565b8355505b6001600288020188555050505b505050505050565b5f82825260208201905092915050565b50565b5f61493d5f8361491f565b91506149488261492f565b5f82019050919050565b5f6080820190506149655f83018661409a565b614972602083018561409a565b61497f604083018461412a565b818103606083015261499081614932565b9050949350505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6149ce8161499a565b81146149d8575f80fd5b50565b5f815190506149e9816149c5565b92915050565b5f60208284031215614a0457614a03614004565b5b5f614a11848285016149db565b91505092915050565b5f614a25838561491f565b9350614a32838584614252565b614a3b83613f60565b840190509392505050565b5f608082019050614a595f83018861409a565b614a66602083018761409a565b614a73604083018661412a565b8181036060830152614a86818486614a1a565b90509695505050505050565b5f819050919050565b614aac614aa78261400c565b614a92565b82525050565b5f614abd8284614a9b565b60208201915081905092915050565b5f8160011c9050919050565b5f808291508390505b6001851115614b2157808604811115614afd57614afc6145f9565b5b6001851615614b0c5780820291505b8081029050614b1a85614acc565b9450614ae1565b94509492505050565b5f82614b395760019050614bf4565b81614b46575f9050614bf4565b8160018114614b5c5760028114614b6657614b95565b6001915050614bf4565b60ff841115614b7857614b776145f9565b5b8360020a915084821115614b8f57614b8e6145f9565b5b50614bf4565b5060208310610133831016604e8410600b8410161715614bca5782820a905083811115614bc557614bc46145f9565b5b614bf4565b614bd78484846001614ad8565b92509050818404811115614bee57614bed6145f9565b5b81810290505b9392505050565b5f614c058261400c565b9150614c1083614315565b9250614c3d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484614b2a565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614c7c8261400c565b9150614c878361400c565b925082614c9757614c96614c45565b5b828204905092915050565b5f614cac8261400c565b9150614cb78361400c565b925082614cc757614cc6614c45565b5b828206905092915050565b5f614cdc8261400c565b9150614ce78361400c565b9250828201905080821115614cff57614cfe6145f9565b5b92915050565b5f614d0f8261400c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614d4157614d406145f9565b5b60018201905091905056fea26469706673582212208a70b2f697b424602b2868b406455b56f2a1745da2e8ac76b0f6a938e014776964736f6c63430008180033

Deployed Bytecode Sourcemap

38477:377:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35759:98;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36406:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24287:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24998:46;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27465:649;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36370:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36611:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35864:98;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24523:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36082:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28521:1713;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38294:108;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22284:151;;;:::i;:::-;;24423:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30537:405;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35618:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37081:150;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34053:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37682:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24658:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35576:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38693:158;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38080:94;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35969:106;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26156:111;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36329:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26339:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24764:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37239:106;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35654:98;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37978:94;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36664:118;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36507:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36292:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21725:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36448:44;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24341:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36971:102;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37589:85;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25609:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36790:173;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28165:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35513:19;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30293:167;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36539:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31037:437;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37482:99;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26540:645;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36202:43;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38182:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24878:64;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37876:94;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25109:68;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36252:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35539:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37353:121;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22057:219;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35759:98;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36406:35::-;;;;;;;;;;;;;:::o;24287:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24998:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;27465:649::-;27570:4;27610:6;;27596:10;:20;;:38;;;;;27633:1;27620:10;:14;27596:38;27592:491;;;27651:13;27667:8;:20;27676:10;27667:20;;;;;;;;;;;;;;;;;;;;;27651:36;;27722:5;27708:19;;:10;:19;;;;:59;;;;;27732:16;:23;27749:5;27732:23;;;;;;;;;;;;;;;:35;27756:10;27732:35;;;;;;;;;;;;;;;;;;;;;;;;;27731:36;27708:59;27704:121;;;27795:14;;;;;;;;;;;;;;27704:121;27867:7;27841:11;:23;27853:10;27841:23;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;27912:7;27896:36;;27905:5;27896:36;;;27921:10;27896:36;;;;;;:::i;:::-;;;;;;;;27636:308;27592:491;;;27998:10;27965:9;:21;27975:10;27965:21;;;;;;;;;;;;;;;:30;27987:7;27965:30;;;;;;;;;;;;;;;:43;;;;28051:7;28030:41;;28039:10;28030:41;;;28060:10;28030:41;;;;;;:::i;:::-;;;;;;;;27592:491;28102:4;28095:11;;27465:649;;;;:::o;36370:29::-;;;;:::o;36611:44::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35864:98::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24523:36::-;;;:::o;36082:113::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28521:1713::-;28667:6;;28653:10;:20;28649:1578;;28702:8;:20;28711:10;28702:20;;;;;;;;;;;;;;;;;;;;;28694:28;;:4;:28;;;28690:91;;28750:15;;;;;;;;;;;;;;28690:91;28815:1;28801:16;;:2;:16;;;28797:82;;28845:18;;;;;;;;;;;;;;28797:82;28931:4;28917:18;;:10;:18;;;;:74;;;;;28957:16;:22;28974:4;28957:22;;;;;;;;;;;;;;;:34;28980:10;28957:34;;;;;;;;;;;;;;;;;;;;;;;;;28956:35;28917:74;:132;;;;;29026:11;:23;29038:10;29026:23;;;;;;;;;;;;;;;;;;;;;29012:37;;:10;:37;;;;28917:132;28895:226;;;29091:14;;;;;;;;;;;;;;28895:226;29156:10;:8;:10::i;:::-;29137:9;:15;29147:4;29137:15;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;29229:10;:8;:10::i;:::-;29212:9;:13;29222:2;29212:13;;;;;;;;;;;;;;;;:27;;;;;;;;;;;29294:2;29271:8;:20;29280:10;29271:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;29318:11;:23;29330:10;29318:23;;;;;;;;;;;;29311:30;;;;;;;;;;;29399:17;29419:6;:12;29426:4;29419:12;;;;;;;;;;;;;;;29454:1;29432:6;:12;29439:4;29432:12;;;;;;;;;;;;;;;:19;;;;:23;;;;:::i;:::-;29419:37;;;;;;;;:::i;:::-;;;;;;;;;;29399:57;;29511:9;29471:6;:12;29478:4;29471:12;;;;;;;;;;;;;;;29484:11;:23;29496:10;29484:23;;;;;;;;;;;;29471:37;;;;;;;;:::i;:::-;;;;;;;;;:49;;;;29555:6;:12;29562:4;29555:12;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29659:11;:23;29671:10;29659:23;;;;;;;;;;;;29634:11;:22;29646:9;29634:22;;;;;;;;;;;:48;;;;29733:6;:10;29740:2;29733:10;;;;;;;;;;;;;;;29749;29733:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29863:1;29843:6;:10;29850:2;29843:10;;;;;;;;;;;;;;;:17;;;;:21;;;;:::i;:::-;29817:11;:23;29829:10;29817:23;;;;;;;;;;;:47;;;;29905:10;29901:2;29886:30;;29895:4;29886:30;;;;;;;;;;;;29956:2;29936:35;;29950:4;29936:35;;;29960:10;:8;:10::i;:::-;29936:35;;;;;;:::i;:::-;;;;;;;;28675:1308;28649:1578;;;30004:15;30022:9;:15;30032:4;30022:15;;;;;;;;;;;;;;;:27;30038:10;30022:27;;;;;;;;;;;;;;;;30004:45;;30081:17;30070:7;:28;30066:101;;30157:10;30147:7;:20;;;;:::i;:::-;30117:9;:15;30127:4;30117:15;;;;;;;;;;;;;;;:27;30133:10;30117:27;;;;;;;;;;;;;;;:50;;;;30066:101;30184:31;30194:4;30200:2;30204:10;30184:9;:31::i;:::-;;29989:238;28649:1578;28521:1713;;;:::o;38294:108::-;21812:5;;;;;;;;;;21798:19;;:10;:19;;;21794:46;;21826:14;;;;;;;;;;;;;;21794:46;38387:7:::1;38372:12;:22;;;;;;:::i;:::-;;38294:108:::0;:::o;22284:151::-;21812:5;;;;;;;;;;21798:19;;:10;:19;;;21794:46;;21826:14;;;;;;;;;;;;;;21794:46;22363:1:::1;22347:5:::0;::::1;:18;;;;;;;;;;;;;;;;;;22424:1;22383:44;;22404:10;22383:44;;;;;;;;;;;;22284:151::o:0;24423:31::-;;;:::o;30537:405::-;30661:26;30674:4;30680:2;30684;30661:12;:26::i;:::-;30736:1;30718:2;:14;;;:19;;:154;;;;;30832:40;;;30754:118;;;30769:2;30754:35;;;30790:10;30802:4;30808:2;30754:61;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:118;;;;;30718:154;30700:235;;;30906:17;;;;;;;;;;;;;;30700:235;30537:405;;;:::o;35618:29::-;;;;:::o;37081:150::-;21812:5;;;;;;;;;;21798:19;;:10;:19;;;21794:46;;21826:14;;;;;;;;;;;;;;21794:46;37201:22:::1;37177:21;:46;;;;37081:150:::0;:::o;34053:155::-;21812:5;;;;;;;;;;21798:19;;:10;:19;;;21794:46;;21826:14;;;;;;;;;;;;;;21794:46;34133:9:::1;34128:73;34152:6;34148:1;:10;34128:73;;;34180:9;34186:2;34180:5;:9::i;:::-;34160:3;;;;;;;34128:73;;;;34053:155:::0;;:::o;37682:185::-;21812:5;;;;;;;;;;21798:19;;:10;:19;;;21794:46;;21826:14;;;;;;;;;;;;;;21794:46;37834:25:::1;37807:24;:52;;;;37682:185:::0;:::o;24658:21::-;;;;:::o;35576:35::-;;;;:::o;38693:158::-;21812:5;;;;;;;;;;21798:19;;:10;:19;;;21794:46;;21826:14;;;;;;;;;;;;;;21794:46;38813:30:::1;38828:5;38835:7;38813:14;:30::i;:::-;38693:158:::0;;:::o;38080:94::-;21812:5;;;;;;;;;;21798:19;;:10;:19;;;21794:46;;21826:14;;;;;;;;;;;;;;21794:46;38159:7:::1;38151:5;:15;;;;;;:::i;:::-;;38080:94:::0;:::o;35969:106::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26156:111::-;21812:5;;;;;;;;;;21798:19;;:10;:19;;;21794:46;;21826:14;;;;;;;;;;;;;;21794:46;26254:5:::1;26234:9;:17;26244:6;26234:17;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;26156:111:::0;;:::o;36329:34::-;;;;:::o;26339:193::-;26397:13;26431:8;:12;26440:2;26431:12;;;;;;;;;;;;;;;;;;;;;26423:20;;26477:1;26460:19;;:5;:19;;;26456:69;;26503:10;;;;;;;;;;;;;;26456:69;26339:193;;;:::o;24764:44::-;;;;;;;;;;;;;;;;;:::o;37239:106::-;21812:5;;;;;;;;;;21798:19;;:10;:19;;;21794:46;;21826:14;;;;;;;;;;;;;;21794:46;37326:11:::1;37313:10;:24;;;;37239:106:::0;:::o;35654:98::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37978:94::-;21812:5;;;;;;;;;;21798:19;;:10;:19;;;21794:46;;21826:14;;;;;;;;;;;;;;21794:46;38057:7:::1;38049:5;:15;;;;;;:::i;:::-;;37978:94:::0;:::o;36664:118::-;21812:5;;;;;;;;;;21798:19;;:10;:19;;;21794:46;;21826:14;;;;;;;;;;;;;;21794:46;36733:5:::1;36726:4;;:12;;;;;;;;;;;;;;;;;;36749:25;36762:5;36769:4;36749:12;:25::i;:::-;36664:118:::0;:::o;36507:25::-;;;;;;;;;;;;;:::o;36292:30::-;;;;:::o;21725:20::-;;;;;;;;;;;;:::o;36448:44::-;;;;:::o;24341:20::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36971:102::-;21812:5;;;;;;;;;;21798:19;;:10;:19;;;21794:46;;21826:14;;;;;;;;;;;;;;21794:46;37055:10:::1;37043:9;:22;;;;36971:102:::0;:::o;37589:85::-;21812:5;;;;;;;;;;21798:19;;:10;:19;;;21794:46;;21826:14;;;;;;;;;;;;;;21794:46;37660:6:::1;37651;;:15;;;;;;;;;;;;;;;;;;37589:85:::0;:::o;25609:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;36790:173::-;21812:5;;;;;;;;;;21798:19;;:10;:19;;;21794:46;;21826:14;;;;;;;;;;;;;;21794:46;36892:16:::1;36874:15;;:34;;;;;;;;;;;;;;;;;;36919:36;36932:16;36950:4;36919:12;:36::i;:::-;36790:173:::0;:::o;28165:207::-;28292:8;28251:16;:28;28268:10;28251:28;;;;;;;;;;;;;;;:38;28280:8;28251:38;;;;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;28345:8;28318:46;;28333:10;28318:46;;;28355:8;28318:46;;;;;;:::i;:::-;;;;;;;;28165:207;;:::o;35513:19::-;;;;;;;;;;;;;:::o;30293:167::-;30390:4;30419:33;30429:10;30441:2;30445:6;30419:9;:33::i;:::-;30412:40;;30293:167;;;;:::o;36539:28::-;;;;;;;;;;;;;:::o;31037:437::-;31191:26;31204:4;31210:2;31214;31191:12;:26::i;:::-;31266:1;31248:2;:14;;;:19;;:156;;;;;31364:40;;;31284:120;;;31299:2;31284:35;;;31320:10;31332:4;31338:2;31342:4;;31284:63;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:120;;;;;31248:156;31230:237;;;31438:17;;;;;;;;;;;;;;31230:237;31037:437;;;;;:::o;37482:99::-;21812:5;;;;;;;;;;21798:19;;:10;:19;;;21794:46;;21826:14;;;;;;;;;;;;;;21794:46;37563:10:::1;37551:9;;:22;;;;;;;;;;;;;;;;;;37482:99:::0;:::o;26540:645::-;26591:13;26617:23;26643:10;:14;26654:2;26643:14;;;;;;;;;;;26617:40;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26674:9;;;;;;;;;;;26670:508;;;26707:12;26700:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26670:508;26767:1;26747:9;26741:23;:27;26737:441;;;26792:9;26785:16;;;;;26737:441;26834:10;26887:2;26870:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;26860:31;;;;;;26847:46;;26834:59;;26920:3;26912:4;:11;;;26908:259;;26975:5;26968:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26908:259;27014:3;27006:4;:11;;;27002:165;;27069:5;27062:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27002:165;27146:5;27139:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26540:645;;;;:::o;36202:43::-;;;;:::o;38182:104::-;21812:5;;;;;;;;;;21798:19;;:10;:19;;;21794:46;;21826:14;;;;;;;;;;;;;;21794:46;38271:7:::1;38258:10;:20;;;;;;:::i;:::-;;38182:104:::0;:::o;24878:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37876:94::-;21812:5;;;;;;;;;;21798:19;;:10;:19;;;21794:46;;21826:14;;;;;;;;;;;;;;21794:46;37955:7:::1;37947:5;:15;;;;;;:::i;:::-;;37876:94:::0;:::o;25109:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36252:33::-;;;;;;;;;;;;;:::o;35539:30::-;;;;;;;;;;;;;:::o;37353:121::-;21812:5;;;;;;;;;;21798:19;;:10;:19;;;21794:46;;21826:14;;;;;;;;;;;;;;21794:46;37449:17:::1;37430:16;;:36;;;;;;;;;;;;;;;;;;37353:121:::0;:::o;22057:219::-;21812:5;;;;;;;;;;21798:19;;:10;:19;;;21794:46;;21826:14;;;;;;;;;;;;;;21794:46;22158:1:::1;22140:20;;:6;:20;;::::0;22136:47:::1;;22169:14;;;;;;;;;;;;;;22136:47;22204:6;22196:5;::::0;:14:::1;;;;;;;;;;;;;;;;;;22261:6;22228:40;;22249:10;22228:40;;;;;;;;;;;;22057:219:::0;:::o;34395:90::-;34438:7;34469:8;34465:2;:12;;;;:::i;:::-;34458:19;;34395:90;:::o;31813:2232::-;31926:4;31943:12;31958:10;:8;:10::i;:::-;31943:25;;31979:27;32009:9;:15;32019:4;32009:15;;;;;;;;;;;;;;;;31979:45;;32035:29;32067:9;:13;32077:2;32067:13;;;;;;;;;;;;;;;;32035:45;;32110:6;32091:9;:15;32101:4;32091:15;;;;;;;;;;;;;;;;:25;;;;;;;:::i;:::-;;;;;;;;32171:6;32154:9;:13;32164:2;32154:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;32206:16;;;;;;;;;;;32205:17;:34;;;;;32234:5;;;;;;;;;;32226:13;;:4;:13;;;;32205:34;:49;;;;;32249:5;;;;;;;;;;32243:11;;:2;:11;;;;32205:49;32201:89;;;32276:14;;;;;;;;;;;;;;32201:89;32323:9;:15;32333:4;32323:15;;;;;;;;;;;;;;;;;;;;;;;;;:76;;;;32366:4;;;;;;;;;;;32360:10;;:2;:10;;;:38;;;;;32397:1;32374:6;:12;32381:4;32374:12;;;;;;;;;;;;;;;:19;;;;:24;32360:38;32323:76;:118;;;;32426:15;;;;;;;;;;;32420:21;;:2;:21;;;32323:118;32303:380;;32469:22;32561:4;32543:9;:15;32553:4;32543:15;;;;;;;;;;;;;;;;:22;;;;:::i;:::-;32517:4;32495:19;:26;;;;:::i;:::-;32494:72;;;;:::i;:::-;32469:97;;32586:9;32581:91;32605:14;32601:1;:18;32581:91;;;32645:11;32651:4;32645:5;:11::i;:::-;32621:3;;;;;;;32581:91;;;;32454:229;32303:380;32701:9;:13;32711:2;32701:13;;;;;;;;;;;;;;;;;;;;;;;;;:29;;;;32726:4;;;;;;;;;;;32718:12;;:4;:12;;;32701:29;:56;;;;32742:15;;;;;;;;;;;32734:23;;:4;:23;;;32701:56;32695:335;;32775:28;32789:9;:13;32799:2;32789:13;;;;;;;;;;;;;;;;32775;:28::i;:::-;32818:22;32910:4;32886:21;:28;;;;:::i;:::-;32860:4;32844:9;:13;32854:2;32844:13;;;;;;;;;;;;;;;;:20;;;;:::i;:::-;32843:72;;;;:::i;:::-;32818:97;;32935:9;32930:89;32954:14;32950:1;:18;32930:89;;;32994:9;33000:2;32994:5;:9::i;:::-;32970:3;;;;;;;32930:89;;;;32760:270;32695:335;33054:4;;;;;;;;;;;33046:12;;:4;:12;;;:30;;;;;33063:9;:13;33073:2;33063:13;;;;;;;;;;;;;;;;;;;;;;;;;33062:14;33046:30;33042:927;;;33093:28;33107:9;:13;33117:2;33107:13;;;;;;;;;;;;;;;;33093;:28::i;:::-;33138:22;33230:4;33206:21;:28;;;;:::i;:::-;33180:4;33164:9;:13;33174:2;33164:13;;;;;;;;;;;;;;;;:20;;;;:::i;:::-;33163:72;;;;:::i;:::-;33138:97;;33250:17;33302:9;;33294:4;33271:20;;:27;;;;:::i;:::-;33270:41;;;;:::i;:::-;33250:61;;33382:9;;33362:14;33349:9;:28;;;;:::i;:::-;33348:43;33326:587;;33433:9;33428:470;33452:10;;33448:1;:14;33428:470;;;33492:9;33498:2;33492:5;:9::i;:::-;33524:15;;:17;;;;;;;;;:::i;:::-;;;;;;33588:21;;33570:14;:39;33566:313;;33647:1;33642;:6;:24;;;;;33653:13;;;;;;;;;;;33652:14;33642:24;33638:218;;;33699:10;33712:6;;33699:19;;33749:28;33762:2;33766:10;33749:28;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;:28::i;:::-;33824:4;33808:13;;:20;;;;;;;;;;;;;;;;;;33668:188;33638:218;33566:313;33464:3;;;;;;;33428:470;;;;33326:587;33951:6;33927:20;;:30;;;;;;;:::i;:::-;;;;;;;;33078:891;;33042:927;34004:2;33984:31;;33998:4;33984:31;;;34008:6;33984:31;;;;;;:::i;:::-;;;;;;;;34033:4;34026:11;;;;;31813:2232;;;;;:::o;34493:474::-;34566:1;34552:16;;:2;:16;;;34548:74;;34592:18;;;;;;;;;;;;;;34548:74;34659:6;;:8;;;;;;;;;;;;;34691:10;34704:6;;34691:19;;34751:1;34727:26;;:8;:12;34736:2;34727:12;;;;;;;;;;;;;;;;;;;;;:26;;;34723:81;;34777:15;;;;;;;;;;;;;;34723:81;34831:2;34816:8;:12;34825:2;34816:12;;;;;;;;;;;;:17;;;;;;;;;;;;;;;;;;34844:6;:10;34851:2;34844:10;;;;;;;;;;;;;;;34860:2;34844:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34912:1;34892:6;:10;34899:2;34892:10;;;;;;;;;;;;;;;:17;;;;:21;;;;:::i;:::-;34874:11;:15;34886:2;34874:15;;;;;;;;;;;:39;;;;34956:2;34952;34931:28;;34948:1;34931:28;;;;;;;;;;;;34537:430;34493:474;:::o;35356:149::-;35465:5;35458:4;:12;;;;;;:::i;:::-;;35490:7;35481:6;:16;;;;;;:::i;:::-;;35356:149;;:::o;34975:373::-;35052:1;35036:18;;:4;:18;;;35032:73;;35078:15;;;;;;;;;;;;;;35032:73;35117:10;35130:6;:12;35137:4;35130:12;;;;;;;;;;;;;;;35165:1;35143:6;:12;35150:4;35143:12;;;;;;;;;;;;;;;:19;;;;:23;;;;:::i;:::-;35130:37;;;;;;;;:::i;:::-;;;;;;;;;;35117:50;;35178:6;:12;35185:4;35178:12;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35214:11;:15;35226:2;35214:15;;;;;;;;;;;35207:22;;;35247:8;:12;35256:2;35247:12;;;;;;;;;;;;35240:19;;;;;;;;;;;35277:11;:15;35289:2;35277:15;;;;;;;;;;;;35270:22;;;;;;;;;;;35337:2;35333:1;35310:30;;35319:4;35310:30;;;;;;;;;;;;35021:327;34975:373;:::o;31482:263::-;31553:6;;;;;;;;;;;31549:189;;;31576:12;31591:10;:8;:10::i;:::-;31576:25;;31639:24;;31632:4;31620:9;:16;;;;:::i;:::-;:43;31616:111;;;31691:20;;;;;;;;;;;;;;31616:111;31561:177;31549:189;31482:263;:::o;27193:123::-;27299:9;27277:10;:19;27288:7;27277:19;;;;;;;;;;;:31;;;;;;:::i;:::-;;27193:123;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1349:90::-;1383:7;1426:5;1419:13;1412:21;1401:32;;1349:90;;;:::o;1445:109::-;1526:21;1541:5;1526:21;:::i;:::-;1521:3;1514:34;1445:109;;:::o;1560:210::-;1647:4;1685:2;1674:9;1670:18;1662:26;;1698:65;1760:1;1749:9;1745:17;1736:6;1698:65;:::i;:::-;1560:210;;;;:::o;1776:75::-;1809:6;1842:2;1836:9;1826:19;;1776:75;:::o;1857:117::-;1966:1;1963;1956:12;1980:117;2089:1;2086;2079:12;2103:77;2140:7;2169:5;2158:16;;2103:77;;;:::o;2186:122::-;2259:24;2277:5;2259:24;:::i;:::-;2252:5;2249:35;2239:63;;2298:1;2295;2288:12;2239:63;2186:122;:::o;2314:139::-;2360:5;2398:6;2385:20;2376:29;;2414:33;2441:5;2414:33;:::i;:::-;2314:139;;;;:::o;2459:329::-;2518:6;2567:2;2555:9;2546:7;2542:23;2538:32;2535:119;;;2573:79;;:::i;:::-;2535:119;2693:1;2718:53;2763:7;2754:6;2743:9;2739:22;2718:53;:::i;:::-;2708:63;;2664:117;2459:329;;;;:::o;2794:126::-;2831:7;2871:42;2864:5;2860:54;2849:65;;2794:126;;;:::o;2926:96::-;2963:7;2992:24;3010:5;2992:24;:::i;:::-;2981:35;;2926:96;;;:::o;3028:118::-;3115:24;3133:5;3115:24;:::i;:::-;3110:3;3103:37;3028:118;;:::o;3152:222::-;3245:4;3283:2;3272:9;3268:18;3260:26;;3296:71;3364:1;3353:9;3349:17;3340:6;3296:71;:::i;:::-;3152:222;;;;:::o;3380:122::-;3453:24;3471:5;3453:24;:::i;:::-;3446:5;3443:35;3433:63;;3492:1;3489;3482:12;3433:63;3380:122;:::o;3508:139::-;3554:5;3592:6;3579:20;3570:29;;3608:33;3635:5;3608:33;:::i;:::-;3508:139;;;;:::o;3653:474::-;3721:6;3729;3778:2;3766:9;3757:7;3753:23;3749:32;3746:119;;;3784:79;;:::i;:::-;3746:119;3904:1;3929:53;3974:7;3965:6;3954:9;3950:22;3929:53;:::i;:::-;3919:63;;3875:117;4031:2;4057:53;4102:7;4093:6;4082:9;4078:22;4057:53;:::i;:::-;4047:63;;4002:118;3653:474;;;;;:::o;4133:118::-;4220:24;4238:5;4220:24;:::i;:::-;4215:3;4208:37;4133:118;;:::o;4257:222::-;4350:4;4388:2;4377:9;4373:18;4365:26;;4401:71;4469:1;4458:9;4454:17;4445:6;4401:71;:::i;:::-;4257:222;;;;:::o;4485:619::-;4562:6;4570;4578;4627:2;4615:9;4606:7;4602:23;4598:32;4595:119;;;4633:79;;:::i;:::-;4595:119;4753:1;4778:53;4823:7;4814:6;4803:9;4799:22;4778:53;:::i;:::-;4768:63;;4724:117;4880:2;4906:53;4951:7;4942:6;4931:9;4927:22;4906:53;:::i;:::-;4896:63;;4851:118;5008:2;5034:53;5079:7;5070:6;5059:9;5055:22;5034:53;:::i;:::-;5024:63;;4979:118;4485:619;;;;;:::o;5110:117::-;5219:1;5216;5209:12;5233:117;5342:1;5339;5332:12;5356:180;5404:77;5401:1;5394:88;5501:4;5498:1;5491:15;5525:4;5522:1;5515:15;5542:281;5625:27;5647:4;5625:27;:::i;:::-;5617:6;5613:40;5755:6;5743:10;5740:22;5719:18;5707:10;5704:34;5701:62;5698:88;;;5766:18;;:::i;:::-;5698:88;5806:10;5802:2;5795:22;5585:238;5542:281;;:::o;5829:129::-;5863:6;5890:20;;:::i;:::-;5880:30;;5919:33;5947:4;5939:6;5919:33;:::i;:::-;5829:129;;;:::o;5964:308::-;6026:4;6116:18;6108:6;6105:30;6102:56;;;6138:18;;:::i;:::-;6102:56;6176:29;6198:6;6176:29;:::i;:::-;6168:37;;6260:4;6254;6250:15;6242:23;;5964:308;;;:::o;6278:146::-;6375:6;6370:3;6365;6352:30;6416:1;6407:6;6402:3;6398:16;6391:27;6278:146;;;:::o;6430:425::-;6508:5;6533:66;6549:49;6591:6;6549:49;:::i;:::-;6533:66;:::i;:::-;6524:75;;6622:6;6615:5;6608:21;6660:4;6653:5;6649:16;6698:3;6689:6;6684:3;6680:16;6677:25;6674:112;;;6705:79;;:::i;:::-;6674:112;6795:54;6842:6;6837:3;6832;6795:54;:::i;:::-;6514:341;6430:425;;;;;:::o;6875:340::-;6931:5;6980:3;6973:4;6965:6;6961:17;6957:27;6947:122;;6988:79;;:::i;:::-;6947:122;7105:6;7092:20;7130:79;7205:3;7197:6;7190:4;7182:6;7178:17;7130:79;:::i;:::-;7121:88;;6937:278;6875:340;;;;:::o;7221:509::-;7290:6;7339:2;7327:9;7318:7;7314:23;7310:32;7307:119;;;7345:79;;:::i;:::-;7307:119;7493:1;7482:9;7478:17;7465:31;7523:18;7515:6;7512:30;7509:117;;;7545:79;;:::i;:::-;7509:117;7650:63;7705:7;7696:6;7685:9;7681:22;7650:63;:::i;:::-;7640:73;;7436:287;7221:509;;;;:::o;7736:86::-;7771:7;7811:4;7804:5;7800:16;7789:27;;7736:86;;;:::o;7828:112::-;7911:22;7927:5;7911:22;:::i;:::-;7906:3;7899:35;7828:112;;:::o;7946:214::-;8035:4;8073:2;8062:9;8058:18;8050:26;;8086:67;8150:1;8139:9;8135:17;8126:6;8086:67;:::i;:::-;7946:214;;;;:::o;8166:834::-;8254:6;8262;8311:2;8299:9;8290:7;8286:23;8282:32;8279:119;;;8317:79;;:::i;:::-;8279:119;8465:1;8454:9;8450:17;8437:31;8495:18;8487:6;8484:30;8481:117;;;8517:79;;:::i;:::-;8481:117;8622:63;8677:7;8668:6;8657:9;8653:22;8622:63;:::i;:::-;8612:73;;8408:287;8762:2;8751:9;8747:18;8734:32;8793:18;8785:6;8782:30;8779:117;;;8815:79;;:::i;:::-;8779:117;8920:63;8975:7;8966:6;8955:9;8951:22;8920:63;:::i;:::-;8910:73;;8705:288;8166:834;;;;;:::o;9006:116::-;9076:21;9091:5;9076:21;:::i;:::-;9069:5;9066:32;9056:60;;9112:1;9109;9102:12;9056:60;9006:116;:::o;9128:133::-;9171:5;9209:6;9196:20;9187:29;;9225:30;9249:5;9225:30;:::i;:::-;9128:133;;;;:::o;9267:468::-;9332:6;9340;9389:2;9377:9;9368:7;9364:23;9360:32;9357:119;;;9395:79;;:::i;:::-;9357:119;9515:1;9540:53;9585:7;9576:6;9565:9;9561:22;9540:53;:::i;:::-;9530:63;;9486:117;9642:2;9668:50;9710:7;9701:6;9690:9;9686:22;9668:50;:::i;:::-;9658:60;;9613:115;9267:468;;;;;:::o;9741:329::-;9800:6;9849:2;9837:9;9828:7;9824:23;9820:32;9817:119;;;9855:79;;:::i;:::-;9817:119;9975:1;10000:53;10045:7;10036:6;10025:9;10021:22;10000:53;:::i;:::-;9990:63;;9946:117;9741:329;;;;:::o;10076:323::-;10132:6;10181:2;10169:9;10160:7;10156:23;10152:32;10149:119;;;10187:79;;:::i;:::-;10149:119;10307:1;10332:50;10374:7;10365:6;10354:9;10350:22;10332:50;:::i;:::-;10322:60;;10278:114;10076:323;;;;:::o;10405:117::-;10514:1;10511;10504:12;10528:117;10637:1;10634;10627:12;10664:552;10721:8;10731:6;10781:3;10774:4;10766:6;10762:17;10758:27;10748:122;;10789:79;;:::i;:::-;10748:122;10902:6;10889:20;10879:30;;10932:18;10924:6;10921:30;10918:117;;;10954:79;;:::i;:::-;10918:117;11068:4;11060:6;11056:17;11044:29;;11122:3;11114:4;11106:6;11102:17;11092:8;11088:32;11085:41;11082:128;;;11129:79;;:::i;:::-;11082:128;10664:552;;;;;:::o;11222:963::-;11319:6;11327;11335;11343;11351;11400:3;11388:9;11379:7;11375:23;11371:33;11368:120;;;11407:79;;:::i;:::-;11368:120;11527:1;11552:53;11597:7;11588:6;11577:9;11573:22;11552:53;:::i;:::-;11542:63;;11498:117;11654:2;11680:53;11725:7;11716:6;11705:9;11701:22;11680:53;:::i;:::-;11670:63;;11625:118;11782:2;11808:53;11853:7;11844:6;11833:9;11829:22;11808:53;:::i;:::-;11798:63;;11753:118;11938:2;11927:9;11923:18;11910:32;11969:18;11961:6;11958:30;11955:117;;;11991:79;;:::i;:::-;11955:117;12104:64;12160:7;12151:6;12140:9;12136:22;12104:64;:::i;:::-;12086:82;;;;11881:297;11222:963;;;;;;;;:::o;12191:474::-;12259:6;12267;12316:2;12304:9;12295:7;12291:23;12287:32;12284:119;;;12322:79;;:::i;:::-;12284:119;12442:1;12467:53;12512:7;12503:6;12492:9;12488:22;12467:53;:::i;:::-;12457:63;;12413:117;12569:2;12595:53;12640:7;12631:6;12620:9;12616:22;12595:53;:::i;:::-;12585:63;;12540:118;12191:474;;;;;:::o;12671:180::-;12719:77;12716:1;12709:88;12816:4;12813:1;12806:15;12840:4;12837:1;12830:15;12857:320;12901:6;12938:1;12932:4;12928:12;12918:22;;12985:1;12979:4;12975:12;13006:18;12996:81;;13062:4;13054:6;13050:17;13040:27;;12996:81;13124:2;13116:6;13113:14;13093:18;13090:38;13087:84;;13143:18;;:::i;:::-;13087:84;12908:269;12857:320;;;:::o;13183:180::-;13231:77;13228:1;13221:88;13328:4;13325:1;13318:15;13352:4;13349:1;13342:15;13369:194;13409:4;13429:20;13447:1;13429:20;:::i;:::-;13424:25;;13463:20;13481:1;13463:20;:::i;:::-;13458:25;;13507:1;13504;13500:9;13492:17;;13531:1;13525:4;13522:11;13519:37;;;13536:18;;:::i;:::-;13519:37;13369:194;;;;:::o;13569:180::-;13617:77;13614:1;13607:88;13714:4;13711:1;13704:15;13738:4;13735:1;13728:15;13755:180;13803:77;13800:1;13793:88;13900:4;13897:1;13890:15;13924:4;13921:1;13914:15;13941:141;13990:4;14013:3;14005:11;;14036:3;14033:1;14026:14;14070:4;14067:1;14057:18;14049:26;;13941:141;;;:::o;14088:93::-;14125:6;14172:2;14167;14160:5;14156:14;14152:23;14142:33;;14088:93;;;:::o;14187:107::-;14231:8;14281:5;14275:4;14271:16;14250:37;;14187:107;;;;:::o;14300:393::-;14369:6;14419:1;14407:10;14403:18;14442:97;14472:66;14461:9;14442:97;:::i;:::-;14560:39;14590:8;14579:9;14560:39;:::i;:::-;14548:51;;14632:4;14628:9;14621:5;14617:21;14608:30;;14681:4;14671:8;14667:19;14660:5;14657:30;14647:40;;14376:317;;14300:393;;;;;:::o;14699:60::-;14727:3;14748:5;14741:12;;14699:60;;;:::o;14765:142::-;14815:9;14848:53;14866:34;14875:24;14893:5;14875:24;:::i;:::-;14866:34;:::i;:::-;14848:53;:::i;:::-;14835:66;;14765:142;;;:::o;14913:75::-;14956:3;14977:5;14970:12;;14913:75;;;:::o;14994:269::-;15104:39;15135:7;15104:39;:::i;:::-;15165:91;15214:41;15238:16;15214:41;:::i;:::-;15206:6;15199:4;15193:11;15165:91;:::i;:::-;15159:4;15152:105;15070:193;14994:269;;;:::o;15269:73::-;15314:3;15269:73;:::o;15348:189::-;15425:32;;:::i;:::-;15466:65;15524:6;15516;15510:4;15466:65;:::i;:::-;15401:136;15348:189;;:::o;15543:186::-;15603:120;15620:3;15613:5;15610:14;15603:120;;;15674:39;15711:1;15704:5;15674:39;:::i;:::-;15647:1;15640:5;15636:13;15627:22;;15603:120;;;15543:186;;:::o;15735:543::-;15836:2;15831:3;15828:11;15825:446;;;15870:38;15902:5;15870:38;:::i;:::-;15954:29;15972:10;15954:29;:::i;:::-;15944:8;15940:44;16137:2;16125:10;16122:18;16119:49;;;16158:8;16143:23;;16119:49;16181:80;16237:22;16255:3;16237:22;:::i;:::-;16227:8;16223:37;16210:11;16181:80;:::i;:::-;15840:431;;15825:446;15735:543;;;:::o;16284:117::-;16338:8;16388:5;16382:4;16378:16;16357:37;;16284:117;;;;:::o;16407:169::-;16451:6;16484:51;16532:1;16528:6;16520:5;16517:1;16513:13;16484:51;:::i;:::-;16480:56;16565:4;16559;16555:15;16545:25;;16458:118;16407:169;;;;:::o;16581:295::-;16657:4;16803:29;16828:3;16822:4;16803:29;:::i;:::-;16795:37;;16865:3;16862:1;16858:11;16852:4;16849:21;16841:29;;16581:295;;;;:::o;16881:1395::-;16998:37;17031:3;16998:37;:::i;:::-;17100:18;17092:6;17089:30;17086:56;;;17122:18;;:::i;:::-;17086:56;17166:38;17198:4;17192:11;17166:38;:::i;:::-;17251:67;17311:6;17303;17297:4;17251:67;:::i;:::-;17345:1;17369:4;17356:17;;17401:2;17393:6;17390:14;17418:1;17413:618;;;;18075:1;18092:6;18089:77;;;18141:9;18136:3;18132:19;18126:26;18117:35;;18089:77;18192:67;18252:6;18245:5;18192:67;:::i;:::-;18186:4;18179:81;18048:222;17383:887;;17413:618;17465:4;17461:9;17453:6;17449:22;17499:37;17531:4;17499:37;:::i;:::-;17558:1;17572:208;17586:7;17583:1;17580:14;17572:208;;;17665:9;17660:3;17656:19;17650:26;17642:6;17635:42;17716:1;17708:6;17704:14;17694:24;;17763:2;17752:9;17748:18;17735:31;;17609:4;17606:1;17602:12;17597:17;;17572:208;;;17808:6;17799:7;17796:19;17793:179;;;17866:9;17861:3;17857:19;17851:26;17909:48;17951:4;17943:6;17939:17;17928:9;17909:48;:::i;:::-;17901:6;17894:64;17816:156;17793:179;18018:1;18014;18006:6;18002:14;17998:22;17992:4;17985:36;17420:611;;;17383:887;;16973:1303;;;16881:1395;;:::o;18282:168::-;18365:11;18399:6;18394:3;18387:19;18439:4;18434:3;18430:14;18415:29;;18282:168;;;;:::o;18456:114::-;;:::o;18576:362::-;18717:3;18738:65;18801:1;18796:3;18738:65;:::i;:::-;18731:72;;18812:93;18901:3;18812:93;:::i;:::-;18930:1;18925:3;18921:11;18914:18;;18576:362;;;:::o;18944:748::-;19193:4;19231:3;19220:9;19216:19;19208:27;;19245:71;19313:1;19302:9;19298:17;19289:6;19245:71;:::i;:::-;19326:72;19394:2;19383:9;19379:18;19370:6;19326:72;:::i;:::-;19408;19476:2;19465:9;19461:18;19452:6;19408:72;:::i;:::-;19527:9;19521:4;19517:20;19512:2;19501:9;19497:18;19490:48;19555:130;19680:4;19555:130;:::i;:::-;19547:138;;18944:748;;;;;;:::o;19698:149::-;19734:7;19774:66;19767:5;19763:78;19752:89;;19698:149;;;:::o;19853:120::-;19925:23;19942:5;19925:23;:::i;:::-;19918:5;19915:34;19905:62;;19963:1;19960;19953:12;19905:62;19853:120;:::o;19979:141::-;20035:5;20066:6;20060:13;20051:22;;20082:32;20108:5;20082:32;:::i;:::-;19979:141;;;;:::o;20126:349::-;20195:6;20244:2;20232:9;20223:7;20219:23;20215:32;20212:119;;;20250:79;;:::i;:::-;20212:119;20370:1;20395:63;20450:7;20441:6;20430:9;20426:22;20395:63;:::i;:::-;20385:73;;20341:127;20126:349;;;;:::o;20503:314::-;20599:3;20620:70;20683:6;20678:3;20620:70;:::i;:::-;20613:77;;20700:56;20749:6;20744:3;20737:5;20700:56;:::i;:::-;20781:29;20803:6;20781:29;:::i;:::-;20776:3;20772:39;20765:46;;20503:314;;;;;:::o;20823:660::-;21028:4;21066:3;21055:9;21051:19;21043:27;;21080:71;21148:1;21137:9;21133:17;21124:6;21080:71;:::i;:::-;21161:72;21229:2;21218:9;21214:18;21205:6;21161:72;:::i;:::-;21243;21311:2;21300:9;21296:18;21287:6;21243:72;:::i;:::-;21362:9;21356:4;21352:20;21347:2;21336:9;21332:18;21325:48;21390:86;21471:4;21462:6;21454;21390:86;:::i;:::-;21382:94;;20823:660;;;;;;;;:::o;21489:79::-;21528:7;21557:5;21546:16;;21489:79;;;:::o;21574:157::-;21679:45;21699:24;21717:5;21699:24;:::i;:::-;21679:45;:::i;:::-;21674:3;21667:58;21574:157;;:::o;21737:256::-;21849:3;21864:75;21935:3;21926:6;21864:75;:::i;:::-;21964:2;21959:3;21955:12;21948:19;;21984:3;21977:10;;21737:256;;;;:::o;21999:102::-;22041:8;22088:5;22085:1;22081:13;22060:34;;21999:102;;;:::o;22107:848::-;22168:5;22175:4;22199:6;22190:15;;22223:5;22214:14;;22237:712;22258:1;22248:8;22245:15;22237:712;;;22353:4;22348:3;22344:14;22338:4;22335:24;22332:50;;;22362:18;;:::i;:::-;22332:50;22412:1;22402:8;22398:16;22395:451;;;22827:4;22820:5;22816:16;22807:25;;22395:451;22877:4;22871;22867:15;22859:23;;22907:32;22930:8;22907:32;:::i;:::-;22895:44;;22237:712;;;22107:848;;;;;;;:::o;22961:1073::-;23015:5;23206:8;23196:40;;23227:1;23218:10;;23229:5;;23196:40;23255:4;23245:36;;23272:1;23263:10;;23274:5;;23245:36;23341:4;23389:1;23384:27;;;;23425:1;23420:191;;;;23334:277;;23384:27;23402:1;23393:10;;23404:5;;;23420:191;23465:3;23455:8;23452:17;23449:43;;;23472:18;;:::i;:::-;23449:43;23521:8;23518:1;23514:16;23505:25;;23556:3;23549:5;23546:14;23543:40;;;23563:18;;:::i;:::-;23543:40;23596:5;;;23334:277;;23720:2;23710:8;23707:16;23701:3;23695:4;23692:13;23688:36;23670:2;23660:8;23657:16;23652:2;23646:4;23643:12;23639:35;23623:111;23620:246;;;23776:8;23770:4;23766:19;23757:28;;23811:3;23804:5;23801:14;23798:40;;;23818:18;;:::i;:::-;23798:40;23851:5;;23620:246;23891:42;23929:3;23919:8;23913:4;23910:1;23891:42;:::i;:::-;23876:57;;;;23965:4;23960:3;23956:14;23949:5;23946:25;23943:51;;;23974:18;;:::i;:::-;23943:51;24023:4;24016:5;24012:16;24003:25;;22961:1073;;;;;;:::o;24040:281::-;24098:5;24122:23;24140:4;24122:23;:::i;:::-;24114:31;;24166:25;24182:8;24166:25;:::i;:::-;24154:37;;24210:104;24247:66;24237:8;24231:4;24210:104;:::i;:::-;24201:113;;24040:281;;;;:::o;24327:180::-;24375:77;24372:1;24365:88;24472:4;24469:1;24462:15;24496:4;24493:1;24486:15;24513:185;24553:1;24570:20;24588:1;24570:20;:::i;:::-;24565:25;;24604:20;24622:1;24604:20;:::i;:::-;24599:25;;24643:1;24633:35;;24648:18;;:::i;:::-;24633:35;24690:1;24687;24683:9;24678:14;;24513:185;;;;:::o;24704:176::-;24736:1;24753:20;24771:1;24753:20;:::i;:::-;24748:25;;24787:20;24805:1;24787:20;:::i;:::-;24782:25;;24826:1;24816:35;;24831:18;;:::i;:::-;24816:35;24872:1;24869;24865:9;24860:14;;24704:176;;;;:::o;24886:191::-;24926:3;24945:20;24963:1;24945:20;:::i;:::-;24940:25;;24979:20;24997:1;24979:20;:::i;:::-;24974:25;;25022:1;25019;25015:9;25008:16;;25043:3;25040:1;25037:10;25034:36;;;25050:18;;:::i;:::-;25034:36;24886:191;;;;:::o;25083:233::-;25122:3;25145:24;25163:5;25145:24;:::i;:::-;25136:33;;25191:66;25184:5;25181:77;25178:103;;25261:18;;:::i;:::-;25178:103;25308:1;25301:5;25297:13;25290:20;;25083:233;;;:::o

Swarm Source

ipfs://8a70b2f697b424602b2868b406455b56f2a1745da2e8ac76b0f6a938e0147769
Loading...
Loading
Loading...
Loading
[ 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.