ETH Price: $3,482.77 (+0.32%)
Gas: 4 Gwei

Token

3Plus (3PLUS)
 

Overview

Max Total Supply

15,000,000 3PLUS

Holders

36

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Filtered by Token Holder
yo-itsmatt.eth
Balance
606.831689905 3PLUS

Value
$0.00
0xf02f07dda7cee3e4f875164fa7c296d3ca6d6531
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:
THREEPLUS

Compiler Version
v0.7.0+commit.9e61f92b

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-12-29
*/

// ██████╗ ██████╗ ██╗     ██╗   ██╗███████╗
// ╚════██╗██╔══██╗██║     ██║   ██║██╔════╝
//  █████╔╝██████╔╝██║     ██║   ██║███████╗
//  ╚═══██╗██╔═══╝ ██║     ██║   ██║╚════██║
// ██████╔╝██║     ███████╗╚██████╔╝███████║
//╚═════╝ ╚═╝     ╚══════╝ ╚═════╝ ╚══════╝
// 3plus Token (3PLUS) //
// 3Plus Token (3PLUS) is modified fork of Reflect, Reflector and BoostX.
// IERC20, SafeMath, Context, Ownable and Address are copied from OpenZeppelin Repo.
// Smart contract is static security audited by Fortress Foundation.
// SPDX-License-Identifier: MIT

pragma solidity >0.5.0;
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

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

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.3._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.3._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }


    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}
library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

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

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

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}
abstract contract Ownable {

    bool public paused = false;

    address public owner;
    address public manager;

    event OwnershipTransferred(address previousOwner, address newOwner);
    event Pause();
    event Unpause();

    modifier onlyOwner {
        require(msg.sender == owner || msg.sender == manager,"must be owner");
        _;
    }

    modifier whenNotPaused() {
        require(!paused);
        _;
    }

    modifier whenPaused() {
        require(paused);
        _;
    }

    constructor() {
        owner = msg.sender;
        manager = msg.sender;
    }

    function isOwner(address wallet) public view returns(bool) {
        return wallet == owner;
    }


    function transferOwnership(address _newOwner, address _oldOwner) public onlyOwner {
        _transferOwnership(_newOwner, _oldOwner);
    }

    function transferManagership(address _newManager) public onlyOwner {
        _transferManagership(_newManager);
    }


    function pause() public onlyOwner whenNotPaused {

        paused = true;
        emit Pause();
    }


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

    function _transferOwnership(address _newOwner, address _oldOwner) internal {
        require(_newOwner != address(0));
        owner = _newOwner;
        emit OwnershipTransferred(_oldOwner, _newOwner);
    }

    function _transferManagership(address _newManager) internal {
        require(_newManager != address(0));
        manager = _newManager;
    }
}

abstract contract AccessControl is Context {
    using EnumerableSet for EnumerableSet.AddressSet;
    using Address for address;

    struct RoleData {
        EnumerableSet.AddressSet members;
        bytes32 adminRole;
    }

    mapping (bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view returns (bool) {
        return _roles[role].members.contains(account);
    }

    /**
     * @dev Returns the number of accounts that have `role`. Can be used
     * together with {getRoleMember} to enumerate all bearers of a role.
     */
    function getRoleMemberCount(bytes32 role) public view returns (uint256) {
        return _roles[role].members.length();
    }

    /**
     * @dev Returns one of the accounts that have `role`. `index` must be a
     * value between 0 and {getRoleMemberCount}, non-inclusive.
     *
     * Role bearers are not sorted in any particular way, and their ordering may
     * change at any point.
     *
     * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
     * you perform all queries on the same block. See the following
     * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
     * for more information.
     */
    function getRoleMember(bytes32 role, uint256 index) public view returns (address) {
        return _roles[role].members.at(index);
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual {
        require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to grant");

        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual {
        require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to revoke");

        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        emit RoleAdminChanged(role, _roles[role].adminRole, adminRole);
        _roles[role].adminRole = adminRole;
    }

    function _grantRole(bytes32 role, address account) private {
        if (_roles[role].members.add(account)) {
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _revokeRole(bytes32 role, address account) private {
        if (_roles[role].members.remove(account)) {
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

contract THREEPLUS is Ownable, IERC20,AccessControl  {
    using Address for address;
    using SafeMath for uint256;


    mapping (address => uint256) private _rOwned;
    mapping (address => uint256) private _tOwned;
    mapping (address => mapping (address => uint256)) private _allowances;

    mapping (address => bool) private _isExcluded;
    address[] private _excluded;

    uint256 private constant DISTRIBUTION_PERCENT = 15;
    uint256 private constant MAX = ~uint256(0);
    uint256 private  _tTotal = DISTRIBUTION_PERCENT * 10**6 * 10**9;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;
    bool public mintingFinished = false;

    string private _name = '3Plus';
    string private _symbol = '3PLUS';
    uint8 private _decimals = 9;

    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");

    constructor () {
        _setupRole(MINTER_ROLE, _msgSender());
        _rOwned[_msgSender()] = _rTotal;
        emit Transfer(address(0), _msgSender(), _tTotal);
    }

    function name() public view returns (string memory) {
        return _name;
    }

    function symbol() public view returns (string memory) {
        return _symbol;
    }

    function decimals() public view returns (uint8) {
        return _decimals;
    }

    function totalSupply() public view override returns (uint256) {
        return _tTotal;
    }

    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcluded[account]) return _tOwned[account];
        return tokenFromDistribution(_rOwned[account]);
    }

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function mint(address to, uint256 amount) public virtual {
        require(_msgSender() == owner, "not authorised to mint");
        _mint(to, amount);
    }


    modifier canMint() {
        require(!mintingFinished);
        _;
    }

    modifier hasMintPermission() {
        require(msg.sender == owner);
        _;
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _tTotal = _tTotal.add(amount);
        _tOwned[account] = _tOwned[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    function isExcluded(address account) public view returns (bool) {
        return _isExcluded[account];
    }

    function totalFees() public view returns (uint256) {
        return _tFeeTotal;
    }

    function distribute(uint256 tAmount) public {
        address sender = _msgSender();
        require(!_isExcluded[sender], "Excluded addresses cannot call this function");
        (uint256 rAmount,,,,) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rTotal = _rTotal.sub(rAmount);
        _tFeeTotal = _tFeeTotal.add(tAmount);
    }

    function distributionFromToken(uint256 tAmount, bool deductTransferFee) public view returns(uint256) {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount,,,,) = _getValues(tAmount);
            return rAmount;
        } else {
            (,uint256 rTransferAmount,,,) = _getValues(tAmount);
            return rTransferAmount;
        }
    }

    function tokenFromDistribution(uint256 rAmount) public view returns(uint256) {
        require(rAmount <= _rTotal, "Amount must be less than total distributions");
        uint256 currentRate =  _getRate();
        return rAmount.div(currentRate);
    }

    function excludeAccount(address account) external onlyOwner() {
        require(!_isExcluded[account], "Account is already excluded");
        if(_rOwned[account] > 0) {
            _tOwned[account] = tokenFromDistribution(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }

    function includeAccount(address account) external onlyOwner() {
        require(_isExcluded[account], "Account is already excluded");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }
    }

    function _approve(address owner, address spender, uint256 amount) private {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _transfer(address sender, address recipient, uint256 amount) private {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferFromExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _transferToExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferStandard(sender, recipient, amount);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(sender, recipient, amount);
        } else {
            _transferStandard(sender, recipient, amount);
        }
    }

    function _transferStandard(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _distributeFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferToExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _distributeFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferFromExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _distributeFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferBothExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _distributeFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _distributeFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }

    function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256) {
        (uint256 tTransferAmount, uint256 tFee) = _getTValues(tAmount);
        uint256 currentRate =  _getRate();
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, currentRate);
        return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee);
    }

    function _getTValues(uint256 tAmount) private pure returns (uint256, uint256) {
        uint256 tFee = tAmount.mul(DISTRIBUTION_PERCENT).div(100);
        uint256 tTransferAmount = tAmount.sub(tFee);
        return (tTransferAmount, tFee);
    }

    function _getRValues(uint256 tAmount, uint256 tFee, uint256 currentRate) private pure returns (uint256, uint256, uint256) {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee);
        return (rAmount, rTransferAmount, rFee);
    }

    function _getRate() private view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }

    function _getCurrentSupply() private view returns(uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal);
            rSupply = rSupply.sub(_rOwned[_excluded[i]]);
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","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":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"distribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"distributionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintingFinished","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newManager","type":"address"}],"name":"transferManagership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"},{"internalType":"address","name":"_oldOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260008060006101000a81548160ff021916908315150217905550633b9aca00620f4240600f0202600855600854600019816200003c57fe5b06600019036009556000600b60006101000a81548160ff0219169083151502179055506040518060400160405280600581526020017f33506c7573000000000000000000000000000000000000000000000000000000815250600c9080519060200190620000ac92919062000451565b506040518060400160405280600581526020017f33504c5553000000000000000000000000000000000000000000000000000000815250600d9080519060200190620000fa92919062000451565b506009600e60006101000a81548160ff021916908360ff1602179055503480156200012457600080fd5b5033600060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620001e87f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6620001dc620002ba60201b60201c565b620002c260201b60201c565b60095460036000620001ff620002ba60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506200024d620002ba60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6008546040518082815260200191505060405180910390a3620004f7565b600033905090565b620002d48282620002d860201b60201c565b5050565b6200030781600260008581526020019081526020016000206000016200037c60201b620025d71790919060201c565b1562000378576200031d620002ba60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000620003ac836000018373ffffffffffffffffffffffffffffffffffffffff1660001b620003b460201b60201c565b905092915050565b6000620003c883836200042e60201b60201c565b6200042357826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905062000428565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200049457805160ff1916838001178555620004c5565b82800160010185558215620004c5579182015b82811115620004c4578251825591602001919060010190620004a7565b5b509050620004d49190620004d8565b5090565b5b80821115620004f3576000816000905550600101620004d9565b5090565b61461f80620005076000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c80636d43542111610130578063a457c2d7116100b8578063d53913931161007c578063d539139314610b23578063d547741f14610b41578063dd62ed3e14610b8f578063f2cc0c1814610c07578063f84354f114610c4b57610227565b8063a457c2d71461097b578063a9059cbb146109df578063ca15c87314610a43578063cba0e99614610a85578063ccc3990914610adf57610227565b80639010d07c116100ff5780639010d07c146107e657806391c05b0b1461084857806391d148541461087657806395d89b41146108da578063a217fddf1461095d57610227565b80636d435421146106ec57806370a08231146107505780638456cb59146107a85780638da5cb5b146107b257610227565b80632f63e520116101b35780633f4ba83a116101825780633f4ba83a146105fe57806340c10f1914610608578063481c6a75146106565780635c975abb1461068a578063618ada00146106aa57610227565b80632f63e520146104dd578063313ce5671461052b57806336568abe1461054c578063395093511461059a57610227565b806318160ddd116101fa57806318160ddd1461035157806323b872dd1461036f578063248a9ca3146103f35780632f2ff15d146104355780632f54bf6e1461048357610227565b806305d2035b1461022c57806306fdde031461024c578063095ea7b3146102cf57806313114a9d14610333575b600080fd5b610234610c8f565b60405180821515815260200191505060405180910390f35b610254610ca2565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610294578082015181840152602081019050610279565b50505050905090810190601f1680156102c15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61031b600480360360408110156102e557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610d44565b60405180821515815260200191505060405180910390f35b61033b610d62565b6040518082815260200191505060405180910390f35b610359610d6c565b6040518082815260200191505060405180910390f35b6103db6004803603606081101561038557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610d76565b60405180821515815260200191505060405180910390f35b61041f6004803603602081101561040957600080fd5b8101908080359060200190929190505050610e4f565b6040518082815260200191505060405180910390f35b6104816004803603604081101561044b57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e6f565b005b6104c56004803603602081101561049957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ef9565b60405180821515815260200191505060405180910390f35b610515600480360360408110156104f357600080fd5b8101908080359060200190929190803515159060200190929190505050610f52565b6040518082815260200191505060405180910390f35b610533611007565b604051808260ff16815260200191505060405180910390f35b6105986004803603604081101561056257600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061101e565b005b6105e6600480360360408110156105b057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506110b7565b60405180821515815260200191505060405180910390f35b61060661116a565b005b6106546004803603604081101561061e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506112e4565b005b61065e6113bc565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106926113e2565b60405180821515815260200191505060405180910390f35b6106d6600480360360208110156106c057600080fd5b81019080803590602001909291905050506113f3565b6040518082815260200191505060405180910390f35b61074e6004803603604081101561070257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611477565b005b6107926004803603602081101561076657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506115a0565b6040518082815260200191505060405180910390f35b6107b061168b565b005b6107ba611806565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61081c600480360360408110156107fc57600080fd5b81019080803590602001909291908035906020019092919050505061182c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108746004803603602081101561085e57600080fd5b810190808035906020019092919050505061185e565b005b6108c26004803603604081101561088c57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119ee565b60405180821515815260200191505060405180910390f35b6108e2611a20565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610922578082015181840152602081019050610907565b50505050905090810190601f16801561094f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610965611ac2565b6040518082815260200191505060405180910390f35b6109c76004803603604081101561099157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611ac9565b60405180821515815260200191505060405180910390f35b610a2b600480360360408110156109f557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b96565b60405180821515815260200191505060405180910390f35b610a6f60048036036020811015610a5957600080fd5b8101908080359060200190929190505050611bb4565b6040518082815260200191505060405180910390f35b610ac760048036036020811015610a9b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611bdb565b60405180821515815260200191505060405180910390f35b610b2160048036036020811015610af557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c31565b005b610b2b611d58565b6040518082815260200191505060405180910390f35b610b8d60048036036040811015610b5757600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d7c565b005b610bf160048036036040811015610ba557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e06565b6040518082815260200191505060405180910390f35b610c4960048036036020811015610c1d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e8d565b005b610c8d60048036036020811015610c6157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506121fa565b005b600b60009054906101000a900460ff1681565b6060600c8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d3a5780601f10610d0f57610100808354040283529160200191610d3a565b820191906000526020600020905b815481529060010190602001808311610d1d57829003601f168201915b5050505050905090565b6000610d58610d51612607565b848461260f565b6001905092915050565b6000600a54905090565b6000600854905090565b6000610d83848484612806565b610e4484610d8f612607565b610e3f856040518060600160405280602881526020016144d060289139600560008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610df5612607565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c5f9092919063ffffffff16565b61260f565b600190509392505050565b600060026000838152602001908152602001600020600201549050919050565b610e966002600084815260200190815260200160002060020154610e91612607565b6119ee565b610eeb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180614402602f913960400191505060405180910390fd5b610ef58282612d1f565b5050565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b6000600854831115610fcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f416d6f756e74206d757374206265206c657373207468616e20737570706c790081525060200191505060405180910390fd5b81610feb576000610fdc84612db3565b50505050905080915050611001565b6000610ff684612db3565b505050915050809150505b92915050565b6000600e60009054906101000a900460ff16905090565b611026612607565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146110a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806145bb602f913960400191505060405180910390fd5b6110b38282612e0b565b5050565b60006111606110c4612607565b8461115b85600560006110d5612607565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e9f90919063ffffffff16565b61260f565b6001905092915050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806112135750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611285576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6d757374206265206f776e65720000000000000000000000000000000000000081525060200191505060405180910390fd5b60008054906101000a900460ff1661129c57600080fd5b60008060006101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611325612607565b73ffffffffffffffffffffffffffffffffffffffff16146113ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6e6f7420617574686f726973656420746f206d696e740000000000000000000081525060200191505060405180910390fd5b6113b88282612f27565b5050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900460ff1681565b6000600954821115611450576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614483602c913960400191505060405180910390fd5b600061145a6130e4565b905061146f818461310f90919063ffffffff16565b915050919050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806115205750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611592576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6d757374206265206f776e65720000000000000000000000000000000000000081525060200191505060405180910390fd5b61159c8282613159565b5050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561163b57600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050611686565b611683600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113f3565b90505b919050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806117345750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6117a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6d757374206265206f776e65720000000000000000000000000000000000000081525060200191505060405180910390fd5b60008054906101000a900460ff16156117be57600080fd5b60016000806101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611856826002600086815260200190815260200160002060000161324390919063ffffffff16565b905092915050565b6000611868612607565b9050600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561190d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061456a602c913960400191505060405180910390fd5b600061191883612db3565b50505050905061197081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461325d90919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506119c88160095461325d90919063ffffffff16565b6009819055506119e383600a54612e9f90919063ffffffff16565b600a81905550505050565b6000611a1882600260008681526020019081526020016000206000016132a790919063ffffffff16565b905092915050565b6060600d8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611ab85780601f10611a8d57610100808354040283529160200191611ab8565b820191906000526020600020905b815481529060010190602001808311611a9b57829003601f168201915b5050505050905090565b6000801b81565b6000611b8c611ad6612607565b84611b87856040518060600160405280602581526020016145966025913960056000611b00612607565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c5f9092919063ffffffff16565b61260f565b6001905092915050565b6000611baa611ba3612607565b8484612806565b6001905092915050565b6000611bd4600260008481526020019081526020016000206000016132d7565b9050919050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611cda5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611d4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6d757374206265206f776e65720000000000000000000000000000000000000081525060200191505060405180910390fd5b611d55816132ec565b50565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b611da36002600084815260200190815260200160002060020154611d9e612607565b6119ee565b611df8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806144536030913960400191505060405180910390fd5b611e028282612e0b565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611f365750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611fa8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6d757374206265206f776e65720000000000000000000000000000000000000081525060200191505060405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612068576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e7420697320616c7265616479206578636c75646564000000000081525060200191505060405180910390fd5b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561213c576120f8600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113f3565b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506007819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806122a35750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6d757374206265206f776e65720000000000000000000000000000000000000081525060200191505060405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166123d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e7420697320616c7265616479206578636c75646564000000000081525060200191505060405180910390fd5b60005b6007805490508110156125d3578173ffffffffffffffffffffffffffffffffffffffff166007828154811061240857fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156125c65760076001600780549050038154811061246457fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166007828154811061249c57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600780548061258c57fe5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590556125d3565b80806001019150506123d7565b5050565b60006125ff836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61336a565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612695576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806145466024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561271b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806144316022913960400191505060405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561288c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806145216025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612912576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806143df6023913960400191505060405180910390fd5b6000811161296b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806144f86029913960400191505060405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612a0e5750600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612a2357612a1e8383836133da565b612c5a565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612ac65750600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612adb57612ad683838361362d565b612c59565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612b7f5750600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612b9457612b8f838383613880565b612c58565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612c365750600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612c4b57612c46838383613a3e565b612c57565b612c56838383613880565b5b5b5b5b505050565b6000838311158290612d0c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612cd1578082015181840152602081019050612cb6565b50505050905090810190601f168015612cfe5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b612d4781600260008581526020019081526020016000206000016125d790919063ffffffff16565b15612daf57612d54612607565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000806000806000806000612dc788613d26565b915091506000612dd56130e4565b90506000806000612de78c8686613d78565b92509250925082828288889a509a509a509a509a5050505050505091939590929450565b612e338160026000858152602001908152602001600020600001613dd690919063ffffffff16565b15612e9b57612e40612607565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600080828401905083811015612f1d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612fca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b612fdf81600854612e9f90919063ffffffff16565b60088190555061303781600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e9f90919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b60008060006130f1613e06565b91509150613108818361310f90919063ffffffff16565b9250505090565b600061315183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614097565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561319357600080fd5b81600060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08183604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a15050565b6000613252836000018361415d565b60001c905092915050565b600061329f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612c5f565b905092915050565b60006132cf836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6141e0565b905092915050565b60006132e582600001614203565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561332657600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061337683836141e0565b6133cf5782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506133d4565b600090505b92915050565b60008060008060006133eb86612db3565b9450945094509450945061344786600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461325d90919063ffffffff16565b600460008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506134dc85600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461325d90919063ffffffff16565b600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061357184600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e9f90919063ffffffff16565b600360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506135be8382614214565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a35050505050505050565b600080600080600061363e86612db3565b9450945094509450945061369a85600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461325d90919063ffffffff16565b600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061372f82600460008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e9f90919063ffffffff16565b600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506137c484600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e9f90919063ffffffff16565b600360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506138118382614214565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a35050505050505050565b600080600080600061389186612db3565b945094509450945094506138ed85600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461325d90919063ffffffff16565b600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061398284600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e9f90919063ffffffff16565b600360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506139cf8382614214565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a35050505050505050565b6000806000806000613a4f86612db3565b94509450945094509450613aab86600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461325d90919063ffffffff16565b600460008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613b4085600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461325d90919063ffffffff16565b600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613bd582600460008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e9f90919063ffffffff16565b600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613c6a84600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e9f90919063ffffffff16565b600360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613cb78382614214565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a35050505050505050565b6000806000613d526064613d44600f8761424e90919063ffffffff16565b61310f90919063ffffffff16565b90506000613d69828661325d90919063ffffffff16565b90508082935093505050915091565b600080600080613d91858861424e90919063ffffffff16565b90506000613da8868861424e90919063ffffffff16565b90506000613dbf828461325d90919063ffffffff16565b905082818395509550955050505093509350939050565b6000613dfe836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6142d4565b905092915050565b600080600060095490506000600854905060005b60078054905081101561405a57826003600060078481548110613e3957fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541180613f205750816004600060078481548110613eb857fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b15613f375760095460085494509450505050614093565b613fc06003600060078481548110613f4b57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548461325d90919063ffffffff16565b925061404b6004600060078481548110613fd657fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548361325d90919063ffffffff16565b91508080600101915050613e1a565b5061407260085460095461310f90919063ffffffff16565b82101561408a57600954600854935093505050614093565b81819350935050505b9091565b60008083118290614143576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156141085780820151818401526020810190506140ed565b50505050905090810190601f1680156141355780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161414f57fe5b049050809150509392505050565b6000818360000180549050116141be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806143bd6022913960400191505060405180910390fd5b8260000182815481106141cd57fe5b9060005260206000200154905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b600081600001805490509050919050565b6142298260095461325d90919063ffffffff16565b60098190555061424481600a54612e9f90919063ffffffff16565b600a819055505050565b60008083141561426157600090506142ce565b600082840290508284828161427257fe5b04146142c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806144af6021913960400191505060405180910390fd5b809150505b92915050565b600080836001016000848152602001908152602001600020549050600081146143b0576000600182039050600060018660000180549050039050600086600001828154811061431f57fe5b906000526020600020015490508087600001848154811061433c57fe5b906000526020600020018190555060018301876001016000838152602001908152602001600020819055508660000180548061437457fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506143b6565b60009150505b9291505056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e647345524332303a207472616e7366657220746f20746865207a65726f2061646472657373416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f206772616e7445524332303a20617070726f766520746f20746865207a65726f2061646472657373416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f207265766f6b65416d6f756e74206d757374206265206c657373207468616e20746f74616c20646973747269627574696f6e73536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63655472616e7366657220616d6f756e74206d7573742062652067726561746572207468616e207a65726f45524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734578636c75646564206164647265737365732063616e6e6f742063616c6c20746869732066756e6374696f6e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636520726f6c657320666f722073656c66a2646970667358221220ff6e647006848239693e9edc934ccf7970aa6cfbfd106ff06466bb7328202c2e64736f6c63430007000033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102275760003560e01c80636d43542111610130578063a457c2d7116100b8578063d53913931161007c578063d539139314610b23578063d547741f14610b41578063dd62ed3e14610b8f578063f2cc0c1814610c07578063f84354f114610c4b57610227565b8063a457c2d71461097b578063a9059cbb146109df578063ca15c87314610a43578063cba0e99614610a85578063ccc3990914610adf57610227565b80639010d07c116100ff5780639010d07c146107e657806391c05b0b1461084857806391d148541461087657806395d89b41146108da578063a217fddf1461095d57610227565b80636d435421146106ec57806370a08231146107505780638456cb59146107a85780638da5cb5b146107b257610227565b80632f63e520116101b35780633f4ba83a116101825780633f4ba83a146105fe57806340c10f1914610608578063481c6a75146106565780635c975abb1461068a578063618ada00146106aa57610227565b80632f63e520146104dd578063313ce5671461052b57806336568abe1461054c578063395093511461059a57610227565b806318160ddd116101fa57806318160ddd1461035157806323b872dd1461036f578063248a9ca3146103f35780632f2ff15d146104355780632f54bf6e1461048357610227565b806305d2035b1461022c57806306fdde031461024c578063095ea7b3146102cf57806313114a9d14610333575b600080fd5b610234610c8f565b60405180821515815260200191505060405180910390f35b610254610ca2565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610294578082015181840152602081019050610279565b50505050905090810190601f1680156102c15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61031b600480360360408110156102e557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610d44565b60405180821515815260200191505060405180910390f35b61033b610d62565b6040518082815260200191505060405180910390f35b610359610d6c565b6040518082815260200191505060405180910390f35b6103db6004803603606081101561038557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610d76565b60405180821515815260200191505060405180910390f35b61041f6004803603602081101561040957600080fd5b8101908080359060200190929190505050610e4f565b6040518082815260200191505060405180910390f35b6104816004803603604081101561044b57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e6f565b005b6104c56004803603602081101561049957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ef9565b60405180821515815260200191505060405180910390f35b610515600480360360408110156104f357600080fd5b8101908080359060200190929190803515159060200190929190505050610f52565b6040518082815260200191505060405180910390f35b610533611007565b604051808260ff16815260200191505060405180910390f35b6105986004803603604081101561056257600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061101e565b005b6105e6600480360360408110156105b057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506110b7565b60405180821515815260200191505060405180910390f35b61060661116a565b005b6106546004803603604081101561061e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506112e4565b005b61065e6113bc565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106926113e2565b60405180821515815260200191505060405180910390f35b6106d6600480360360208110156106c057600080fd5b81019080803590602001909291905050506113f3565b6040518082815260200191505060405180910390f35b61074e6004803603604081101561070257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611477565b005b6107926004803603602081101561076657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506115a0565b6040518082815260200191505060405180910390f35b6107b061168b565b005b6107ba611806565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61081c600480360360408110156107fc57600080fd5b81019080803590602001909291908035906020019092919050505061182c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108746004803603602081101561085e57600080fd5b810190808035906020019092919050505061185e565b005b6108c26004803603604081101561088c57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119ee565b60405180821515815260200191505060405180910390f35b6108e2611a20565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610922578082015181840152602081019050610907565b50505050905090810190601f16801561094f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610965611ac2565b6040518082815260200191505060405180910390f35b6109c76004803603604081101561099157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611ac9565b60405180821515815260200191505060405180910390f35b610a2b600480360360408110156109f557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b96565b60405180821515815260200191505060405180910390f35b610a6f60048036036020811015610a5957600080fd5b8101908080359060200190929190505050611bb4565b6040518082815260200191505060405180910390f35b610ac760048036036020811015610a9b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611bdb565b60405180821515815260200191505060405180910390f35b610b2160048036036020811015610af557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c31565b005b610b2b611d58565b6040518082815260200191505060405180910390f35b610b8d60048036036040811015610b5757600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d7c565b005b610bf160048036036040811015610ba557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e06565b6040518082815260200191505060405180910390f35b610c4960048036036020811015610c1d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e8d565b005b610c8d60048036036020811015610c6157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506121fa565b005b600b60009054906101000a900460ff1681565b6060600c8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d3a5780601f10610d0f57610100808354040283529160200191610d3a565b820191906000526020600020905b815481529060010190602001808311610d1d57829003601f168201915b5050505050905090565b6000610d58610d51612607565b848461260f565b6001905092915050565b6000600a54905090565b6000600854905090565b6000610d83848484612806565b610e4484610d8f612607565b610e3f856040518060600160405280602881526020016144d060289139600560008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610df5612607565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c5f9092919063ffffffff16565b61260f565b600190509392505050565b600060026000838152602001908152602001600020600201549050919050565b610e966002600084815260200190815260200160002060020154610e91612607565b6119ee565b610eeb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180614402602f913960400191505060405180910390fd5b610ef58282612d1f565b5050565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b6000600854831115610fcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f416d6f756e74206d757374206265206c657373207468616e20737570706c790081525060200191505060405180910390fd5b81610feb576000610fdc84612db3565b50505050905080915050611001565b6000610ff684612db3565b505050915050809150505b92915050565b6000600e60009054906101000a900460ff16905090565b611026612607565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146110a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806145bb602f913960400191505060405180910390fd5b6110b38282612e0b565b5050565b60006111606110c4612607565b8461115b85600560006110d5612607565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e9f90919063ffffffff16565b61260f565b6001905092915050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806112135750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611285576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6d757374206265206f776e65720000000000000000000000000000000000000081525060200191505060405180910390fd5b60008054906101000a900460ff1661129c57600080fd5b60008060006101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611325612607565b73ffffffffffffffffffffffffffffffffffffffff16146113ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6e6f7420617574686f726973656420746f206d696e740000000000000000000081525060200191505060405180910390fd5b6113b88282612f27565b5050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900460ff1681565b6000600954821115611450576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614483602c913960400191505060405180910390fd5b600061145a6130e4565b905061146f818461310f90919063ffffffff16565b915050919050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806115205750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611592576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6d757374206265206f776e65720000000000000000000000000000000000000081525060200191505060405180910390fd5b61159c8282613159565b5050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561163b57600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050611686565b611683600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113f3565b90505b919050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806117345750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6117a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6d757374206265206f776e65720000000000000000000000000000000000000081525060200191505060405180910390fd5b60008054906101000a900460ff16156117be57600080fd5b60016000806101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611856826002600086815260200190815260200160002060000161324390919063ffffffff16565b905092915050565b6000611868612607565b9050600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561190d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061456a602c913960400191505060405180910390fd5b600061191883612db3565b50505050905061197081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461325d90919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506119c88160095461325d90919063ffffffff16565b6009819055506119e383600a54612e9f90919063ffffffff16565b600a81905550505050565b6000611a1882600260008681526020019081526020016000206000016132a790919063ffffffff16565b905092915050565b6060600d8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611ab85780601f10611a8d57610100808354040283529160200191611ab8565b820191906000526020600020905b815481529060010190602001808311611a9b57829003601f168201915b5050505050905090565b6000801b81565b6000611b8c611ad6612607565b84611b87856040518060600160405280602581526020016145966025913960056000611b00612607565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c5f9092919063ffffffff16565b61260f565b6001905092915050565b6000611baa611ba3612607565b8484612806565b6001905092915050565b6000611bd4600260008481526020019081526020016000206000016132d7565b9050919050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611cda5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611d4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6d757374206265206f776e65720000000000000000000000000000000000000081525060200191505060405180910390fd5b611d55816132ec565b50565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b611da36002600084815260200190815260200160002060020154611d9e612607565b6119ee565b611df8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806144536030913960400191505060405180910390fd5b611e028282612e0b565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611f365750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611fa8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6d757374206265206f776e65720000000000000000000000000000000000000081525060200191505060405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612068576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e7420697320616c7265616479206578636c75646564000000000081525060200191505060405180910390fd5b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561213c576120f8600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113f3565b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506007819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806122a35750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6d757374206265206f776e65720000000000000000000000000000000000000081525060200191505060405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166123d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e7420697320616c7265616479206578636c75646564000000000081525060200191505060405180910390fd5b60005b6007805490508110156125d3578173ffffffffffffffffffffffffffffffffffffffff166007828154811061240857fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156125c65760076001600780549050038154811061246457fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166007828154811061249c57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600780548061258c57fe5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590556125d3565b80806001019150506123d7565b5050565b60006125ff836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61336a565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612695576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806145466024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561271b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806144316022913960400191505060405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561288c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806145216025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612912576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806143df6023913960400191505060405180910390fd5b6000811161296b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806144f86029913960400191505060405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612a0e5750600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612a2357612a1e8383836133da565b612c5a565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612ac65750600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612adb57612ad683838361362d565b612c59565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612b7f5750600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612b9457612b8f838383613880565b612c58565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612c365750600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612c4b57612c46838383613a3e565b612c57565b612c56838383613880565b5b5b5b5b505050565b6000838311158290612d0c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612cd1578082015181840152602081019050612cb6565b50505050905090810190601f168015612cfe5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b612d4781600260008581526020019081526020016000206000016125d790919063ffffffff16565b15612daf57612d54612607565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000806000806000806000612dc788613d26565b915091506000612dd56130e4565b90506000806000612de78c8686613d78565b92509250925082828288889a509a509a509a509a5050505050505091939590929450565b612e338160026000858152602001908152602001600020600001613dd690919063ffffffff16565b15612e9b57612e40612607565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600080828401905083811015612f1d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612fca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b612fdf81600854612e9f90919063ffffffff16565b60088190555061303781600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e9f90919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b60008060006130f1613e06565b91509150613108818361310f90919063ffffffff16565b9250505090565b600061315183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614097565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561319357600080fd5b81600060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08183604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a15050565b6000613252836000018361415d565b60001c905092915050565b600061329f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612c5f565b905092915050565b60006132cf836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6141e0565b905092915050565b60006132e582600001614203565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561332657600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061337683836141e0565b6133cf5782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506133d4565b600090505b92915050565b60008060008060006133eb86612db3565b9450945094509450945061344786600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461325d90919063ffffffff16565b600460008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506134dc85600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461325d90919063ffffffff16565b600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061357184600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e9f90919063ffffffff16565b600360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506135be8382614214565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a35050505050505050565b600080600080600061363e86612db3565b9450945094509450945061369a85600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461325d90919063ffffffff16565b600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061372f82600460008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e9f90919063ffffffff16565b600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506137c484600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e9f90919063ffffffff16565b600360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506138118382614214565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a35050505050505050565b600080600080600061389186612db3565b945094509450945094506138ed85600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461325d90919063ffffffff16565b600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061398284600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e9f90919063ffffffff16565b600360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506139cf8382614214565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a35050505050505050565b6000806000806000613a4f86612db3565b94509450945094509450613aab86600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461325d90919063ffffffff16565b600460008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613b4085600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461325d90919063ffffffff16565b600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613bd582600460008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e9f90919063ffffffff16565b600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613c6a84600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e9f90919063ffffffff16565b600360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613cb78382614214565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a35050505050505050565b6000806000613d526064613d44600f8761424e90919063ffffffff16565b61310f90919063ffffffff16565b90506000613d69828661325d90919063ffffffff16565b90508082935093505050915091565b600080600080613d91858861424e90919063ffffffff16565b90506000613da8868861424e90919063ffffffff16565b90506000613dbf828461325d90919063ffffffff16565b905082818395509550955050505093509350939050565b6000613dfe836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6142d4565b905092915050565b600080600060095490506000600854905060005b60078054905081101561405a57826003600060078481548110613e3957fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541180613f205750816004600060078481548110613eb857fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b15613f375760095460085494509450505050614093565b613fc06003600060078481548110613f4b57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548461325d90919063ffffffff16565b925061404b6004600060078481548110613fd657fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548361325d90919063ffffffff16565b91508080600101915050613e1a565b5061407260085460095461310f90919063ffffffff16565b82101561408a57600954600854935093505050614093565b81819350935050505b9091565b60008083118290614143576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156141085780820151818401526020810190506140ed565b50505050905090810190601f1680156141355780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161414f57fe5b049050809150509392505050565b6000818360000180549050116141be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806143bd6022913960400191505060405180910390fd5b8260000182815481106141cd57fe5b9060005260206000200154905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b600081600001805490509050919050565b6142298260095461325d90919063ffffffff16565b60098190555061424481600a54612e9f90919063ffffffff16565b600a819055505050565b60008083141561426157600090506142ce565b600082840290508284828161427257fe5b04146142c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806144af6021913960400191505060405180910390fd5b809150505b92915050565b600080836001016000848152602001908152602001600020549050600081146143b0576000600182039050600060018660000180549050039050600086600001828154811061431f57fe5b906000526020600020015490508087600001848154811061433c57fe5b906000526020600020018190555060018301876001016000838152602001908152602001600020819055508660000180548061437457fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506143b6565b60009150505b9291505056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e647345524332303a207472616e7366657220746f20746865207a65726f2061646472657373416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f206772616e7445524332303a20617070726f766520746f20746865207a65726f2061646472657373416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f207265766f6b65416d6f756e74206d757374206265206c657373207468616e20746f74616c20646973747269627574696f6e73536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63655472616e7366657220616d6f756e74206d7573742062652067726561746572207468616e207a65726f45524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734578636c75646564206164647265737365732063616e6e6f742063616c6c20746869732066756e6374696f6e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636520726f6c657320666f722073656c66a2646970667358221220ff6e647006848239693e9edc934ccf7970aa6cfbfd106ff06466bb7328202c2e64736f6c63430007000033

Deployed Bytecode Sourcemap

28024:11051:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28686:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;29093:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30007:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;31777:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29370:95;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30835:313;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;24801:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25177:227;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20897:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;32259:436;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29279:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;26386:209;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31156:218;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;21400:105;;;:::i;:::-;;30176:160;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20375:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;20313:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;32703:257;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21007:141;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29473:200;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21285:105;;;:::i;:::-;;20348:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;24474:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;31872:379;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23435:139;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;29184:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22180:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31382:269;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;29681:167;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;23748:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31659:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;21156:119;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28842:62;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25649:230;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29856:143;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32968:334;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33310:478;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28686:35;;;;;;;;;;;;;:::o;29093:83::-;29130:13;29163:5;29156:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29093:83;:::o;30007:161::-;30082:4;30099:39;30108:12;:10;:12::i;:::-;30122:7;30131:6;30099:8;:39::i;:::-;30156:4;30149:11;;30007:161;;;;:::o;31777:87::-;31819:7;31846:10;;31839:17;;31777:87;:::o;29370:95::-;29423:7;29450;;29443:14;;29370:95;:::o;30835:313::-;30933:4;30950:36;30960:6;30968:9;30979:6;30950:9;:36::i;:::-;30997:121;31006:6;31014:12;:10;:12::i;:::-;31028:89;31066:6;31028:89;;;;;;;;;;;;;;;;;:11;:19;31040:6;31028:19;;;;;;;;;;;;;;;:33;31048:12;:10;:12::i;:::-;31028:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;30997:8;:121::i;:::-;31136:4;31129:11;;30835:313;;;;;:::o;24801:114::-;24858:7;24885:6;:12;24892:4;24885:12;;;;;;;;;;;:22;;;24878:29;;24801:114;;;:::o;25177:227::-;25261:45;25269:6;:12;25276:4;25269:12;;;;;;;;;;;:22;;;25293:12;:10;:12::i;:::-;25261:7;:45::i;:::-;25253:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25371:25;25382:4;25388:7;25371:10;:25::i;:::-;25177:227;;:::o;20897:100::-;20950:4;20984:5;;;;;;;;;;;20974:15;;:6;:15;;;20967:22;;20897:100;;;:::o;32259:436::-;32351:7;32390;;32379;:18;;32371:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32449:17;32444:244;;32484:15;32507:19;32518:7;32507:10;:19::i;:::-;32483:43;;;;;;32548:7;32541:14;;;;;32444:244;32590:23;32620:19;32631:7;32620:10;:19::i;:::-;32588:51;;;;;;32661:15;32654:22;;;32259:436;;;;;:::o;29279:83::-;29320:5;29345:9;;;;;;;;;;;29338:16;;29279:83;:::o;26386:209::-;26484:12;:10;:12::i;:::-;26473:23;;:7;:23;;;26465:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26561:26;26573:4;26579:7;26561:11;:26::i;:::-;26386:209;;:::o;31156:218::-;31244:4;31261:83;31270:12;:10;:12::i;:::-;31284:7;31293:50;31332:10;31293:11;:25;31305:12;:10;:12::i;:::-;31293:25;;;;;;;;;;;;;;;:34;31319:7;31293:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;31261:8;:83::i;:::-;31362:4;31355:11;;31156:218;;;;:::o;21400:105::-;20576:5;;;;;;;;;;;20562:19;;:10;:19;;;:44;;;;20599:7;;;;;;;;;;;20585:21;;:10;:21;;;20562:44;20554:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20772:6:::1;::::0;::::1;;;;;;;;20764:15;;;::::0;::::1;;21467:5:::2;21458:6:::0;::::2;:14;;;;;;;;;;;;;;;;;;21488:9;;;;;;;;;;21400:105::o:0;30176:160::-;30268:5;;;;;;;;;;;30252:21;;:12;:10;:12::i;:::-;:21;;;30244:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30311:17;30317:2;30321:6;30311:5;:17::i;:::-;30176:160;;:::o;20375:22::-;;;;;;;;;;;;;:::o;20313:26::-;;;;;;;;;;;;:::o;32703:257::-;32771:7;32810;;32799;:18;;32791:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32877:19;32900:10;:8;:10::i;:::-;32877:33;;32928:24;32940:11;32928:7;:11;;:24;;;;:::i;:::-;32921:31;;;32703:257;;;:::o;21007:141::-;20576:5;;;;;;;;;;;20562:19;;:10;:19;;;:44;;;;20599:7;;;;;;;;;;;20585:21;;:10;:21;;;20562:44;20554:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21100:40:::1;21119:9;21130;21100:18;:40::i;:::-;21007:141:::0;;:::o;29473:200::-;29539:7;29563:11;:20;29575:7;29563:20;;;;;;;;;;;;;;;;;;;;;;;;;29559:49;;;29592:7;:16;29600:7;29592:16;;;;;;;;;;;;;;;;29585:23;;;;29559:49;29626:39;29648:7;:16;29656:7;29648:16;;;;;;;;;;;;;;;;29626:21;:39::i;:::-;29619:46;;29473:200;;;;:::o;21285:105::-;20576:5;;;;;;;;;;;20562:19;;:10;:19;;;:44;;;;20599:7;;;;;;;;;;;20585:21;;:10;:21;;;20562:44;20554:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20696:6:::1;::::0;::::1;;;;;;;;20695:7;20687:16;;;::::0;::::1;;21355:4:::2;21346:6;::::0;:13:::2;;;;;;;;;;;;;;;;;;21375:7;;;;;;;;;;21285:105::o:0;20348:20::-;;;;;;;;;;;;;:::o;24474:138::-;24547:7;24574:30;24598:5;24574:6;:12;24581:4;24574:12;;;;;;;;;;;:20;;:23;;:30;;;;:::i;:::-;24567:37;;24474:138;;;;:::o;31872:379::-;31927:14;31944:12;:10;:12::i;:::-;31927:29;;31976:11;:19;31988:6;31976:19;;;;;;;;;;;;;;;;;;;;;;;;;31975:20;31967:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32056:15;32079:19;32090:7;32079:10;:19::i;:::-;32055:43;;;;;;32127:28;32147:7;32127;:15;32135:6;32127:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;32109:7;:15;32117:6;32109:15;;;;;;;;;;;;;;;:46;;;;32176:20;32188:7;32176;;:11;;:20;;;;:::i;:::-;32166:7;:30;;;;32220:23;32235:7;32220:10;;:14;;:23;;;;:::i;:::-;32207:10;:36;;;;31872:379;;;:::o;23435:139::-;23504:4;23528:38;23558:7;23528:6;:12;23535:4;23528:12;;;;;;;;;;;:20;;:29;;:38;;;;:::i;:::-;23521:45;;23435:139;;;;:::o;29184:87::-;29223:13;29256:7;29249:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29184:87;:::o;22180:49::-;22225:4;22180:49;;;:::o;31382:269::-;31475:4;31492:129;31501:12;:10;:12::i;:::-;31515:7;31524:96;31563:15;31524:96;;;;;;;;;;;;;;;;;:11;:25;31536:12;:10;:12::i;:::-;31524:25;;;;;;;;;;;;;;;:34;31550:7;31524:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;31492:8;:129::i;:::-;31639:4;31632:11;;31382:269;;;;:::o;29681:167::-;29759:4;29776:42;29786:12;:10;:12::i;:::-;29800:9;29811:6;29776:9;:42::i;:::-;29836:4;29829:11;;29681:167;;;;:::o;23748:127::-;23811:7;23838:29;:6;:12;23845:4;23838:12;;;;;;;;;;;:20;;:27;:29::i;:::-;23831:36;;23748:127;;;:::o;31659:110::-;31717:4;31741:11;:20;31753:7;31741:20;;;;;;;;;;;;;;;;;;;;;;;;;31734:27;;31659:110;;;:::o;21156:119::-;20576:5;;;;;;;;;;;20562:19;;:10;:19;;;:44;;;;20599:7;;;;;;;;;;;20585:21;;:10;:21;;;20562:44;20554:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21234:33:::1;21255:11;21234:20;:33::i;:::-;21156:119:::0;:::o;28842:62::-;28880:24;28842:62;:::o;25649:230::-;25734:45;25742:6;:12;25749:4;25742:12;;;;;;;;;;;:22;;;25766:12;:10;:12::i;:::-;25734:7;:45::i;:::-;25726:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25845:26;25857:4;25863:7;25845:11;:26::i;:::-;25649:230;;:::o;29856:143::-;29937:7;29964:11;:18;29976:5;29964:18;;;;;;;;;;;;;;;:27;29983:7;29964:27;;;;;;;;;;;;;;;;29957:34;;29856:143;;;;:::o;32968:334::-;20576:5;;;;;;;;;;;20562:19;;:10;:19;;;:44;;;;20599:7;;;;;;;;;;;20585:21;;:10;:21;;;20562:44;20554:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33050:11:::1;:20;33062:7;33050:20;;;;;;;;;;;;;;;;;;;;;;;;;33049:21;33041:61;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;33135:1;33116:7;:16;33124:7;33116:16;;;;;;;;;;;;;;;;:20;33113:110;;;33172:39;33194:7;:16;33202:7;33194:16;;;;;;;;;;;;;;;;33172:21;:39::i;:::-;33153:7;:16;33161:7;33153:16;;;;;;;;;;;;;;;:58;;;;33113:110;33256:4;33233:11;:20;33245:7;33233:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;33271:9;33286:7;33271:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32968:334:::0;:::o;33310:478::-;20576:5;;;;;;;;;;;20562:19;;:10;:19;;;:44;;;;20599:7;;;;;;;;;;;20585:21;;:10;:21;;;20562:44;20554:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33391:11:::1;:20;33403:7;33391:20;;;;;;;;;;;;;;;;;;;;;;;;;33383:60;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;33459:9;33454:327;33478:9;:16;;;;33474:1;:20;33454:327;;;33536:7;33520:23;;:9;33530:1;33520:12;;;;;;;;;;;;;;;;;;;;;;;;;:23;;;33516:254;;;33579:9;33608:1;33589:9;:16;;;;:20;33579:31;;;;;;;;;;;;;;;;;;;;;;;;;33564:9;33574:1;33564:12;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;33648:1;33629:7;:16;33637:7;33629:16;;;;;;;;;;;;;;;:20;;;;33691:5;33668:11;:20;33680:7;33668:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;33715:9;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33749:5;;33516:254;33496:3;;;;;;;33454:327;;;;33310:478:::0;:::o;14700:152::-;14770:4;14794:50;14799:3;:10;;14835:5;14819:23;;14811:32;;14794:4;:50::i;:::-;14787:57;;14700:152;;;;:::o;19926:106::-;19979:15;20014:10;20007:17;;19926:106;:::o;33796:337::-;33906:1;33889:19;;:5;:19;;;;33881:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33987:1;33968:21;;:7;:21;;;;33960:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34071:6;34041:11;:18;34053:5;34041:18;;;;;;;;;;;;;;;:27;34060:7;34041:27;;;;;;;;;;;;;;;:36;;;;34109:7;34093:32;;34102:5;34093:32;;;34118:6;34093:32;;;;;;;;;;;;;;;;;;33796:337;;;:::o;34141:931::-;34256:1;34238:20;;:6;:20;;;;34230:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34340:1;34319:23;;:9;:23;;;;34311:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34410:1;34401:6;:10;34393:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34472:11;:19;34484:6;34472:19;;;;;;;;;;;;;;;;;;;;;;;;;:46;;;;;34496:11;:22;34508:9;34496:22;;;;;;;;;;;;;;;;;;;;;;;;;34495:23;34472:46;34468:597;;;34535:48;34557:6;34565:9;34576:6;34535:21;:48::i;:::-;34468:597;;;34606:11;:19;34618:6;34606:19;;;;;;;;;;;;;;;;;;;;;;;;;34605:20;:46;;;;;34629:11;:22;34641:9;34629:22;;;;;;;;;;;;;;;;;;;;;;;;;34605:46;34601:464;;;34668:46;34688:6;34696:9;34707:6;34668:19;:46::i;:::-;34601:464;;;34737:11;:19;34749:6;34737:19;;;;;;;;;;;;;;;;;;;;;;;;;34736:20;:47;;;;;34761:11;:22;34773:9;34761:22;;;;;;;;;;;;;;;;;;;;;;;;;34760:23;34736:47;34732:333;;;34800:44;34818:6;34826:9;34837:6;34800:17;:44::i;:::-;34732:333;;;34866:11;:19;34878:6;34866:19;;;;;;;;;;;;;;;;;;;;;;;;;:45;;;;;34889:11;:22;34901:9;34889:22;;;;;;;;;;;;;;;;;;;;;;;;;34866:45;34862:203;;;34928:48;34950:6;34958:9;34969:6;34928:21;:48::i;:::-;34862:203;;;35009:44;35027:6;35035:9;35046:6;35009:17;:44::i;:::-;34862:203;34732:333;34601:464;34468:597;34141:931;;;:::o;18111:192::-;18197:7;18230:1;18225;:6;;18233:12;18217:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18257:9;18273:1;18269;:5;18257:17;;18294:1;18287:8;;;18111:192;;;;;:::o;27629:188::-;27703:33;27728:7;27703:6;:12;27710:4;27703:12;;;;;;;;;;;:20;;:24;;:33;;;;:::i;:::-;27699:111;;;27785:12;:10;:12::i;:::-;27758:40;;27776:7;27758:40;;27770:4;27758:40;;;;;;;;;;27699:111;27629:188;;:::o;37328:411::-;37387:7;37396;37405;37414;37423;37444:23;37469:12;37485:20;37497:7;37485:11;:20::i;:::-;37443:62;;;;37516:19;37539:10;:8;:10::i;:::-;37516:33;;37561:15;37578:23;37603:12;37619:39;37631:7;37640:4;37646:11;37619;:39::i;:::-;37560:98;;;;;;37677:7;37686:15;37703:4;37709:15;37726:4;37669:62;;;;;;;;;;;;;;;;37328:411;;;;;;;:::o;27825:192::-;27900:36;27928:7;27900:6;:12;27907:4;27900:12;;;;;;;;;;;:20;;:27;;:36;;;;:::i;:::-;27896:114;;;27985:12;:10;:12::i;:::-;27958:40;;27976:7;27958:40;;27970:4;27958:40;;;;;;;;;;27896:114;27825:192;;:::o;17780:181::-;17838:7;17858:9;17874:1;17870;:5;17858:17;;17899:1;17894;:6;;17886:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17952:1;17945:8;;;17780:181;;;;:::o;30525:302::-;30628:1;30609:21;;:7;:21;;;;30601:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30689:19;30701:6;30689:7;;:11;;:19;;;;:::i;:::-;30679:7;:29;;;;30738:28;30759:6;30738:7;:16;30746:7;30738:16;;;;;;;;;;;;;;;;:20;;:28;;;;:::i;:::-;30719:7;:16;30727:7;30719:16;;;;;;;;;;;;;;;:47;;;;30803:7;30782:37;;30799:1;30782:37;;;30812:6;30782:37;;;;;;;;;;;;;;;;;;30525:302;;:::o;38346:163::-;38387:7;38408:15;38425;38444:19;:17;:19::i;:::-;38407:56;;;;38481:20;38493:7;38481;:11;;:20;;;;:::i;:::-;38474:27;;;;38346:163;:::o;18569:132::-;18627:7;18654:39;18658:1;18661;18654:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;18647:46;;18569:132;;;;:::o;21513:212::-;21628:1;21607:23;;:9;:23;;;;21599:32;;;;;;21650:9;21642:5;;:17;;;;;;;;;;;;;;;;;;21675:42;21696:9;21707;21675:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;21513:212;;:::o;15986:158::-;16060:7;16111:22;16115:3;:10;;16127:5;16111:3;:22::i;:::-;16103:31;;16080:56;;15986:158;;;;:::o;17969:136::-;18027:7;18054:43;18058:1;18061;18054:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;18047:50;;17969:136;;;;:::o;15272:167::-;15352:4;15376:55;15386:3;:10;;15422:5;15406:23;;15398:32;;15376:9;:55::i;:::-;15369:62;;15272:167;;;;:::o;15525:117::-;15588:7;15615:19;15623:3;:10;;15615:7;:19::i;:::-;15608:26;;15525:117;;;:::o;21733:145::-;21835:1;21812:25;;:11;:25;;;;21804:34;;;;;;21859:11;21849:7;;:21;;;;;;;;;;;;;;;;;;21733:145;:::o;9764:414::-;9827:4;9849:21;9859:3;9864:5;9849:9;:21::i;:::-;9844:327;;9887:3;:11;;9904:5;9887:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10070:3;:11;;:18;;;;10048:3;:12;;:19;10061:5;10048:19;;;;;;;;;;;:40;;;;10110:4;10103:11;;;;9844:327;10154:5;10147:12;;9764:414;;;;;:::o;36065:509::-;36168:15;36185:23;36210:12;36224:23;36249:12;36265:19;36276:7;36265:10;:19::i;:::-;36167:117;;;;;;;;;;36313:28;36333:7;36313;:15;36321:6;36313:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;36295:7;:15;36303:6;36295:15;;;;;;;;;;;;;;;:46;;;;36370:28;36390:7;36370;:15;36378:6;36370:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;36352:7;:15;36360:6;36352:15;;;;;;;;;;;;;;;:46;;;;36430:39;36453:15;36430:7;:18;36438:9;36430:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;36409:7;:18;36417:9;36409:18;;;;;;;;;;;;;;;:60;;;;36480:26;36495:4;36501;36480:14;:26::i;:::-;36539:9;36522:44;;36531:6;36522:44;;;36550:15;36522:44;;;;;;;;;;;;;;;;;;36065:509;;;;;;;;:::o;35536:521::-;35637:15;35654:23;35679:12;35693:23;35718:12;35734:19;35745:7;35734:10;:19::i;:::-;35636:117;;;;;;;;;;35782:28;35802:7;35782;:15;35790:6;35782:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;35764:7;:15;35772:6;35764:15;;;;;;;;;;;;;;;:46;;;;35842:39;35865:15;35842:7;:18;35850:9;35842:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;35821:7;:18;35829:9;35821:18;;;;;;;;;;;;;;;:60;;;;35913:39;35936:15;35913:7;:18;35921:9;35913:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;35892:7;:18;35900:9;35892:18;;;;;;;;;;;;;;;:60;;;;35963:26;35978:4;35984;35963:14;:26::i;:::-;36022:9;36005:44;;36014:6;36005:44;;;36033:15;36005:44;;;;;;;;;;;;;;;;;;35536:521;;;;;;;;:::o;35080:448::-;35179:15;35196:23;35221:12;35235:23;35260:12;35276:19;35287:7;35276:10;:19::i;:::-;35178:117;;;;;;;;;;35324:28;35344:7;35324;:15;35332:6;35324:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;35306:7;:15;35314:6;35306:15;;;;;;;;;;;;;;;:46;;;;35384:39;35407:15;35384:7;:18;35392:9;35384:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;35363:7;:18;35371:9;35363:18;;;;;;;;;;;;;;;:60;;;;35434:26;35449:4;35455;35434:14;:26::i;:::-;35493:9;35476:44;;35485:6;35476:44;;;35504:15;35476:44;;;;;;;;;;;;;;;;;;35080:448;;;;;;;;:::o;36582:580::-;36685:15;36702:23;36727:12;36741:23;36766:12;36782:19;36793:7;36782:10;:19::i;:::-;36684:117;;;;;;;;;;36830:28;36850:7;36830;:15;36838:6;36830:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;36812:7;:15;36820:6;36812:15;;;;;;;;;;;;;;;:46;;;;36887:28;36907:7;36887;:15;36895:6;36887:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;36869:7;:15;36877:6;36869:15;;;;;;;;;;;;;;;:46;;;;36947:39;36970:15;36947:7;:18;36955:9;36947:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;36926:7;:18;36934:9;36926:18;;;;;;;;;;;;;;;:60;;;;37018:39;37041:15;37018:7;:18;37026:9;37018:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;36997:7;:18;37005:9;36997:18;;;;;;;;;;;;;;;:60;;;;37068:26;37083:4;37089;37068:14;:26::i;:::-;37127:9;37110:44;;37119:6;37110:44;;;37138:15;37110:44;;;;;;;;;;;;;;;;;;36582:580;;;;;;;;:::o;37747:249::-;37807:7;37816;37836:12;37851:42;37889:3;37851:33;28469:2;37851:7;:11;;:33;;;;:::i;:::-;:37;;:42;;;;:::i;:::-;37836:57;;37904:23;37930:17;37942:4;37930:7;:11;;:17;;;;:::i;:::-;37904:43;;37966:15;37983:4;37958:30;;;;;;37747:249;;;:::o;38004:334::-;38099:7;38108;38117;38137:15;38155:24;38167:11;38155:7;:11;;:24;;;;:::i;:::-;38137:42;;38190:12;38205:21;38214:11;38205:4;:8;;:21;;;;:::i;:::-;38190:36;;38237:23;38263:17;38275:4;38263:7;:11;;:17;;;;:::i;:::-;38237:43;;38299:7;38308:15;38325:4;38291:39;;;;;;;;;38004:334;;;;;;;:::o;15028:158::-;15101:4;15125:53;15133:3;:10;;15169:5;15153:23;;15145:32;;15125:7;:53::i;:::-;15118:60;;15028:158;;;;:::o;38517:555::-;38567:7;38576;38596:15;38614:7;;38596:25;;38632:15;38650:7;;38632:25;;38673:9;38668:289;38692:9;:16;;;;38688:1;:20;38668:289;;;38758:7;38734;:21;38742:9;38752:1;38742:12;;;;;;;;;;;;;;;;;;;;;;;;;38734:21;;;;;;;;;;;;;;;;:31;:66;;;;38793:7;38769;:21;38777:9;38787:1;38777:12;;;;;;;;;;;;;;;;;;;;;;;;;38769:21;;;;;;;;;;;;;;;;:31;38734:66;38730:97;;;38810:7;;38819;;38802:25;;;;;;;;;38730:97;38852:34;38864:7;:21;38872:9;38882:1;38872:12;;;;;;;;;;;;;;;;;;;;;;;;;38864:21;;;;;;;;;;;;;;;;38852:7;:11;;:34;;;;:::i;:::-;38842:44;;38911:34;38923:7;:21;38931:9;38941:1;38931:12;;;;;;;;;;;;;;;;;;;;;;;;;38923:21;;;;;;;;;;;;;;;;38911:7;:11;;:34;;;;:::i;:::-;38901:44;;38710:3;;;;;;;38668:289;;;;38981:20;38993:7;;38981;;:11;;:20;;;;:::i;:::-;38971:7;:30;38967:61;;;39011:7;;39020;;39003:25;;;;;;;;38967:61;39047:7;39056;39039:25;;;;;;38517:555;;;:::o;18709:189::-;18795:7;18827:1;18823;:5;18830:12;18815:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18854:9;18870:1;18866;:5;;;;;;18854:17;;18889:1;18882:8;;;18709:189;;;;;:::o;12652:204::-;12719:7;12768:5;12747:3;:11;;:18;;;;:26;12739:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12830:3;:11;;12842:5;12830:18;;;;;;;;;;;;;;;;12823:25;;12652:204;;;;:::o;11984:129::-;12057:4;12104:1;12081:3;:12;;:19;12094:5;12081:19;;;;;;;;;;;;:24;;12074:31;;11984:129;;;;:::o;12199:109::-;12255:7;12282:3;:11;;:18;;;;12275:25;;12199:109;;;:::o;37170:150::-;37251:17;37263:4;37251:7;;:11;;:17;;;;:::i;:::-;37241:7;:27;;;;37292:20;37307:4;37292:10;;:14;;:20;;;;:::i;:::-;37279:10;:33;;;;37170:150;;:::o;18311:250::-;18369:7;18398:1;18393;:6;18389:47;;;18423:1;18416:8;;;;18389:47;18448:9;18464:1;18460;:5;18448:17;;18493:1;18488;18484;:5;;;;;;:10;18476:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18552:1;18545:8;;;18311:250;;;;;:::o;10354:1544::-;10420:4;10538:18;10559:3;:12;;:19;10572:5;10559:19;;;;;;;;;;;;10538:40;;10609:1;10595:10;:15;10591:1300;;10957:21;10994:1;10981:10;:14;10957:38;;11010:17;11051:1;11030:3;:11;;:18;;;;:22;11010:42;;11297:17;11317:3;:11;;11329:9;11317:22;;;;;;;;;;;;;;;;11297:42;;11463:9;11434:3;:11;;11446:13;11434:26;;;;;;;;;;;;;;;:38;;;;11582:1;11566:13;:17;11540:3;:12;;:23;11553:9;11540:23;;;;;;;;;;;:43;;;;11692:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;11787:3;:12;;:19;11800:5;11787:19;;;;;;;;;;;11780:26;;;11830:4;11823:11;;;;;;;;10591:1300;11874:5;11867:12;;;10354:1544;;;;;:::o

Swarm Source

ipfs://ff6e647006848239693e9edc934ccf7970aa6cfbfd106ff06466bb7328202c2e
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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