ERC-20
Overview
Max Total Supply
100,000 E95
Holders
73
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
442.153324922107803761 E95Value
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
E95
Compiler Version
v0.8.28+commit.7893614a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-11-14 */ /* While E'vista approach offers a groundbreaking framework, we propose enhancements to further optimize its functionality. Website: https://e95.xyz X: https://x.com/ethereum_95 TG: https://t.me/ethereum_95 */ pragma solidity >=0.5.0; interface Ether95 { /** * @dev Called by the REBASE contract when tokens are received from source chain. * @param _srcChainId The chain id of the source chain. * @param _srcAddress The address of the REBASE token contract on the source chain. * @param _nonce The nonce of the transaction on the source chain. * @param _from The address of the account who calls the sendAndCall() on the source chain. * @param _amount The amount of tokens to transfer. * @param _payload Additional data with no specified format. */ function onREBASEReceived(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes32 _from, uint _amount, bytes calldata _payload) external; } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: contracts/Ether95/token/REBASE/v2/interfaces/ICommonREBASE.sol pragma solidity >=0.5.0; /** * @dev Interface of the IREBASE core standard */ interface ICommonREBASE is IERC165 { struct LzCallParams { address payable refundAddress; address zroPaymentAddress; bytes adapterParams; } /** * @dev estimate send token `_tokenId` to (`_dstChainId`, `_toAddress`) * _dstChainId - L0 defined chain id to send tokens too * _toAddress - dynamic bytes array which contains the address to whom you are sending tokens to on the dstChain * _amount - amount of the tokens to transfer * _useZro - indicates to use zro to pay L0 fees * _adapterParam - flexible bytes array to indicate messaging adapter services in L0 */ function estimateSendFee(uint16 _dstChainId, bytes32 _toAddress, uint _amount, bool _useZro, bytes calldata _adapterParams) external view returns (uint nativeFee, uint zroFee); function estimateSendAndCallFee(uint16 _dstChainId, bytes32 _toAddress, uint _amount, bytes calldata _payload, uint64 _dstGasForCall, bool _useZro, bytes calldata _adapterParams) external view returns (uint nativeFee, uint zroFee); /** * @dev returns the circulating amount of tokens on current chain */ function circulatingSupply() external view returns (uint); /** * @dev returns the address of the ERC20 token */ function token() external view returns (address); } // File: contracts/Ether95/token/REBASE/v2/interfaces/IREBASEV2.sol pragma solidity >=0.5.0; /** * @dev Interface of the IREBASE core standard */ interface IREBASEV2 is ICommonREBASE { /** * @dev send `_amount` amount of token to (`_dstChainId`, `_toAddress`) from `_from` * `_from` the owner of token * `_dstChainId` the destination chain identifier * `_toAddress` can be any size depending on the `dstChainId`. * `_amount` the quantity of tokens in wei * `_refundAddress` the address Ether95 refunds if too much message fee is sent * `_zroPaymentAddress` set to address(0x0) if not paying in ZRO (Ether95 Token) * `_adapterParams` is a flexible bytes array to indicate messaging adapter services */ function sendFrom(address _from, uint16 _dstChainId, bytes32 _toAddress, uint _amount, LzCallParams calldata _callParams) external payable; function sendAndCall(address _from, uint16 _dstChainId, bytes32 _toAddress, uint _amount, bytes calldata _payload, uint64 _dstGasForCall, LzCallParams calldata _callParams) external payable; } // File: contracts/Ether95/libraries/ExcessivelySafeCall.sol pragma solidity >=0.7.6; library ExcessivelySafeCall { uint constant LOW_28_MASK = 0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff; /// @notice Use when you _really_ really _really_ don't trust the called /// contract. This prevents the called contract from causing reversion of /// the caller in as many ways as we can. /// @dev The main difference between this and a solidity low-level call is /// that we limit the number of bytes that the callee can cause to be /// copied to caller memory. This prevents stupid things like malicious /// contracts returning 10,000,000 bytes causing a local OOG when copying /// to memory. /// @param _target The address to call /// @param _gas The amount of gas to forward to the remote contract /// @param _maxCopy The maximum number of bytes of returndata to copy /// to memory. /// @param _calldata The data to send to the remote contract /// @return success and returndata, as `.call()`. Returndata is capped to /// `_maxCopy` bytes. function excessivelySafeCall( address _target, uint _gas, uint16 _maxCopy, bytes memory _calldata ) internal returns (bool, bytes memory) { // set up for assembly call uint _toCopy; bool _success; bytes memory _returnData = new bytes(_maxCopy); // dispatch message to recipient // by assembly calling "handle" function // we call via assembly to avoid memcopying a very large returndata // returned by a malicious contract assembly { _success := call( _gas, // gas _target, // recipient 0, // ether value add(_calldata, 0x20), // inloc mload(_calldata), // inlen 0, // outloc 0 // outlen ) // limit our copy to 256 bytes _toCopy := returndatasize() if gt(_toCopy, _maxCopy) { _toCopy := _maxCopy } // Store the length of the copied bytes mstore(_returnData, _toCopy) // copy the bytes from returndata[0:_toCopy] returndatacopy(add(_returnData, 0x20), 0, _toCopy) } return (_success, _returnData); } /// @notice Use when you _really_ really _really_ don't trust the called /// contract. This prevents the called contract from causing reversion of /// the caller in as many ways as we can. /// @dev The main difference between this and a solidity low-level call is /// that we limit the number of bytes that the callee can cause to be /// copied to caller memory. This prevents stupid things like malicious /// contracts returning 10,000,000 bytes causing a local OOG when copying /// to memory. /// @param _target The address to call /// @param _gas The amount of gas to forward to the remote contract /// @param _maxCopy The maximum number of bytes of returndata to copy /// to memory. /// @param _calldata The data to send to the remote contract /// @return success and returndata, as `.call()`. Returndata is capped to /// `_maxCopy` bytes. function excessivelySafeStaticCall( address _target, uint _gas, uint16 _maxCopy, bytes memory _calldata ) internal view returns (bool, bytes memory) { // set up for assembly call uint _toCopy; bool _success; bytes memory _returnData = new bytes(_maxCopy); // dispatch message to recipient // by assembly calling "handle" function // we call via assembly to avoid memcopying a very large returndata // returned by a malicious contract assembly { _success := staticcall( _gas, // gas _target, // recipient add(_calldata, 0x20), // inloc mload(_calldata), // inlen 0, // outloc 0 // outlen ) // limit our copy to 256 bytes _toCopy := returndatasize() if gt(_toCopy, _maxCopy) { _toCopy := _maxCopy } // Store the length of the copied bytes mstore(_returnData, _toCopy) // copy the bytes from returndata[0:_toCopy] returndatacopy(add(_returnData, 0x20), 0, _toCopy) } return (_success, _returnData); } /** * @notice Swaps function selectors in encoded contract calls * @dev Allows reuse of encoded calldata for functions with identical * argument types but different names. It simply swaps out the first 4 bytes * for the new selector. This function modifies memory in place, and should * only be used with caution. * @param _newSelector The new 4-byte selector * @param _buf The encoded contract args */ function swapSelector(bytes4 _newSelector, bytes memory _buf) internal pure { require(_buf.length >= 4); uint _mask = LOW_28_MASK; assembly { // load the first word of let _word := mload(add(_buf, 0x20)) // mask out the top 4 bytes // /x _word := and(_word, _mask) _word := or(_newSelector, _word) mstore(add(_buf, 0x20), _word) } } } // File: contracts/Ether95/libraries/BytesLib.sol /* * @title Solidity Bytes Arrays Utils * @author Gonçalo Sá <[email protected]> * * @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity. * The library lets you concatenate, slice and type cast bytes arrays both in memory and storage. */ pragma solidity >=0.8.0 <0.9.0; library BytesLib { function concat(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bytes memory) { bytes memory tempBytes; assembly { // Get a location of some free memory and store it in tempBytes as // Solidity does for memory variables. tempBytes := mload(0x40) // Store the length of the first bytes array at the beginning of // the memory for tempBytes. let length := mload(_preBytes) mstore(tempBytes, length) // Maintain a memory counter for the current write location in the // temp bytes array by adding the 32 bytes for the array length to // the starting location. let mc := add(tempBytes, 0x20) // Stop copying when the memory counter reaches the length of the // first bytes array. let end := add(mc, length) for { // Initialize a copy counter to the start of the _preBytes data, // 32 bytes into its memory. let cc := add(_preBytes, 0x20) } lt(mc, end) { // Increase both counters by 32 bytes each iteration. mc := add(mc, 0x20) cc := add(cc, 0x20) } { // Write the _preBytes data into the tempBytes memory 32 bytes // at a time. mstore(mc, mload(cc)) } // Add the length of _postBytes to the current length of tempBytes // and store it as the new length in the first 32 bytes of the // tempBytes memory. length := mload(_postBytes) mstore(tempBytes, add(length, mload(tempBytes))) // Move the memory counter back from a multiple of 0x20 to the // actual end of the _preBytes data. mc := end // Stop copying when the memory counter reaches the new combined // length of the arrays. end := add(mc, length) for { let cc := add(_postBytes, 0x20) } lt(mc, end) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { mstore(mc, mload(cc)) } // Update the free-memory pointer by padding our last write location // to 32 bytes: add 31 bytes to the end of tempBytes to move to the // next 32 byte block, then round down to the nearest multiple of // 32. If the sum of the length of the two arrays is zero then add // one before rounding down to leave a blank 32 bytes (the length block with 0). mstore( 0x40, and( add(add(end, iszero(add(length, mload(_preBytes)))), 31), not(31) // Round down to the nearest 32 bytes. ) ) } return tempBytes; } function concatStorage(bytes storage _preBytes, bytes memory _postBytes) internal { assembly { // Read the first 32 bytes of _preBytes storage, which is the length // of the array. (We don't need to use the offset into the slot // because arrays use the entire slot.) let fslot := sload(_preBytes.slot) // Arrays of 31 bytes or less have an even value in their slot, // while longer arrays have an odd value. The actual length is // the slot divided by two for odd values, and the lowest order // byte divided by two for even values. // If the slot is even, bitwise and the slot with 255 and divide by // two to get the length. If the slot is odd, bitwise and the slot // with -1 and divide by two. let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2) let mlength := mload(_postBytes) let newlength := add(slength, mlength) // slength can contain both the length and contents of the array // if length < 32 bytes so let's prepare for that // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage switch add(lt(slength, 32), lt(newlength, 32)) case 2 { // Since the new array still fits in the slot, we just need to // update the contents of the slot. // uint256(bytes_storage) = uint256(bytes_storage) + uint256(bytes_memory) + new_length sstore( _preBytes.slot, // all the modifications to the slot are inside this // next block add( // we can just add to the slot contents because the // bytes we want to change are the LSBs fslot, add( mul( div( // load the bytes from memory mload(add(_postBytes, 0x20)), // zero all bytes to the right exp(0x100, sub(32, mlength)) ), // and now shift left the number of bytes to // leave space for the length in the slot exp(0x100, sub(32, newlength)) ), // increase length by the double of the memory // bytes length mul(mlength, 2) ) ) ) } case 1 { // The stored value fits in the slot, but the combined value // will exceed it. // get the keccak hash to get the contents of the array mstore(0x0, _preBytes.slot) let sc := add(keccak256(0x0, 0x20), div(slength, 32)) // save new length sstore(_preBytes.slot, add(mul(newlength, 2), 1)) // The contents of the _postBytes array start 32 bytes into // the structure. Our first read should obtain the `submod` // bytes that can fit into the unused space in the last word // of the stored array. To get this, we read 32 bytes starting // from `submod`, so the data we read overlaps with the array // contents by `submod` bytes. Masking the lowest-order // `submod` bytes allows us to add that value directly to the // stored value. let submod := sub(32, slength) let mc := add(_postBytes, submod) let end := add(_postBytes, mlength) let mask := sub(exp(0x100, submod), 1) sstore(sc, add(and(fslot, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00), and(mload(mc), mask))) for { mc := add(mc, 0x20) sc := add(sc, 1) } lt(mc, end) { sc := add(sc, 1) mc := add(mc, 0x20) } { sstore(sc, mload(mc)) } mask := exp(0x100, sub(mc, end)) sstore(sc, mul(div(mload(mc), mask), mask)) } default { // get the keccak hash to get the contents of the array mstore(0x0, _preBytes.slot) // Start copying to the last used word of the stored array. let sc := add(keccak256(0x0, 0x20), div(slength, 32)) // save new length sstore(_preBytes.slot, add(mul(newlength, 2), 1)) // Copy over the first `submod` bytes of the new data as in // case 1 above. let slengthmod := mod(slength, 32) let mlengthmod := mod(mlength, 32) let submod := sub(32, slengthmod) let mc := add(_postBytes, submod) let end := add(_postBytes, mlength) let mask := sub(exp(0x100, submod), 1) sstore(sc, add(sload(sc), and(mload(mc), mask))) for { sc := add(sc, 1) mc := add(mc, 0x20) } lt(mc, end) { sc := add(sc, 1) mc := add(mc, 0x20) } { sstore(sc, mload(mc)) } mask := exp(0x100, sub(mc, end)) sstore(sc, mul(div(mload(mc), mask), mask)) } } } function slice( bytes memory _bytes, uint _start, uint _length ) internal pure returns (bytes memory) { require(_length + 31 >= _length, "slice_overflow"); require(_bytes.length >= _start + _length, "slice_outOfBounds"); bytes memory tempBytes; assembly { switch iszero(_length) case 0 { // Get a location of some free memory and store it in tempBytes as // Solidity does for memory variables. tempBytes := mload(0x40) // The first word of the slice result is potentially a partial // word read from the original array. To read it, we calculate // the length of that partial word and start copying that many // bytes into the array. The first word we copy will start with // data we don't care about, but the last `lengthmod` bytes will // land at the beginning of the contents of the new array. When // we're done copying, we overwrite the full first word with // the actual length of the slice. let lengthmod := and(_length, 31) // The multiplication in the next line is necessary // because when slicing multiples of 32 bytes (lengthmod == 0) // the following copy loop was copying the origin's length // and then ending prematurely not copying everything it should. let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod))) let end := add(mc, _length) for { // The multiplication in the next line has the same exact purpose // as the one above. let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start) } lt(mc, end) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { mstore(mc, mload(cc)) } mstore(tempBytes, _length) //update free-memory pointer //allocating the array padded to 32 bytes like the compiler does now mstore(0x40, and(add(mc, 31), not(31))) } //if we want a zero-length slice let's just return a zero-length array default { tempBytes := mload(0x40) //zero out the 32 bytes slice we are about to return //we need to do it because Solidity does not garbage collect mstore(tempBytes, 0) mstore(0x40, add(tempBytes, 0x20)) } } return tempBytes; } function toAddress(bytes memory _bytes, uint _start) internal pure returns (address) { require(_bytes.length >= _start + 20, "toAddress_outOfBounds"); address tempAddress; assembly { tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000) } return tempAddress; } function toUint8(bytes memory _bytes, uint _start) internal pure returns (uint8) { require(_bytes.length >= _start + 1, "toUint8_outOfBounds"); uint8 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x1), _start)) } return tempUint; } function toUint16(bytes memory _bytes, uint _start) internal pure returns (uint16) { require(_bytes.length >= _start + 2, "toUint16_outOfBounds"); uint16 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x2), _start)) } return tempUint; } function toUint32(bytes memory _bytes, uint _start) internal pure returns (uint32) { require(_bytes.length >= _start + 4, "toUint32_outOfBounds"); uint32 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x4), _start)) } return tempUint; } function toUint64(bytes memory _bytes, uint _start) internal pure returns (uint64) { require(_bytes.length >= _start + 8, "toUint64_outOfBounds"); uint64 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x8), _start)) } return tempUint; } function toUint96(bytes memory _bytes, uint _start) internal pure returns (uint96) { require(_bytes.length >= _start + 12, "toUint96_outOfBounds"); uint96 tempUint; assembly { tempUint := mload(add(add(_bytes, 0xc), _start)) } return tempUint; } function toUint128(bytes memory _bytes, uint _start) internal pure returns (uint128) { require(_bytes.length >= _start + 16, "toUint128_outOfBounds"); uint128 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x10), _start)) } return tempUint; } function toUint256(bytes memory _bytes, uint _start) internal pure returns (uint) { require(_bytes.length >= _start + 32, "toUint256_outOfBounds"); uint tempUint; assembly { tempUint := mload(add(add(_bytes, 0x20), _start)) } return tempUint; } function toBytes32(bytes memory _bytes, uint _start) internal pure returns (bytes32) { require(_bytes.length >= _start + 32, "toBytes32_outOfBounds"); bytes32 tempBytes32; assembly { tempBytes32 := mload(add(add(_bytes, 0x20), _start)) } return tempBytes32; } function equal(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bool) { bool success = true; assembly { let length := mload(_preBytes) // if lengths don't match the arrays are not equal switch eq(length, mload(_postBytes)) case 1 { // cb is a circuit breaker in the for loop since there's // no said feature for inline assembly loops // cb = 1 - don't breaker // cb = 0 - break let cb := 1 let mc := add(_preBytes, 0x20) let end := add(mc, length) for { let cc := add(_postBytes, 0x20) // the next line is the loop condition: // while(uint256(mc < end) + cb == 2) } eq(add(lt(mc, end), cb), 2) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { // if any of these checks fails then arrays are not equal if iszero(eq(mload(mc), mload(cc))) { // unsuccess: success := 0 cb := 0 } } } default { // unsuccess: success := 0 } } return success; } function equalStorage(bytes storage _preBytes, bytes memory _postBytes) internal view returns (bool) { bool success = true; assembly { // we know _preBytes_offset is 0 let fslot := sload(_preBytes.slot) // Decode the length of the stored array like in concatStorage(). let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2) let mlength := mload(_postBytes) // if lengths don't match the arrays are not equal switch eq(slength, mlength) case 1 { // slength can contain both the length and contents of the array // if length < 32 bytes so let's prepare for that // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage if iszero(iszero(slength)) { switch lt(slength, 32) case 1 { // blank the last byte which is the length fslot := mul(div(fslot, 0x100), 0x100) if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) { // unsuccess: success := 0 } } default { // cb is a circuit breaker in the for loop since there's // no said feature for inline assembly loops // cb = 1 - don't breaker // cb = 0 - break let cb := 1 // get the keccak hash to get the contents of the array mstore(0x0, _preBytes.slot) let sc := keccak256(0x0, 0x20) let mc := add(_postBytes, 0x20) let end := add(mc, mlength) // the next line is the loop condition: // while(uint256(mc < end) + cb == 2) for { } eq(add(lt(mc, end), cb), 2) { sc := add(sc, 1) mc := add(mc, 0x20) } { if iszero(eq(sload(sc), mload(mc))) { // unsuccess: success := 0 cb := 0 } } } } } default { // unsuccess: success := 0 } } return success; } } // File: contracts/Ether95/Ether95eApp/interfaces/IEther95UserApplicationConfig.sol pragma solidity >=0.5.0; interface IEther95UserApplicationConfig { // @notice set the configuration of the Ether95 messaging library of the specified version // @param _version - messaging library version // @param _chainId - the chainId for the pending config change // @param _configType - type of configuration. every messaging library has its own convention. // @param _config - configuration in the bytes. can encode arbitrary content. function setConfig( uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config ) external; // @notice set the send() Ether95 messaging library version to _version // @param _version - new messaging library version function setSendVersion(uint16 _version) external; // @notice set the Ether95eReceive() Ether95 messaging library version to _version // @param _version - new messaging library version function setReceiveVersion(uint16 _version) external; // @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload // @param _srcChainId - the chainId of the source chain // @param _srcAddress - the contract address of the source contract at the source chain function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external; } // File: contracts/Ether95/Ether95eApp/interfaces/IEther95Endpoint.sol pragma solidity >=0.5.0; interface IEther95Endpoint is IEther95UserApplicationConfig { // @notice send a Ether95 message to the specified address at a Ether95 endpoint. // @param _dstChainId - the destination chain identifier // @param _destination - the address on destination chain (in bytes). address length/format may vary by chains // @param _payload - a custom bytes payload to send to the destination contract // @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address // @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction // @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on destination function send( uint16 _dstChainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams ) external payable; // @notice used by the messaging library to publish verified payload // @param _srcChainId - the source chain identifier // @param _srcAddress - the source contract (as bytes) at the source chain // @param _dstAddress - the address on destination chain // @param _nonce - the unbound message ordering nonce // @param _gasLimit - the gas limit for external contract execution // @param _payload - verified payload to send to the destination contract function receivePayload( uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint _gasLimit, bytes calldata _payload ) external; // @notice get the inboundNonce of a Ether95eApp from a source chain which could be EVM or non-EVM chain // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64); // @notice get the outboundNonce from this source chain which, consequently, is always an EVM // @param _srcAddress - the source chain contract address function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64); // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery // @param _dstChainId - the destination chain identifier // @param _userApplication - the user app address on this EVM chain // @param _payload - the custom message to send over Ether95 // @param _payInZRO - if false, user app pays the protocol fee in native token // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain function estimateFees( uint16 _dstChainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam ) external view returns (uint nativeFee, uint zroFee); // @notice get this Endpoint's immutable source identifier function getChainId() external view returns (uint16); // @notice the interface to retry failed message on this Endpoint destination // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address // @param _payload - the payload to be retried function retryPayload( uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload ) external; // @notice query if any STORED payload (message blocking) at the endpoint. // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool); // @notice query if the _libraryAddress is valid for sending msgs. // @param _userApplication - the user app address on this EVM chain function getSendLibraryAddress(address _userApplication) external view returns (address); // @notice query if the _libraryAddress is valid for receiving msgs. // @param _userApplication - the user app address on this EVM chain function getReceiveLibraryAddress(address _userApplication) external view returns (address); // @notice query if the non-reentrancy guard for send() is on // @return true if the guard is on. false otherwise function isSendingPayload() external view returns (bool); // @notice query if the non-reentrancy guard for receive() is on // @return true if the guard is on. false otherwise function isReceivingPayload() external view returns (bool); // @notice get the configuration of the Ether95 messaging library of the specified version // @param _version - messaging library version // @param _chainId - the chainId for the pending config change // @param _userApplication - the contract address of the user application // @param _configType - type of configuration. every messaging library has its own convention. function getConfig( uint16 _version, uint16 _chainId, address _userApplication, uint _configType ) external view returns (bytes memory); // @notice get the send() Ether95 messaging library version // @param _userApplication - the contract address of the user application function getSendVersion(address _userApplication) external view returns (uint16); // @notice get the Ether95eReceive() Ether95 messaging library version // @param _userApplication - the contract address of the user application function getReceiveVersion(address _userApplication) external view returns (uint16); } // File: contracts/Ether95/Ether95eApp/interfaces/IEther95Receiver.sol pragma solidity >=0.5.0; interface IEther95Receiver { // @notice Ether95 endpoint will invoke this function to deliver the message on the destination // @param _srcChainId - the source endpoint identifier // @param _srcAddress - the source sending contract address from the source chain // @param _nonce - the ordered message nonce // @param _payload - the signed payload is the UA bytes has encoded to be sent function Ether95eReceive( uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload ) external; } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: contracts/Ether95/Ether95eApp/Ether95eApp.sol pragma solidity ^0.8.0; /* * a generic Ether95eReceiver implementation */ abstract contract Ether95eApp is Ownable, IEther95Receiver, IEther95UserApplicationConfig { using BytesLib for bytes; // ua can not send payload larger than this by default, but it can be changed by the ua owner uint public constant DEFAULT_PAYLOAD_SIZE_LIMIT = 10000; IEther95Endpoint public immutable lzEndpoint; mapping(uint16 => bytes) public trustedRemoteLookup; mapping(uint16 => mapping(uint16 => uint)) public minDstGasLookup; mapping(uint16 => uint) public payloadSizeLimitLookup; address public precrime; event SetPrecrime(address precrime); event SetTrustedRemote(uint16 _remoteChainId, bytes _path); event SetTrustedRemoteAddress(uint16 _remoteChainId, bytes _remoteAddress); event SetMinDstGas(uint16 _dstChainId, uint16 _type, uint _minDstGas); constructor(address _endpoint) { lzEndpoint = IEther95Endpoint(_endpoint); } function Ether95eReceive( uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload ) public virtual override { // Ether95eReceive must be called by the endpoint for security require(_msgSender() == address(lzEndpoint), "Ether95eApp: invalid endpoint caller"); bytes memory trustedRemote = trustedRemoteLookup[_srcChainId]; // if will still block the message pathway from (srcChainId, srcAddress). should not receive message from untrusted remote. require( _srcAddress.length == trustedRemote.length && trustedRemote.length > 0 && keccak256(_srcAddress) == keccak256(trustedRemote), "Ether95eApp: invalid source sending contract" ); _blockingEther95eReceive(_srcChainId, _srcAddress, _nonce, _payload); } // abstract function - the default behaviour of Ether95 is blocking. See: NonblockingEther95eApp if you dont need to enforce ordered messaging function _blockingEther95eReceive( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload ) internal virtual; function _lzSend( uint16 _dstChainId, bytes memory _payload, address payable _refundAddress, address _zroPaymentAddress, bytes memory _adapterParams, uint _nativeFee ) internal virtual { bytes memory trustedRemote = trustedRemoteLookup[_dstChainId]; require(trustedRemote.length != 0, "Ether95eApp: destination chain is not a trusted source"); _checkPayloadSize(_dstChainId, _payload.length); lzEndpoint.send{value: _nativeFee}(_dstChainId, trustedRemote, _payload, _refundAddress, _zroPaymentAddress, _adapterParams); } function _checkGasLimit( uint16 _dstChainId, uint16 _type, bytes memory _adapterParams, uint _extraGas ) internal view virtual { uint providedGasLimit = _getGasLimit(_adapterParams); uint minGasLimit = minDstGasLookup[_dstChainId][_type]; require(minGasLimit > 0, "Ether95eApp: minGasLimit not set"); require(providedGasLimit >= minGasLimit + _extraGas, "Ether95eApp: gas limit is too low"); } function _getGasLimit(bytes memory _adapterParams) internal pure virtual returns (uint gasLimit) { require(_adapterParams.length >= 34, "Ether95eApp: invalid adapterParams"); assembly { gasLimit := mload(add(_adapterParams, 34)) } } function _checkPayloadSize(uint16 _dstChainId, uint _payloadSize) internal view virtual { uint payloadSizeLimit = payloadSizeLimitLookup[_dstChainId]; if (payloadSizeLimit == 0) { // use default if not set payloadSizeLimit = DEFAULT_PAYLOAD_SIZE_LIMIT; } require(_payloadSize <= payloadSizeLimit, "Ether95eApp: payload size is too large"); } //---------------------------UserApplication config---------------------------------------- function getConfig( uint16 _version, uint16 _chainId, address, uint _configType ) external view returns (bytes memory) { return lzEndpoint.getConfig(_version, _chainId, address(this), _configType); } // generic config for Ether95 user Application function setConfig( uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config ) external override onlyOwner { lzEndpoint.setConfig(_version, _chainId, _configType, _config); } function setSendVersion(uint16 _version) external override onlyOwner { lzEndpoint.setSendVersion(_version); } function setReceiveVersion(uint16 _version) external override onlyOwner { lzEndpoint.setReceiveVersion(_version); } function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external override onlyOwner { lzEndpoint.forceResumeReceive(_srcChainId, _srcAddress); } // _path = abi.encodePacked(remoteAddress, localAddress) // this function set the trusted path for the cross-chain communication function setTrustedRemote(uint16 _remoteChainId, bytes calldata _path) external onlyOwner { trustedRemoteLookup[_remoteChainId] = _path; emit SetTrustedRemote(_remoteChainId, _path); } function setTrustedRemoteAddress(uint16 _remoteChainId, bytes calldata _remoteAddress) external onlyOwner { trustedRemoteLookup[_remoteChainId] = abi.encodePacked(_remoteAddress, address(this)); emit SetTrustedRemoteAddress(_remoteChainId, _remoteAddress); } function getTrustedRemoteAddress(uint16 _remoteChainId) external view returns (bytes memory) { bytes memory path = trustedRemoteLookup[_remoteChainId]; require(path.length != 0, "Ether95eApp: no trusted path record"); return path.slice(0, path.length - 20); // the last 20 bytes should be address(this) } function setPrecrime(address _precrime) external onlyOwner { precrime = _precrime; emit SetPrecrime(_precrime); } function setMinDstGas( uint16 _dstChainId, uint16 _packetType, uint _minGas ) external onlyOwner { minDstGasLookup[_dstChainId][_packetType] = _minGas; emit SetMinDstGas(_dstChainId, _packetType, _minGas); } // if the size is 0, it means default size limit function setPayloadSizeLimit(uint16 _dstChainId, uint _size) external onlyOwner { payloadSizeLimitLookup[_dstChainId] = _size; } //--------------------------- VIEW FUNCTION ---------------------------------------- function isTrustedRemote(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool) { bytes memory trustedSource = trustedRemoteLookup[_srcChainId]; return keccak256(trustedSource) == keccak256(_srcAddress); } } // File: contracts/Ether95/Ether95eApp/NonblockingEther95eApp.sol pragma solidity ^0.8.0; /* * the default Ether95 messaging behaviour is blocking, i.e. any failed message will block the channel * this abstract class try-catch all fail messages and store locally for future retry. hence, non-blocking * NOTE: if the srcAddress is not configured properly, it will still block the message pathway from (srcChainId, srcAddress) */ abstract contract NonblockingEther95eApp is Ether95eApp { using ExcessivelySafeCall for address; constructor(address _endpoint) Ether95eApp(_endpoint) {} mapping(uint16 => mapping(bytes => mapping(uint64 => bytes32))) public failedMessages; event MessageFailed(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes _payload, bytes _reason); event RetryMessageSuccess(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes32 _payloadHash); // overriding the virtual function in Ether95eReceiver function _blockingEther95eReceive( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload ) internal virtual override { (bool success, bytes memory reason) = address(this).excessivelySafeCall( gasleft(), 150, abi.encodeWithSelector(this.nonblockingEther95eReceive.selector, _srcChainId, _srcAddress, _nonce, _payload) ); if (!success) { _storeFailedMessage(_srcChainId, _srcAddress, _nonce, _payload, reason); } } function _storeFailedMessage( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload, bytes memory _reason ) internal virtual { failedMessages[_srcChainId][_srcAddress][_nonce] = keccak256(_payload); emit MessageFailed(_srcChainId, _srcAddress, _nonce, _payload, _reason); } function nonblockingEther95eReceive( uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload ) public virtual { // only internal transaction require(_msgSender() == address(this), "NonblockingEther95eApp: caller must be Ether95eApp"); _nonblockingEther95eReceive(_srcChainId, _srcAddress, _nonce, _payload); } //@notice override this function function _nonblockingEther95eReceive( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload ) internal virtual; function retryMessage( uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload ) public payable virtual { // assert there is message to retry bytes32 payloadHash = failedMessages[_srcChainId][_srcAddress][_nonce]; require(payloadHash != bytes32(0), "NonblockingEther95eApp: no stored message"); require(keccak256(_payload) == payloadHash, "NonblockingEther95eApp: invalid payload"); // clear the stored message failedMessages[_srcChainId][_srcAddress][_nonce] = bytes32(0); // execute the message. revert if it fails again _nonblockingEther95eReceive(_srcChainId, _srcAddress, _nonce, _payload); emit RetryMessageSuccess(_srcChainId, _srcAddress, _nonce, payloadHash); } } // File: contracts/Ether95/token/REBASE/v2/REBASECoreV2.sol pragma solidity ^0.8.0; abstract contract REBASECoreV2 is NonblockingEther95eApp { using BytesLib for bytes; using ExcessivelySafeCall for address; uint public constant NO_EXTRA_GAS = 0; // packet type uint8 public constant PT_SEND = 0; uint8 public constant PT_SEND_AND_CALL = 1; uint8 public immutable sharedDecimals; mapping(uint16 => mapping(bytes => mapping(uint64 => bool))) public creditedPackets; /** * @dev Emitted when `_amount` tokens are moved from the `_sender` to (`_dstChainId`, `_toAddress`) * `_nonce` is the outbound nonce */ event SendToChain(uint16 indexed _dstChainId, address indexed _from, bytes32 indexed _toAddress, uint _amount); /** * @dev Emitted when `_amount` tokens are received from `_srcChainId` into the `_toAddress` on the local chain. * `_nonce` is the inbound nonce. */ event ReceiveFromChain(uint16 indexed _srcChainId, address indexed _to, uint _amount); event CallREBASEReceivedSuccess(uint16 indexed _srcChainId, bytes _srcAddress, uint64 _nonce, bytes32 _hash); event NonContractAddress(address _address); // _sharedDecimals should be the minimum decimals on all chains constructor(uint8 _sharedDecimals, address _lzEndpoint) NonblockingEther95eApp(_lzEndpoint) { sharedDecimals = _sharedDecimals; } /************************************************************************ * public functions ************************************************************************/ function callOnREBASEReceived( uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes32 _from, address _to, uint _amount, bytes calldata _payload, uint _gasForCall ) public virtual { require(_msgSender() == address(this), "REBASECore: caller must be REBASECore"); // send _amount = _transferFrom(address(this), _to, _amount); emit ReceiveFromChain(_srcChainId, _to, _amount); // call Ether95(_to).onREBASEReceived{gas: _gasForCall}(_srcChainId, _srcAddress, _nonce, _from, _amount, _payload); } /************************************************************************ * internal functions ************************************************************************/ function _estimateSendFee( uint16 _dstChainId, bytes32 _toAddress, uint _amount, bool _useZro, bytes memory _adapterParams ) internal view virtual returns (uint nativeFee, uint zroFee) { // mock the payload for sendFrom() bytes memory payload = _encodeSendPayload(_toAddress, _ld2sd(_amount)); return lzEndpoint.estimateFees(_dstChainId, address(this), payload, _useZro, _adapterParams); } function _estimateSendAndCallFee( uint16 _dstChainId, bytes32 _toAddress, uint _amount, bytes memory _payload, uint64 _dstGasForCall, bool _useZro, bytes memory _adapterParams ) internal view virtual returns (uint nativeFee, uint zroFee) { // mock the payload for sendAndCall() bytes memory payload = _encodeSendAndCallPayload(msg.sender, _toAddress, _ld2sd(_amount), _payload, _dstGasForCall); return lzEndpoint.estimateFees(_dstChainId, address(this), payload, _useZro, _adapterParams); } function _nonblockingEther95eReceive( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload ) internal virtual override { uint8 packetType = _payload.toUint8(0); if (packetType == PT_SEND) { _sendAck(_srcChainId, _srcAddress, _nonce, _payload); } else if (packetType == PT_SEND_AND_CALL) { _sendAndCallAck(_srcChainId, _srcAddress, _nonce, _payload); } else { revert("REBASECore: unknown packet type"); } } function _send( address _from, uint16 _dstChainId, bytes32 _toAddress, uint _amount, address payable _refundAddress, address _zroPaymentAddress, bytes memory _adapterParams ) internal virtual returns (uint amount) { _checkGasLimit(_dstChainId, PT_SEND, _adapterParams, NO_EXTRA_GAS); (amount, ) = _removeDust(_amount); amount = _debitFrom(_from, _dstChainId, _toAddress, amount); // amount returned should not have dust require(amount > 0, "REBASECore: amount too small"); bytes memory lzPayload = _encodeSendPayload(_toAddress, _ld2sd(amount)); _lzSend(_dstChainId, lzPayload, _refundAddress, _zroPaymentAddress, _adapterParams, msg.value); emit SendToChain(_dstChainId, _from, _toAddress, amount); } function _sendAck( uint16 _srcChainId, bytes memory, uint64, bytes memory _payload ) internal virtual { (address to, uint64 amountSD) = _decodeSendPayload(_payload); if (to == address(0)) { to = address(0xdead); } uint amount = _sd2ld(amountSD); amount = _creditTo(_srcChainId, to, amount); emit ReceiveFromChain(_srcChainId, to, amount); } function _sendAndCall( address _from, uint16 _dstChainId, bytes32 _toAddress, uint _amount, bytes memory _payload, uint64 _dstGasForCall, address payable _refundAddress, address _zroPaymentAddress, bytes memory _adapterParams ) internal virtual returns (uint amount) { _checkGasLimit(_dstChainId, PT_SEND_AND_CALL, _adapterParams, _dstGasForCall); (amount, ) = _removeDust(_amount); amount = _debitFrom(_from, _dstChainId, _toAddress, amount); require(amount > 0, "REBASECore: amount too small"); // encode the msg.sender into the payload instead of _from bytes memory lzPayload = _encodeSendAndCallPayload(msg.sender, _toAddress, _ld2sd(amount), _payload, _dstGasForCall); _lzSend(_dstChainId, lzPayload, _refundAddress, _zroPaymentAddress, _adapterParams, msg.value); emit SendToChain(_dstChainId, _from, _toAddress, amount); } function _sendAndCallAck( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload ) internal virtual { (bytes32 from, address to, uint64 amountSD, bytes memory payloadForCall, uint64 gasForCall) = _decodeSendAndCallPayload(_payload); bool credited = creditedPackets[_srcChainId][_srcAddress][_nonce]; uint amount = _sd2ld(amountSD); // credit to this contract first, and then transfer to receiver only if callOnREBASEReceived() succeeds if (!credited) { amount = _creditTo(_srcChainId, address(this), amount); creditedPackets[_srcChainId][_srcAddress][_nonce] = true; } if (!_isContract(to)) { emit NonContractAddress(to); return; } // workaround for stack too deep uint16 srcChainId = _srcChainId; bytes memory srcAddress = _srcAddress; uint64 nonce = _nonce; bytes memory payload = _payload; bytes32 from_ = from; address to_ = to; uint amount_ = amount; bytes memory payloadForCall_ = payloadForCall; // no gas limit for the call if retry uint gas = credited ? gasleft() : gasForCall; (bool success, bytes memory reason) = address(this).excessivelySafeCall( gasleft(), 150, abi.encodeWithSelector(this.callOnREBASEReceived.selector, srcChainId, srcAddress, nonce, from_, to_, amount_, payloadForCall_, gas) ); if (success) { bytes32 hash = keccak256(payload); emit CallREBASEReceivedSuccess(srcChainId, srcAddress, nonce, hash); } else { // store the failed message into the nonblockingEther95eApp _storeFailedMessage(srcChainId, srcAddress, nonce, payload, reason); } } function _isContract(address _account) internal view returns (bool) { return _account.code.length > 0; } function _ld2sd(uint _amount) internal view virtual returns (uint64) { uint amountSD = _amount / _ld2sdRate(); require(amountSD <= type(uint64).max, "REBASECore: amountSD overflow"); return uint64(amountSD); } function _sd2ld(uint64 _amountSD) internal view virtual returns (uint) { return _amountSD * _ld2sdRate(); } function _removeDust(uint _amount) internal view virtual returns (uint amountAfter, uint dust) { dust = _amount % _ld2sdRate(); amountAfter = _amount - dust; } function _encodeSendPayload(bytes32 _toAddress, uint64 _amountSD) internal view virtual returns (bytes memory) { return abi.encodePacked(PT_SEND, _toAddress, _amountSD); } function _decodeSendPayload(bytes memory _payload) internal view virtual returns (address to, uint64 amountSD) { require(_payload.toUint8(0) == PT_SEND && _payload.length == 41, "REBASECore: invalid payload"); to = _payload.toAddress(13); // drop the first 12 bytes of bytes32 amountSD = _payload.toUint64(33); } function _encodeSendAndCallPayload( address _from, bytes32 _toAddress, uint64 _amountSD, bytes memory _payload, uint64 _dstGasForCall ) internal view virtual returns (bytes memory) { return abi.encodePacked(PT_SEND_AND_CALL, _toAddress, _amountSD, _addressToBytes32(_from), _dstGasForCall, _payload); } function _decodeSendAndCallPayload(bytes memory _payload) internal view virtual returns ( bytes32 from, address to, uint64 amountSD, bytes memory payload, uint64 dstGasForCall ) { require(_payload.toUint8(0) == PT_SEND_AND_CALL, "REBASECore: invalid payload"); to = _payload.toAddress(13); // drop the first 12 bytes of bytes32 amountSD = _payload.toUint64(33); from = _payload.toBytes32(41); dstGasForCall = _payload.toUint64(73); payload = _payload.slice(81, _payload.length - 81); } function _addressToBytes32(address _address) internal pure virtual returns (bytes32) { return bytes32(uint(uint160(_address))); } function _debitFrom( address _from, uint16 _dstChainId, bytes32 _toAddress, uint _amount ) internal virtual returns (uint); function _creditTo( uint16 _srcChainId, address _toAddress, uint _amount ) internal virtual returns (uint); function _transferFrom( address _from, address _to, uint _amount ) internal virtual returns (uint); function _ld2sdRate() internal view virtual returns (uint); } // File: contracts/Ether95/token/REBASE/v2/BaseREBASEV2.sol pragma solidity ^0.8.0; abstract contract BaseREBASEV2 is REBASECoreV2, ERC165, IREBASEV2 { constructor(uint8 _sharedDecimals, address _lzEndpoint) REBASECoreV2(_sharedDecimals, _lzEndpoint) {} /************************************************************************ * public functions ************************************************************************/ function sendFrom( address _from, uint16 _dstChainId, bytes32 _toAddress, uint _amount, LzCallParams calldata _callParams ) public payable virtual override { _send(_from, _dstChainId, _toAddress, _amount, _callParams.refundAddress, _callParams.zroPaymentAddress, _callParams.adapterParams); } function sendAndCall( address _from, uint16 _dstChainId, bytes32 _toAddress, uint _amount, bytes calldata _payload, uint64 _dstGasForCall, LzCallParams calldata _callParams ) public payable virtual override { _sendAndCall( _from, _dstChainId, _toAddress, _amount, _payload, _dstGasForCall, _callParams.refundAddress, _callParams.zroPaymentAddress, _callParams.adapterParams ); } /************************************************************************ * public view functions ************************************************************************/ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IREBASEV2).interfaceId || super.supportsInterface(interfaceId); } function estimateSendFee( uint16 _dstChainId, bytes32 _toAddress, uint _amount, bool _useZro, bytes calldata _adapterParams ) public view virtual override returns (uint nativeFee, uint zroFee) { return _estimateSendFee(_dstChainId, _toAddress, _amount, _useZro, _adapterParams); } function estimateSendAndCallFee( uint16 _dstChainId, bytes32 _toAddress, uint _amount, bytes calldata _payload, uint64 _dstGasForCall, bool _useZro, bytes calldata _adapterParams ) public view virtual override returns (uint nativeFee, uint zroFee) { return _estimateSendAndCallFee(_dstChainId, _toAddress, _amount, _payload, _dstGasForCall, _useZro, _adapterParams); } function circulatingSupply() public view virtual override returns (uint); function token() public view virtual override returns (address); } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * The default value of {decimals} is 18. To change this, you should override * this function so it returns a different value. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the default value returned by this function, unless * it's overridden. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer(address from, address to, uint256 amount) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance(address owner, address spender, uint256 amount) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {} } // File: contracts/Ether95/token/REBASE/v2/REBASEV2.sol pragma solidity ^0.8.0; contract REBASEV2 is BaseREBASEV2, ERC20 { uint internal immutable ld2sdRate; constructor( string memory _name, string memory _symbol, uint8 _sharedDecimals, address _lzEndpoint ) ERC20(_name, _symbol) BaseREBASEV2(_sharedDecimals, _lzEndpoint) { uint8 decimals = decimals(); require(_sharedDecimals <= decimals, "REBASE: sharedDecimals must be <= decimals"); ld2sdRate = 10**(decimals - _sharedDecimals); } /************************************************************************ * public functions ************************************************************************/ function circulatingSupply() public view virtual override returns (uint) { return totalSupply(); } function token() public view virtual override returns (address) { return address(this); } /************************************************************************ * internal functions ************************************************************************/ function _debitFrom( address _from, uint16, bytes32, uint _amount ) internal virtual override returns (uint) { address spender = _msgSender(); if (_from != spender) _spendAllowance(_from, spender, _amount); _burn(_from, _amount); return _amount; } function _creditTo( uint16, address _toAddress, uint _amount ) internal virtual override returns (uint) { _mint(_toAddress, _amount); return _amount; } function _transferFrom( address _from, address _to, uint _amount ) internal virtual override returns (uint) { address spender = _msgSender(); // if transfer from this contract, no need to check allowance if (_from != address(this) && _from != spender) _spendAllowance(_from, spender, _amount); _transfer(_from, _to, _amount); return _amount; } function _ld2sdRate() internal view virtual override returns (uint) { return ld2sdRate; } } pragma solidity ^0.8.19; contract E95 is REBASEV2 { IUniswapV2Router02 immutable uniswapV2Router; uint256 maxTxAmount; uint256 public buyfee = 5; uint256 public sellfee = 5; uint256 minAmountToSwapTaxes; uint256 maxWalletAmount; uint256 launchedAt; uint256 public buys; uint256 buysBeforeSells = 25; bool launchTax; bool taxesEnabled = true; bool limitsEnabled = true; bool inSwapAndLiq; bool public tradingAllowed; address public taxWallet; address public immutable uniswapV2Pair; mapping(address => bool) public _isExcludedFromFees; modifier lockTheSwap() { inSwapAndLiq = true; _; inSwapAndLiq = false; } constructor() REBASEV2( "Ethereum 95", "E95", 8, 0x65058ccc25a49c3f0F186afBb6f95319B34d3d50 ) { _mint(owner(), 100_000 * 10 ** 18); IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02( 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D ); address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()) .createPair(address(this), _uniswapV2Router.WETH()); uniswapV2Router = _uniswapV2Router; uniswapV2Pair = _uniswapV2Pair; minAmountToSwapTaxes = (totalSupply() * 3) / 1000; maxWalletAmount = (totalSupply() * 2) / 100; maxTxAmount = totalSupply() / 200; _isExcludedFromFees[owner()] = true; _isExcludedFromFees[msg.sender] = true; _isExcludedFromFees[taxWallet] = true; _isExcludedFromFees[address(this)] = true; _isExcludedFromFees[address(_uniswapV2Pair)] = true; taxWallet = 0x65058ccc25a49c3f0F186afBb6f95319B34d3d50; } function _transfer( address from, address to, uint256 amount ) internal override { require(amount > 0, "ERC20: transfer must be greater than 0"); if (!tradingAllowed) { require(from == owner() || to == owner(), "Trading not active yet"); } uint256 taxAmount; if (launchTax) { setTaxes(block.number); } if (from == uniswapV2Pair && !_isExcludedFromFees[to]) { require( balanceOf(to) + amount <= maxWalletAmount, "Max Wallet In Effect" ); require(amount <= maxTxAmount, "Max Tx in effect"); if (taxesEnabled) { taxAmount = (amount * buyfee) / 100; } buys++; } if (to == uniswapV2Pair && !_isExcludedFromFees[from]) { require(amount <= maxTxAmount, "Max Tx in effect"); if (taxesEnabled) { taxAmount = (amount * sellfee) / 100; } } uint256 contractTokenBalance = balanceOf(address(this)); bool overMinTokenBalance = contractTokenBalance >= minAmountToSwapTaxes; if ( overMinTokenBalance && !inSwapAndLiq && from != uniswapV2Pair && !_isExcludedFromFees[from] && buys > buysBeforeSells ) { swapAndSend(minAmountToSwapTaxes); } if (taxAmount > 0) { uint256 userAmount = amount - taxAmount; super._transfer(from, address(this), taxAmount); super._transfer(from, to, userAmount); } else { super._transfer(from, to, amount); } } function swapAndSend(uint256 _contractTokenBalance) internal lockTheSwap { // generate the uniswap pair path of token -> weth address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); _approve( address(this), address(uniswapV2Router), _contractTokenBalance ); // make the swap uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( _contractTokenBalance, 0, // accept any amount of ETH path, taxWallet, block.timestamp ); } function setTaxes(uint256 _block) public { if (launchedAt == _block) { buyfee = 25; sellfee = 25; } else if (launchedAt + 1 >= _block) { buyfee = 25; sellfee = 25; } else if (launchedAt + 5 >= _block) { buyfee = 15; sellfee = 15; } else if (launchedAt + 11 >= _block) { buyfee = 15; sellfee = 15; } else if (launchedAt + 24 >= _block) { buyfee = 10; sellfee = 10; } } function changetaxWallet(address _newtaxWallet) external onlyOwner { taxWallet = _newtaxWallet; } function removeLaunchTax( uint256 _newbuyfeePercent, uint256 _newsellfeePercent ) external onlyOwner { require( _newbuyfeePercent <= 10 && _newsellfeePercent <= 10, "Cannot set taxes above 10" ); buyfee = _newbuyfeePercent; sellfee = _newsellfeePercent; launchTax = false; } function excludeFromFees( address _address, bool _isExcluded ) external onlyOwner { _isExcludedFromFees[_address] = _isExcluded; } function updateMaxWalletAmount( uint256 newMaxWalletAmount ) external onlyOwner { maxWalletAmount = newMaxWalletAmount; } function updateMaxTxAmount(uint256 _newAmount) external onlyOwner { maxTxAmount = _newAmount; } function changeMinAmountToSwapTaxes( uint256 newMinAmount ) external onlyOwner { require(newMinAmount > 0, "Cannot set to zero"); minAmountToSwapTaxes = newMinAmount; } function enableTaxes(bool _enable) external onlyOwner { taxesEnabled = _enable; } function start() external onlyOwner { require(!tradingAllowed, "Trading not paused"); tradingAllowed = true; launchedAt = block.number; launchTax = true; } function toggleLimits(bool _limitsEnabed) external onlyOwner { limitsEnabled = _limitsEnabed; } function manualSwap(uint256 _amount) external onlyOwner { swapAndSend(_amount); } } interface IUniswapV2Factory { event PairCreated( address indexed token0, address indexed token1, address pair, uint ); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair( address tokenA, address tokenB ) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair( address tokenA, address tokenB ) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance( address owner, address spender ) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom( address from, address to, uint value ) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit( address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s ) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn( address indexed sender, uint amount0, uint amount1, address indexed to ); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap( uint amount0Out, uint amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable returns (uint[] memory amounts); function swapTokensForExactETH( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactTokensForETH( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapETHForExactTokens( uint amountOut, address[] calldata path, address to, uint deadline ) external payable returns (uint[] memory amounts); function quote( uint amountA, uint reserveA, uint reserveB ) external pure returns (uint amountB); function getAmountOut( uint amountIn, uint reserveIn, uint reserveOut ) external pure returns (uint amountOut); function getAmountIn( uint amountOut, uint reserveIn, uint reserveOut ) external pure returns (uint amountIn); function getAmountsOut( uint amountIn, address[] calldata path ) external view returns (uint[] memory amounts); function getAmountsIn( uint amountOut, address[] calldata path ) external view returns (uint[] memory amounts); } interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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":true,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"_hash","type":"bytes32"}],"name":"CallREBASEReceivedSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"_reason","type":"bytes"}],"name":"MessageFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"}],"name":"NonContractAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"ReceiveFromChain","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"_payloadHash","type":"bytes32"}],"name":"RetryMessageSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"bytes32","name":"_toAddress","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"SendToChain","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"_type","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"_minDstGas","type":"uint256"}],"name":"SetMinDstGas","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"precrime","type":"address"}],"name":"SetPrecrime","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_path","type":"bytes"}],"name":"SetTrustedRemote","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_remoteAddress","type":"bytes"}],"name":"SetTrustedRemoteAddress","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"},{"inputs":[],"name":"DEFAULT_PAYLOAD_SIZE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"Ether95eReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"NO_EXTRA_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PT_SEND","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PT_SEND_AND_CALL","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"buyfee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buys","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes32","name":"_from","type":"bytes32"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_payload","type":"bytes"},{"internalType":"uint256","name":"_gasForCall","type":"uint256"}],"name":"callOnREBASEReceived","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMinAmount","type":"uint256"}],"name":"changeMinAmountToSwapTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newtaxWallet","type":"address"}],"name":"changetaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"circulatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"creditedPackets","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"bool","name":"_enable","type":"bool"}],"name":"enableTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes32","name":"_toAddress","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_payload","type":"bytes"},{"internalType":"uint64","name":"_dstGasForCall","type":"uint64"},{"internalType":"bool","name":"_useZro","type":"bool"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"estimateSendAndCallFee","outputs":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"zroFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes32","name":"_toAddress","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_useZro","type":"bool"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"estimateSendFee","outputs":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"zroFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_isExcluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"failedMessages","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"forceResumeReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"_configType","type":"uint256"}],"name":"getConfig","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"}],"name":"getTrustedRemoteAddress","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","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":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"isTrustedRemote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lzEndpoint","outputs":[{"internalType":"contract IEther95Endpoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"manualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"}],"name":"minDstGasLookup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"nonblockingEther95eReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"payloadSizeLimitLookup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"precrime","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newbuyfeePercent","type":"uint256"},{"internalType":"uint256","name":"_newsellfeePercent","type":"uint256"}],"name":"removeLaunchTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"retryMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"sellfee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes32","name":"_toAddress","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_payload","type":"bytes"},{"internalType":"uint64","name":"_dstGasForCall","type":"uint64"},{"components":[{"internalType":"address payable","name":"refundAddress","type":"address"},{"internalType":"address","name":"zroPaymentAddress","type":"address"},{"internalType":"bytes","name":"adapterParams","type":"bytes"}],"internalType":"struct ICommonREBASE.LzCallParams","name":"_callParams","type":"tuple"}],"name":"sendAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes32","name":"_toAddress","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"components":[{"internalType":"address payable","name":"refundAddress","type":"address"},{"internalType":"address","name":"zroPaymentAddress","type":"address"},{"internalType":"bytes","name":"adapterParams","type":"bytes"}],"internalType":"struct ICommonREBASE.LzCallParams","name":"_callParams","type":"tuple"}],"name":"sendFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"_configType","type":"uint256"},{"internalType":"bytes","name":"_config","type":"bytes"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint16","name":"_packetType","type":"uint16"},{"internalType":"uint256","name":"_minGas","type":"uint256"}],"name":"setMinDstGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint256","name":"_size","type":"uint256"}],"name":"setPayloadSizeLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_precrime","type":"address"}],"name":"setPrecrime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setReceiveVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setSendVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_block","type":"uint256"}],"name":"setTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"internalType":"bytes","name":"_path","type":"bytes"}],"name":"setTrustedRemote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"internalType":"bytes","name":"_remoteAddress","type":"bytes"}],"name":"setTrustedRemoteAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sharedDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"start","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_limitsEnabed","type":"bool"}],"name":"toggleLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"trustedRemoteLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newAmount","type":"uint256"}],"name":"updateMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxWalletAmount","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101206040526005600d819055600e5560196013556014805462ffff00191662010100179055348015610030575f5ffd5b506040518060400160405280600b81526020016a457468657265756d20393560a81b8152506040518060400160405280600381526020016245393560e81b81525060087365058ccc25a49c3f0f186afbb6f95319b34d3d5083838383818180806100a66100a161042660201b60201c565b61042a565b6001600160a01b0316608052505060ff1660a05250600a90506100c983826105e7565b50600b6100d682826105e7565b5050505f6100e861047960201b60201c565b90508060ff168360ff1611156101585760405162461bcd60e51b815260206004820152602a60248201527f5245424153453a20736861726564446563696d616c73206d757374206265203c6044820152693d20646563696d616c7360b01b60648201526084015b60405180910390fd5b61016283826106b5565b61016d90600a6107b7565b60c05250610193935061018392505061047e9050565b69152d02c7e14af680000061048c565b5f737a250d5630b4cf539739df2c5dacb4c659f2488d90505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101e8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061020c91906107cc565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610257573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061027b91906107cc565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af11580156102c5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102e991906107cc565b6001600160a01b0380841660e05281166101005290506103e861030b60095490565b6103169060036107f2565b6103209190610809565b600f55606461032e60095490565b6103399060026107f2565b6103439190610809565b60105560c861035160095490565b61035b9190610809565b600c55600160155f6103745f546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182015f908120805495151560ff1996871617905533815260159093528183208054851660019081179091556014805465010000000000900483168552838520805487168317905530855283852080548716831790559590911683529120805490921617905580547865058ccc25a49c3f0f186afbb6f95319b34d3d500000000000600160281b600160c81b03199091161790555061083b565b3390565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b601290565b5f546001600160a01b031690565b6001600160a01b0382166104e25760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161014f565b8060095f8282546104f39190610828565b90915550506001600160a01b0382165f818152600760209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061057857607f821691505b60208210810361059657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561054b57805f5260205f20601f840160051c810160208510156105c15750805b601f840160051c820191505b818110156105e0575f81556001016105cd565b5050505050565b81516001600160401b0381111561060057610600610550565b6106148161060e8454610564565b8461059c565b6020601f821160018114610646575f831561062f5750848201515b5f19600385901b1c1916600184901b1784556105e0565b5f84815260208120601f198516915b828110156106755787850151825560209485019460019092019101610655565b508482101561069257868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b60ff82811682821603908111156106ce576106ce6106a1565b92915050565b6001815b600184111561070f578085048111156106f3576106f36106a1565b600184161561070157908102905b60019390931c9280026106d8565b935093915050565b5f82610725575060016106ce565b8161073157505f6106ce565b816001811461074757600281146107515761076d565b60019150506106ce565b60ff841115610762576107626106a1565b50506001821b6106ce565b5060208310610133831016604e8410600b8410161715610790575081810a6106ce565b61079c5f1984846106d4565b805f19048211156107af576107af6106a1565b029392505050565b5f6107c560ff841683610717565b9392505050565b5f602082840312156107dc575f5ffd5b81516001600160a01b03811681146107c5575f5ffd5b80820281158282048414176106ce576106ce6106a1565b5f8261082357634e487b7160e01b5f52601260045260245ffd5b500490565b808201808211156106ce576106ce6106a1565b60805160a05160c05160e05161010051614df46108e85f395f818161067c015281816123c50152818161251b015261261f01525f8181612ce901528181612da00152612ddf01525f818161309c0152818161331c0152613b0001525f61081a01525f8181610a2e01528181610d6501528181610e1e0152818161104c0152818161116601528181611af3015281816120610152818161273601528181612bf501526134b00152614df45ff3fe6080604052600436106103d4575f3560e01c80638da5cb5b116101ff578063be9a655511610113578063df2a5b3b116100a8578063e9451f5f11610078578063e9451f5f14610bfa578063eb8d72b714610c0f578063f2fde38b14610c2e578063f5ecbdbc14610c4d578063fc0c546a14610c6c575f5ffd5b8063df2a5b3b14610b7a578063df47e37314610b99578063e0bf7fd114610bb8578063e6a20ae614610be6575f5ffd5b8063cbed8b9c116100e3578063cbed8b9c14610b0a578063d1deba1f14610b29578063d494bc9b14610b3c578063dd62ed3e14610b5b575f5ffd5b8063be9a655514610aa3578063c024666814610ab7578063c18bc19514610ad6578063c446183414610af5575f5ffd5b8063a4c51df511610194578063b256f7b711610164578063b256f7b7146109fe578063b353aaa714610a1d578063b70143c914610a50578063baf3292d14610a6f578063bccb468714610a8e575f5ffd5b8063a4c51df514610982578063a6c3d165146109a1578063a6fb5dfd146109c0578063a9059cbb146109df575f5ffd5b80639a2095a5116101cf5780639a2095a5146108d55780639bdb9812146108f45780639f38369a14610944578063a457c2d714610963575f5ffd5b80638da5cb5b146108725780639358928b1461088e578063950c8a74146108a257806395d89b41146108c1575f5ffd5b80633f1f4fa4116102f65780636256d1811161028b578063715018a61161025b578063715018a6146107c35780637533d788146107d757806376203b48146107f6578063857749b0146108095780638cfd8f5c1461083c575f5ffd5b80636256d1811461073e57806368e858cb1461075d578063695ef6bf1461077c57806370a082311461078f575f5ffd5b80634c42899a116102c65780634c42899a1461069e5780634ebc552d146106b157806353371be0146106d05780635b8c41e6146106f1575f5ffd5b80633f1f4fa41461060e57806342d65a8d14610639578063447705151461065857806349bd5a5e1461066b575f5ffd5b806323b872dd1161036c578063365260b41161033c578063365260b41461057d57806339509351146105b15780633d5369f6146105d05780633d8b38f6146105ef575f5ffd5b806323b872dd146104de5780632dc0562d146104fd578063302757441461053d578063313ce5671461055c575f5ffd5b80630df37483116103a75780630df374831461046d57806310ddb1371461048c57806318160ddd146104ab5780631dc36945146104c9575f5ffd5b806301ffc9a7146103d857806306fdde031461040c57806307e0db171461042d578063095ea7b31461044e575b5f5ffd5b3480156103e3575f5ffd5b506103f76103f2366004613dd7565b610c7e565b60405190151581526020015b60405180910390f35b348015610417575f5ffd5b50610420610cb4565b6040516104039190613e2c565b348015610438575f5ffd5b5061044c610447366004613e54565b610d44565b005b348015610459575f5ffd5b506103f7610468366004613e81565b610dc8565b348015610478575f5ffd5b5061044c610487366004613eab565b610ddf565b348015610497575f5ffd5b5061044c6104a6366004613e54565b610dfd565b3480156104b6575f5ffd5b506009545b604051908152602001610403565b3480156104d4575f5ffd5b506104bb600d5481565b3480156104e9575f5ffd5b506103f76104f8366004613ec5565b610e55565b348015610508575f5ffd5b50601454610525906501000000000090046001600160a01b031681565b6040516001600160a01b039091168152602001610403565b348015610548575f5ffd5b5061044c610557366004613f12565b610e78565b348015610567575f5ffd5b5060125b60405160ff9091168152602001610403565b348015610588575f5ffd5b5061059c610597366004613f6f565b610e9a565b60408051928352602083019190915201610403565b3480156105bc575f5ffd5b506103f76105cb366004613e81565b610eed565b3480156105db575f5ffd5b5061044c6105ea366004613fe1565b610f0e565b3480156105fa575f5ffd5b506103f7610609366004613ff8565b610f64565b348015610619575f5ffd5b506104bb610628366004613e54565b60036020525f908152604090205481565b348015610644575f5ffd5b5061044c610653366004613ff8565b61102d565b348015610663575f5ffd5b506104bb5f81565b348015610676575f5ffd5b506105257f000000000000000000000000000000000000000000000000000000000000000081565b3480156106a9575f5ffd5b5061056b5f81565b3480156106bc575f5ffd5b5061044c6106cb366004613fe1565b6110b7565b3480156106db575f5ffd5b506014546103f790640100000000900460ff1681565b3480156106fc575f5ffd5b506104bb61070b3660046140c6565b600560209081525f9384526040808520845180860184018051928152908401958401959095209452929052825290205481565b348015610749575f5ffd5b5061044c610758366004613fe1565b611156565b348015610768575f5ffd5b5061044c61077736600461415f565b611163565b61044c61078a3660046141e6565b611392565b34801561079a575f5ffd5b506104bb6107a9366004614254565b6001600160a01b03165f9081526007602052604090205490565b3480156107ce575f5ffd5b5061044c611404565b3480156107e2575f5ffd5b506104206107f1366004613e54565b611417565b61044c61080436600461426f565b6114ae565b348015610814575f5ffd5b5061056b7f000000000000000000000000000000000000000000000000000000000000000081565b348015610847575f5ffd5b506104bb61085636600461431c565b600260209081525f928352604080842090915290825290205481565b34801561087d575f5ffd5b505f546001600160a01b0316610525565b348015610899575f5ffd5b506104bb61155b565b3480156108ad575f5ffd5b50600454610525906001600160a01b031681565b3480156108cc575f5ffd5b5061042061156a565b3480156108e0575f5ffd5b5061044c6108ef36600461434d565b611579565b3480156108ff575f5ffd5b506103f761090e3660046140c6565b600660209081525f9384526040808520845180860184018051928152908401958401959095209452929052825290205460ff1681565b34801561094f575f5ffd5b5061042061095e366004613e54565b6116a1565b34801561096e575f5ffd5b506103f761097d366004613e81565b6117be565b34801561098d575f5ffd5b5061059c61099c36600461440d565b611838565b3480156109ac575f5ffd5b5061044c6109bb366004613ff8565b6118c4565b3480156109cb575f5ffd5b5061044c6109da366004614254565b61194c565b3480156109ea575f5ffd5b506103f76109f9366004613e81565b611984565b348015610a09575f5ffd5b5061044c610a18366004613f12565b611991565b348015610a28575f5ffd5b506105257f000000000000000000000000000000000000000000000000000000000000000081565b348015610a5b575f5ffd5b5061044c610a6a366004613fe1565b6119b5565b348015610a7a575f5ffd5b5061044c610a89366004614254565b6119c6565b348015610a99575f5ffd5b506104bb60125481565b348015610aae575f5ffd5b5061044c611a22565b348015610ac2575f5ffd5b5061044c610ad13660046144c0565b611a95565b348015610ae1575f5ffd5b5061044c610af0366004613fe1565b611ac7565b348015610b00575f5ffd5b506104bb61271081565b348015610b15575f5ffd5b5061044c610b243660046144ea565b611ad4565b61044c610b3736600461415f565b611b59565b348015610b47575f5ffd5b5061044c610b5636600461415f565b611d75565b348015610b66575f5ffd5b506104bb610b75366004614553565b611e53565b348015610b85575f5ffd5b5061044c610b9436600461458a565b611e7d565b348015610ba4575f5ffd5b5061044c610bb33660046145b3565b611ee6565b348015610bc3575f5ffd5b506103f7610bd2366004614254565b60156020525f908152604090205460ff1681565b348015610bf1575f5ffd5b5061056b600181565b348015610c05575f5ffd5b506104bb600e5481565b348015610c1a575f5ffd5b5061044c610c29366004613ff8565b611f61565b348015610c39575f5ffd5b5061044c610c48366004614254565b611fba565b348015610c58575f5ffd5b50610420610c673660046145d3565b612030565b348015610c77575f5ffd5b5030610525565b5f6001600160e01b03198216631f7ecdf760e01b1480610cae57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600a8054610cc39061461d565b80601f0160208091040260200160405190810160405280929190818152602001828054610cef9061461d565b8015610d3a5780601f10610d1157610100808354040283529160200191610d3a565b820191905f5260205f20905b815481529060010190602001808311610d1d57829003601f168201915b5050505050905090565b610d4c6120dd565b6040516307e0db1760e01b815261ffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906307e0db17906024015b5f604051808303815f87803b158015610daf575f5ffd5b505af1158015610dc1573d5f5f3e3d5ffd5b5050505050565b5f33610dd5818585612136565b5060019392505050565b610de76120dd565b61ffff9091165f90815260036020526040902055565b610e056120dd565b6040516310ddb13760e01b815261ffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906310ddb13790602401610d98565b5f33610e62858285612259565b610e6d8585856122d1565b506001949350505050565b610e806120dd565b601480549115156101000261ff0019909216919091179055565b5f5f610ede8888888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506126d192505050565b91509150965096945050505050565b5f33610dd5818585610eff8383611e53565b610f099190614663565b612136565b610f166120dd565b5f8111610f5f5760405162461bcd60e51b815260206004820152601260248201527143616e6e6f742073657420746f207a65726f60701b60448201526064015b60405180910390fd5b600f55565b61ffff83165f9081526001602052604081208054829190610f849061461d565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb09061461d565b8015610ffb5780601f10610fd257610100808354040283529160200191610ffb565b820191905f5260205f20905b815481529060010190602001808311610fde57829003601f168201915b505050505090508383604051611012929190614676565b60405180910390208180519060200120149150509392505050565b6110356120dd565b6040516342d65a8d60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906342d65a8d90611085908690869086906004016146ad565b5f604051808303815f87803b15801561109c575f5ffd5b505af11580156110ae573d5f5f3e3d5ffd5b50505050505050565b80601154036110cd576019600d819055600e5550565b8060115460016110dd9190614663565b106110ef576019600d819055600e5550565b8060115460056110ff9190614663565b1061111157600f600d819055600e5550565b80601154600b6111219190614663565b1061113357600f600d819055600e5550565b8060115460186111439190614663565b1061115357600a600d819055600e555b50565b61115e6120dd565b600c55565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146111e75760405162461bcd60e51b8152602060048201526024808201527f45746865723935654170703a20696e76616c696420656e64706f696e74206361604482015263363632b960e11b6064820152608401610f56565b61ffff86165f90815260016020526040812080546112049061461d565b80601f01602080910402602001604051908101604052809291908181526020018280546112309061461d565b801561127b5780601f106112525761010080835404028352916020019161127b565b820191905f5260205f20905b81548152906001019060200180831161125e57829003601f168201915b5050505050905080518686905014801561129557505f8151115b80156112bd5750805160208201206040516112b39088908890614676565b6040518091039020145b61131e5760405162461bcd60e51b815260206004820152602c60248201527f45746865723935654170703a20696e76616c696420736f757263652073656e6460448201526b1a5b99c818dbdb9d1c9858dd60a21b6064820152608401610f56565b6110ae8787878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050604080516020601f8a018190048102820181019092528881528a9350915088908890819084018382808284375f920191909152506127c092505050565b6113fc858585856113a66020870187614254565b6113b66040880160208901614254565b6113c360408901896146ca565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061283892505050565b505050505050565b61140c6120dd565b6114155f612921565b565b60016020525f90815260409020805461142f9061461d565b80601f016020809104026020016040519081016040528092919081815260200182805461145b9061461d565b80156114a65780601f1061147d576101008083540402835291602001916114a6565b820191905f5260205f20905b81548152906001019060200180831161148957829003601f168201915b505050505081565b6115508888888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508a92506114fa9150506020890189614254565b61150a60408a0160208b01614254565b61151760408b018b6146ca565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061297092505050565b505050505050505050565b5f61156560095490565b905090565b6060600b8054610cc39061461d565b3330146115d65760405162461bcd60e51b815260206004820152602560248201527f524542415345436f72653a2063616c6c6572206d75737420626520524542415360448201526445436f726560d81b6064820152608401610f56565b6115e1308686612a6d565b9350846001600160a01b03168a61ffff167fbf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bf8660405161162391815260200190565b60405180910390a3604051631d9f3d3160e11b81526001600160a01b03861690633b3e7a62908390611667908e908e908e908e908e908d908d908d9060040161470c565b5f604051808303815f88803b15801561167e575f5ffd5b5087f1158015611690573d5f5f3e3d5ffd5b505050505050505050505050505050565b61ffff81165f908152600160205260408120805460609291906116c39061461d565b80601f01602080910402602001604051908101604052809291908181526020018280546116ef9061461d565b801561173a5780601f106117115761010080835404028352916020019161173a565b820191905f5260205f20905b81548152906001019060200180831161171d57829003601f168201915b5050505050905080515f0361179d5760405162461bcd60e51b815260206004820152602360248201527f45746865723935654170703a206e6f20747275737465642070617468207265636044820152621bdc9960ea1b6064820152608401610f56565b6117b75f601483516117af9190614766565b839190612abe565b9392505050565b5f33816117cb8286611e53565b90508381101561182b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610f56565b610e6d8286868403612136565b5f5f6118b28b8b8b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050604080516020601f8d018190048102820181019092528b81528e93508d9250908c908c90819084018382808284375f92019190915250612bca92505050565b91509150995099975050505050505050565b6118cc6120dd565b8181306040516020016118e193929190614779565b60408051601f1981840301815291815261ffff85165f9081526001602052209061190b90826147e3565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce83838360405161193f939291906146ad565b60405180910390a1505050565b6119546120dd565b601480546001600160a01b03909216650100000000000265010000000000600160c81b0319909216919091179055565b5f33610dd58185856122d1565b6119996120dd565b60148054911515620100000262ff000019909216919091179055565b6119bd6120dd565b61115381612c81565b6119ce6120dd565b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b9060200160405180910390a150565b611a2a6120dd565b601454640100000000900460ff1615611a7a5760405162461bcd60e51b8152602060048201526012602482015271151c98591a5b99c81b9bdd081c185d5cd95960721b6044820152606401610f56565b601480544360115564ff000000ff1916640100000001179055565b611a9d6120dd565b6001600160a01b03919091165f908152601560205260409020805460ff1916911515919091179055565b611acf6120dd565b601055565b611adc6120dd565b6040516332fb62e760e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063cbed8b9c90611b30908890889088908890889060040161489d565b5f604051808303815f87803b158015611b47575f5ffd5b505af1158015611550573d5f5f3e3d5ffd5b61ffff86165f908152600560205260408082209051611b7b9088908890614676565b90815260408051602092819003830190206001600160401b0387165f9081529252902054905080611c005760405162461bcd60e51b815260206004820152602960248201527f4e6f6e626c6f636b696e6745746865723935654170703a206e6f2073746f726560448201526864206d65737361676560b81b6064820152608401610f56565b808383604051611c11929190614676565b604051809103902014611c765760405162461bcd60e51b815260206004820152602760248201527f4e6f6e626c6f636b696e6745746865723935654170703a20696e76616c6964206044820152661c185e5b1bd85960ca1b6064820152608401610f56565b61ffff87165f908152600560205260408082209051611c989089908990614676565b90815260408051602092819003830181206001600160401b0389165f90815290845282902093909355601f88018290048202830182019052868252611d2d91899189908990819084018382808284375f9201919091525050604080516020601f8a018190048102820181019092528881528a9350915088908890819084018382808284375f92019190915250612e6792505050565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e58787878785604051611d649594939291906148d5565b60405180910390a150505050505050565b333014611ddf5760405162461bcd60e51b815260206004820152603260248201527f4e6f6e626c6f636b696e6745746865723935654170703a2063616c6c6572206d60448201527107573742062652045746865723935654170760741b6064820152608401610f56565b6113fc8686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050604080516020601f8901819004810282018101909252878152899350915087908790819084018382808284375f92019190915250612e6792505050565b6001600160a01b039182165f90815260086020908152604080832093909416825291909152205490565b611e856120dd565b61ffff8381165f8181526002602090815260408083209487168084529482529182902085905581519283528201929092529081018290527f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac09060600161193f565b611eee6120dd565b600a8211158015611f005750600a8111155b611f4c5760405162461bcd60e51b815260206004820152601960248201527f43616e6e6f74207365742074617865732061626f7665203130000000000000006044820152606401610f56565b600d91909155600e556014805460ff19169055565b611f696120dd565b61ffff83165f908152600160205260409020611f8682848361490f565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab83838360405161193f939291906146ad565b611fc26120dd565b6001600160a01b0381166120275760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610f56565b61115381612921565b604051633d7b2f6f60e21b815261ffff808616600483015284166024820152306044820152606481018290526060907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f5ecbdbc906084015f60405180830381865afa1580156120ad573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120d491908101906149c8565b95945050505050565b5f546001600160a01b031633146114155760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610f56565b6001600160a01b0383166121985760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610f56565b6001600160a01b0382166121f95760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610f56565b6001600160a01b038381165f8181526008602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f6122648484611e53565b90505f1981146122cb57818110156122be5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610f56565b6122cb8484848403612136565b50505050565b5f811161232f5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e73666572206d75737420626520677265617465722060448201526507468616e20360d41b6064820152608401610f56565b601454640100000000900460ff166123ad575f546001600160a01b038481169116148061236857505f546001600160a01b038381169116145b6123ad5760405162461bcd60e51b8152602060048201526016602482015275151c98591a5b99c81b9bdd081858dd1a5d99481e595d60521b6044820152606401610f56565b6014545f9060ff16156123c3576123c3436110b7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b031614801561241c57506001600160a01b0383165f9081526015602052604090205460ff16155b156125195760105482612443856001600160a01b03165f9081526007602052604090205490565b61244d9190614663565b11156124925760405162461bcd60e51b815260206004820152601460248201527313585e0815d85b1b195d08125b881159999958dd60621b6044820152606401610f56565b600c548211156124d75760405162461bcd60e51b815260206004820152601060248201526f13585e08151e081a5b881959999958dd60821b6044820152606401610f56565b601454610100900460ff1615612504576064600d54836124f79190614a3c565b6125019190614a67565b90505b60128054905f61251383614a7a565b91905055505b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614801561257257506001600160a01b0384165f9081526015602052604090205460ff16155b156125e957600c548211156125bc5760405162461bcd60e51b815260206004820152601060248201526f13585e08151e081a5b881959999958dd60821b6044820152606401610f56565b601454610100900460ff16156125e9576064600e54836125dc9190614a3c565b6125e69190614a67565b90505b305f90815260076020526040902054600f548110801590819061261657506014546301000000900460ff16155b801561265457507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031614155b801561267857506001600160a01b0386165f9081526015602052604090205460ff16155b80156126875750601354601254115b1561269757612697600f54612c81565b82156126c6575f6126a88486614766565b90506126b5873086612eec565b6126c0878783612eec565b506113fc565b6113fc868686612eec565b5f5f5f61271c876126e188613095565b604080515f6020820152602181019390935260c09190911b6001600160c01b0319166041830152805160298184030181526049909201905290565b60405163040a7bb160e41b81529091506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906340a7bb1090612773908b90309086908b908b90600401614a92565b6040805180830381865afa15801561278d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127b19190614ae5565b92509250509550959350505050565b5f5f6128225a609663d494bc9b60e01b898989896040516024016127e79493929190614b07565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091523092919061311a565b91509150816113fc576113fc868686868561319e565b5f61284587828481613238565b61284e85613315565b50905061285d88888884613354565b90505f81116128ae5760405162461bcd60e51b815260206004820152601c60248201527f524542415345436f72653a20616d6f756e7420746f6f20736d616c6c000000006044820152606401610f56565b5f6128bc876126e184613095565b90506128cc888287878734613385565b86896001600160a01b03168961ffff167fd81fc9b8523134ed613870ed029d6170cbb73aa6a6bc311b9a642689fb9df59a8560405161290d91815260200190565b60405180910390a450979650505050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f612987896001846001600160401b038916613238565b61299087613315565b50905061299f8a8a8a84613354565b90505f81116129f05760405162461bcd60e51b815260206004820152601c60248201527f524542415345436f72653a20616d6f756e7420746f6f20736d616c6c000000006044820152606401610f56565b5f612a06338a6129ff85613095565b8a8a613528565b9050612a168a8287878734613385565b888b6001600160a01b03168b61ffff167fd81fc9b8523134ed613870ed029d6170cbb73aa6a6bc311b9a642689fb9df59a85604051612a5791815260200190565b60405180910390a4509998505050505050505050565b5f33306001600160a01b03861614801590612a9a5750806001600160a01b0316856001600160a01b031614155b15612aaa57612aaa858285612259565b612ab58585856122d1565b50909392505050565b606081612acc81601f614663565b1015612b0b5760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401610f56565b612b158284614663565b84511015612b595760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b6044820152606401610f56565b606082158015612b775760405191505f825260208201604052612bc1565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015612bb0578051835260209283019201612b98565b5050858452601f01601f1916604052505b50949350505050565b5f5f5f612bdb338a6129ff8b613095565b60405163040a7bb160e41b81529091506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906340a7bb1090612c32908d90309086908b908b90600401614a92565b6040805180830381865afa158015612c4c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c709190614ae5565b925092505097509795505050505050565b6014805463ff000000191663010000001790556040805160028082526060820183525f9260208301908036833701905050905030815f81518110612cc757612cc7614b44565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d43573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d679190614b58565b81600181518110612d7a57612d7a614b44565b60200260200101906001600160a01b031690816001600160a01b031681525050612dc5307f000000000000000000000000000000000000000000000000000000000000000084612136565b60145460405163791ac94760e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263791ac94792612e299287925f92889265010000000000909204909116904290600401614b73565b5f604051808303815f87803b158015612e40575f5ffd5b505af1158015612e52573d5f5f3e3d5ffd5b50506014805463ff0000001916905550505050565b5f612e728282613569565b905060ff8116612e8d57612e88858585856135c4565b610dc1565b5f1960ff821601612ea457612e8885858585613652565b60405162461bcd60e51b815260206004820152601f60248201527f524542415345436f72653a20756e6b6e6f776e207061636b65742074797065006044820152606401610f56565b6001600160a01b038316612f505760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610f56565b6001600160a01b038216612fb25760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610f56565b6001600160a01b0383165f90815260076020526040902054818110156130295760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610f56565b6001600160a01b038085165f8181526007602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906130889086815260200190565b60405180910390a36122cb565b5f806130c17f000000000000000000000000000000000000000000000000000000000000000084614a67565b90506001600160401b03811115610cae5760405162461bcd60e51b815260206004820152601d60248201527f524542415345436f72653a20616d6f756e745344206f766572666c6f770000006044820152606401610f56565b5f60605f5f5f8661ffff166001600160401b0381111561313c5761313c614046565b6040519080825280601f01601f191660200182016040528015613166576020820181803683370190505b5090505f5f8751602089015f8d8df191503d925086831115613186578692505b828152825f602083013e909890975095505050505050565b818051906020012060055f8761ffff1661ffff1681526020019081526020015f20856040516131cd9190614bfa565b9081526040805191829003602090810183206001600160401b0388165f908152915220919091557fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c906132299087908790879087908790614c05565b60405180910390a15050505050565b5f6132428361385a565b61ffff8087165f90815260026020908152604080832093891683529290522054909150806132b25760405162461bcd60e51b815260206004820181905260248201527f45746865723935654170703a206d696e4761734c696d6974206e6f74207365746044820152606401610f56565b6132bc8382614663565b8210156113fc5760405162461bcd60e51b815260206004820152602160248201527f45746865723935654170703a20676173206c696d697420697320746f6f206c6f6044820152607760f81b6064820152608401610f56565b5f806133417f000000000000000000000000000000000000000000000000000000000000000084614c56565b905061334d8184614766565b9150915091565b5f336001600160a01b038616811461337157613371868285612259565b61337b86846138c0565b5090949350505050565b61ffff86165f90815260016020526040812080546133a29061461d565b80601f01602080910402602001604051908101604052809291908181526020018280546133ce9061461d565b80156134195780601f106133f057610100808354040283529160200191613419565b820191905f5260205f20905b8154815290600101906020018083116133fc57829003601f168201915b5050505050905080515f0361348f5760405162461bcd60e51b815260206004820152603660248201527f45746865723935654170703a2064657374696e6174696f6e20636861696e206960448201527573206e6f742061207472757374656420736f7572636560501b6064820152608401610f56565b61349a8787516139f2565b60405162c5803160e81b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c58031009084906134f1908b9086908c908c908c908c90600401614c69565b5f604051808303818588803b158015613508575f5ffd5b505af115801561351a573d5f5f3e3d5ffd5b505050505050505050505050565b6060600185856001600160a01b038916858760405160200161354f96959493929190614ccf565b604051602081830303815290604052905095945050505050565b5f613575826001614663565b835110156135bb5760405162461bcd60e51b8152602060048201526013602482015272746f55696e74385f6f75744f66426f756e647360681b6044820152606401610f56565b50016001015190565b5f5f6135cf83613a71565b90925090506001600160a01b0382166135e85761dead91505b5f6135f282613afa565b90506135ff878483613b2e565b9050826001600160a01b03168761ffff167fbf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bf8360405161364191815260200190565b60405180910390a350505050505050565b5f5f5f5f5f61366086613b40565b945094509450945094505f60065f8b61ffff1661ffff1681526020019081526020015f20896040516136929190614bfa565b90815260408051602092819003830190206001600160401b038b165f908152925281205460ff1691506136c485613afa565b905081613730576136d68b3083613b2e565b61ffff8c165f908152600660205260409081902090519192506001916136fd908d90614bfa565b90815260408051602092819003830190206001600160401b038d165f90815292529020805460ff19169115159190911790555b6001600160a01b0386163b613787576040516001600160a01b03871681527f9aedf5fdba8716db3b6705ca00150643309995d4f818a249ed6dde6677e7792d9060200160405180910390a1505050505050506122cb565b8a8a8a8a8a8a868a5f8a6137a4578b6001600160401b03166137a6565b5a5b90505f5f6137d75a6096639a2095a560e01b8e8e8e8d8d8d8d8d6040516024016127e7989796959493929190614d1f565b915091508115613830578751602089012060405161ffff8d16907f6d76c6b2837f234f610c722403fa5f92d7d05f167f2918924b59b8e34f3a43bf90613822908e908e908690614d91565b60405180910390a25061383d565b61383d8b8b8b8b8561319e565b50505050505050505050505050505050505050505050565b505050565b5f6022825110156138b85760405162461bcd60e51b815260206004820152602260248201527f45746865723935654170703a20696e76616c69642061646170746572506172616044820152616d7360f01b6064820152608401610f56565b506022015190565b6001600160a01b0382166139205760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610f56565b6001600160a01b0382165f90815260076020526040902054818110156139935760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610f56565b6001600160a01b0383165f8181526007602090815260408083208686039055600980548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b61ffff82165f9081526003602052604081205490819003613a1257506127105b808211156138555760405162461bcd60e51b815260206004820152602660248201527f45746865723935654170703a207061796c6f61642073697a6520697320746f6f604482015265206c6172676560d01b6064820152608401610f56565b5f8080613a7e8482613569565b60ff16148015613a8f575082516029145b613adb5760405162461bcd60e51b815260206004820152601b60248201527f524542415345436f72653a20696e76616c6964207061796c6f616400000000006044820152606401610f56565b613ae683600d613bfb565b9150613af3836021613c5f565b9050915091565b5f610cae7f00000000000000000000000000000000000000000000000000000000000000006001600160401b038416614a3c565b5f613b398383613cbb565b5092915050565b5f80806060816001613b528783613569565b60ff1614613ba25760405162461bcd60e51b815260206004820152601b60248201527f524542415345436f72653a20696e76616c6964207061796c6f616400000000006044820152606401610f56565b613bad86600d613bfb565b9350613bba866021613c5f565b9250613bc7866029613d7a565b9450613bd4866049613c5f565b9050613bf06051808851613be89190614766565b889190612abe565b915091939590929450565b5f613c07826014614663565b83511015613c4f5760405162461bcd60e51b8152602060048201526015602482015274746f416464726573735f6f75744f66426f756e647360581b6044820152606401610f56565b500160200151600160601b900490565b5f613c6b826008614663565b83511015613cb25760405162461bcd60e51b8152602060048201526014602482015273746f55696e7436345f6f75744f66426f756e647360601b6044820152606401610f56565b50016008015190565b6001600160a01b038216613d115760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610f56565b8060095f828254613d229190614663565b90915550506001600160a01b0382165f818152600760209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b5f613d86826020614663565b83511015613dce5760405162461bcd60e51b8152602060048201526015602482015274746f427974657333325f6f75744f66426f756e647360581b6044820152606401610f56565b50016020015190565b5f60208284031215613de7575f5ffd5b81356001600160e01b0319811681146117b7575f5ffd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6117b76020830184613dfe565b803561ffff81168114613e4f575f5ffd5b919050565b5f60208284031215613e64575f5ffd5b6117b782613e3e565b6001600160a01b0381168114611153575f5ffd5b5f5f60408385031215613e92575f5ffd5b8235613e9d81613e6d565b946020939093013593505050565b5f5f60408385031215613ebc575f5ffd5b613e9d83613e3e565b5f5f5f60608486031215613ed7575f5ffd5b8335613ee281613e6d565b92506020840135613ef281613e6d565b929592945050506040919091013590565b80358015158114613e4f575f5ffd5b5f60208284031215613f22575f5ffd5b6117b782613f03565b5f5f83601f840112613f3b575f5ffd5b5081356001600160401b03811115613f51575f5ffd5b602083019150836020828501011115613f68575f5ffd5b9250929050565b5f5f5f5f5f5f60a08789031215613f84575f5ffd5b613f8d87613e3e565b95506020870135945060408701359350613fa960608801613f03565b925060808701356001600160401b03811115613fc3575f5ffd5b613fcf89828a01613f2b565b979a9699509497509295939492505050565b5f60208284031215613ff1575f5ffd5b5035919050565b5f5f5f6040848603121561400a575f5ffd5b61401384613e3e565b925060208401356001600160401b0381111561402d575f5ffd5b61403986828701613f2b565b9497909650939450505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561408257614082614046565b604052919050565b5f6001600160401b038211156140a2576140a2614046565b50601f01601f191660200190565b80356001600160401b0381168114613e4f575f5ffd5b5f5f5f606084860312156140d8575f5ffd5b6140e184613e3e565b925060208401356001600160401b038111156140fb575f5ffd5b8401601f8101861361410b575f5ffd5b803561411e6141198261408a565b61405a565b818152876020838501011115614132575f5ffd5b816020840160208301375f60208383010152809450505050614156604085016140b0565b90509250925092565b5f5f5f5f5f5f60808789031215614174575f5ffd5b61417d87613e3e565b955060208701356001600160401b03811115614197575f5ffd5b6141a389828a01613f2b565b90965094506141b69050604088016140b0565b925060608701356001600160401b03811115613fc3575f5ffd5b5f606082840312156141e0575f5ffd5b50919050565b5f5f5f5f5f60a086880312156141fa575f5ffd5b853561420581613e6d565b945061421360208701613e3e565b9350604086013592506060860135915060808601356001600160401b0381111561423b575f5ffd5b614247888289016141d0565b9150509295509295909350565b5f60208284031215614264575f5ffd5b81356117b781613e6d565b5f5f5f5f5f5f5f5f60e0898b031215614286575f5ffd5b883561429181613e6d565b975061429f60208a01613e3e565b9650604089013595506060890135945060808901356001600160401b038111156142c7575f5ffd5b6142d38b828c01613f2b565b90955093506142e6905060a08a016140b0565b915060c08901356001600160401b03811115614300575f5ffd5b61430c8b828c016141d0565b9150509295985092959890939650565b5f5f6040838503121561432d575f5ffd5b61433683613e3e565b915061434460208401613e3e565b90509250929050565b5f5f5f5f5f5f5f5f5f5f6101008b8d031215614367575f5ffd5b6143708b613e3e565b995060208b01356001600160401b0381111561438a575f5ffd5b6143968d828e01613f2b565b909a5098506143a9905060408c016140b0565b965060608b0135955060808b01356143c081613e6d565b945060a08b0135935060c08b01356001600160401b038111156143e1575f5ffd5b6143ed8d828e01613f2b565b9b9e9a9d50989b979a96999598949794969560e090950135949350505050565b5f5f5f5f5f5f5f5f5f60e08a8c031215614425575f5ffd5b61442e8a613e3e565b985060208a0135975060408a0135965060608a01356001600160401b03811115614456575f5ffd5b6144628c828d01613f2b565b9097509550614475905060808b016140b0565b935061448360a08b01613f03565b925060c08a01356001600160401b0381111561449d575f5ffd5b6144a98c828d01613f2b565b915080935050809150509295985092959850929598565b5f5f604083850312156144d1575f5ffd5b82356144dc81613e6d565b915061434460208401613f03565b5f5f5f5f5f608086880312156144fe575f5ffd5b61450786613e3e565b945061451560208701613e3e565b93506040860135925060608601356001600160401b03811115614536575f5ffd5b61454288828901613f2b565b969995985093965092949392505050565b5f5f60408385031215614564575f5ffd5b823561456f81613e6d565b9150602083013561457f81613e6d565b809150509250929050565b5f5f5f6060848603121561459c575f5ffd5b6145a584613e3e565b9250613ef260208501613e3e565b5f5f604083850312156145c4575f5ffd5b50508035926020909101359150565b5f5f5f5f608085870312156145e6575f5ffd5b6145ef85613e3e565b93506145fd60208601613e3e565b9250604085013561460d81613e6d565b9396929550929360600135925050565b600181811c9082168061463157607f821691505b6020821081036141e057634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b80820180821115610cae57610cae61464f565b818382375f9101908152919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b61ffff84168152604060208201525f6120d4604083018486614685565b5f5f8335601e198436030181126146df575f5ffd5b8301803591506001600160401b038211156146f8575f5ffd5b602001915036819003821315613f68575f5ffd5b61ffff8916815260c060208201525f61472960c08301898b614685565b6001600160401b038816604084015286606084015285608084015282810360a0840152614757818587614685565b9b9a5050505050505050505050565b81810381811115610cae57610cae61464f565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b601f82111561385557805f5260205f20601f840160051c810160208510156147c45750805b601f840160051c820191505b81811015610dc1575f81556001016147d0565b81516001600160401b038111156147fc576147fc614046565b6148108161480a845461461d565b8461479f565b6020601f821160018114614842575f831561482b5750848201515b5f19600385901b1c1916600184901b178455610dc1565b5f84815260208120601f198516915b828110156148715787850151825560209485019460019092019101614851565b508482101561488e57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b61ffff8616815261ffff85166020820152836040820152608060608201525f6148ca608083018486614685565b979650505050505050565b61ffff86168152608060208201525f6148f2608083018688614685565b6001600160401b0394909416604083015250606001529392505050565b6001600160401b0383111561492657614926614046565b61493a83614934835461461d565b8361479f565b5f601f84116001811461496b575f85156149545750838201355b5f19600387901b1c1916600186901b178355610dc1565b5f83815260208120601f198716915b8281101561499a578685013582556020948501946001909201910161497a565b50868210156149b6575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b5f602082840312156149d8575f5ffd5b81516001600160401b038111156149ed575f5ffd5b8201601f810184136149fd575f5ffd5b8051614a0b6141198261408a565b818152856020838501011115614a1f575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b8082028115828204841417610cae57610cae61464f565b634e487b7160e01b5f52601260045260245ffd5b5f82614a7557614a75614a53565b500490565b5f60018201614a8b57614a8b61464f565b5060010190565b61ffff861681526001600160a01b038516602082015260a0604082018190525f90614abf90830186613dfe565b84151560608401528281036080840152614ad98185613dfe565b98975050505050505050565b5f5f60408385031215614af6575f5ffd5b505080516020909101519092909150565b61ffff85168152608060208201525f614b236080830186613dfe565b6001600160401b038516604084015282810360608401526148ca8185613dfe565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215614b68575f5ffd5b81516117b781613e6d565b5f60a0820187835286602084015260a0604084015280865180835260c0850191506020880192505f5b81811015614bc35783516001600160a01b0316835260209384019390920191600101614b9c565b50506001600160a01b039590951660608401525050608001529392505050565b5f81518060208401855e5f93019283525090919050565b5f6117b78284614be3565b61ffff8616815260a060208201525f614c2160a0830187613dfe565b6001600160401b03861660408401528281036060840152614c428186613dfe565b90508281036080840152614ad98185613dfe565b5f82614c6457614c64614a53565b500690565b61ffff8716815260c060208201525f614c8560c0830188613dfe565b8281036040840152614c978188613dfe565b6001600160a01b0387811660608601528616608085015283810360a08501529050614cc28185613dfe565b9998505050505050505050565b60ff60f81b8760f81b1681528560018201526001600160401b0360c01b8560c01b1660218201528360298201526001600160401b0360c01b8360c01b1660498201525f614ad96051830184614be3565b61ffff8916815261010060208201525f614d3d61010083018a613dfe565b6001600160401b0389166040840152606083018890526001600160a01b038716608084015260a0830186905282810360c0840152614d7b8186613dfe565b9150508260e08301529998505050505050505050565b606081525f614da36060830186613dfe565b6001600160401b03949094166020830152506040015291905056fea264697066735822122006ef3a41d0e82403b7074052ffa089b3f97c0488184b2e92e46458132c70f32564736f6c634300081c0033
Deployed Bytecode
0x6080604052600436106103d4575f3560e01c80638da5cb5b116101ff578063be9a655511610113578063df2a5b3b116100a8578063e9451f5f11610078578063e9451f5f14610bfa578063eb8d72b714610c0f578063f2fde38b14610c2e578063f5ecbdbc14610c4d578063fc0c546a14610c6c575f5ffd5b8063df2a5b3b14610b7a578063df47e37314610b99578063e0bf7fd114610bb8578063e6a20ae614610be6575f5ffd5b8063cbed8b9c116100e3578063cbed8b9c14610b0a578063d1deba1f14610b29578063d494bc9b14610b3c578063dd62ed3e14610b5b575f5ffd5b8063be9a655514610aa3578063c024666814610ab7578063c18bc19514610ad6578063c446183414610af5575f5ffd5b8063a4c51df511610194578063b256f7b711610164578063b256f7b7146109fe578063b353aaa714610a1d578063b70143c914610a50578063baf3292d14610a6f578063bccb468714610a8e575f5ffd5b8063a4c51df514610982578063a6c3d165146109a1578063a6fb5dfd146109c0578063a9059cbb146109df575f5ffd5b80639a2095a5116101cf5780639a2095a5146108d55780639bdb9812146108f45780639f38369a14610944578063a457c2d714610963575f5ffd5b80638da5cb5b146108725780639358928b1461088e578063950c8a74146108a257806395d89b41146108c1575f5ffd5b80633f1f4fa4116102f65780636256d1811161028b578063715018a61161025b578063715018a6146107c35780637533d788146107d757806376203b48146107f6578063857749b0146108095780638cfd8f5c1461083c575f5ffd5b80636256d1811461073e57806368e858cb1461075d578063695ef6bf1461077c57806370a082311461078f575f5ffd5b80634c42899a116102c65780634c42899a1461069e5780634ebc552d146106b157806353371be0146106d05780635b8c41e6146106f1575f5ffd5b80633f1f4fa41461060e57806342d65a8d14610639578063447705151461065857806349bd5a5e1461066b575f5ffd5b806323b872dd1161036c578063365260b41161033c578063365260b41461057d57806339509351146105b15780633d5369f6146105d05780633d8b38f6146105ef575f5ffd5b806323b872dd146104de5780632dc0562d146104fd578063302757441461053d578063313ce5671461055c575f5ffd5b80630df37483116103a75780630df374831461046d57806310ddb1371461048c57806318160ddd146104ab5780631dc36945146104c9575f5ffd5b806301ffc9a7146103d857806306fdde031461040c57806307e0db171461042d578063095ea7b31461044e575b5f5ffd5b3480156103e3575f5ffd5b506103f76103f2366004613dd7565b610c7e565b60405190151581526020015b60405180910390f35b348015610417575f5ffd5b50610420610cb4565b6040516104039190613e2c565b348015610438575f5ffd5b5061044c610447366004613e54565b610d44565b005b348015610459575f5ffd5b506103f7610468366004613e81565b610dc8565b348015610478575f5ffd5b5061044c610487366004613eab565b610ddf565b348015610497575f5ffd5b5061044c6104a6366004613e54565b610dfd565b3480156104b6575f5ffd5b506009545b604051908152602001610403565b3480156104d4575f5ffd5b506104bb600d5481565b3480156104e9575f5ffd5b506103f76104f8366004613ec5565b610e55565b348015610508575f5ffd5b50601454610525906501000000000090046001600160a01b031681565b6040516001600160a01b039091168152602001610403565b348015610548575f5ffd5b5061044c610557366004613f12565b610e78565b348015610567575f5ffd5b5060125b60405160ff9091168152602001610403565b348015610588575f5ffd5b5061059c610597366004613f6f565b610e9a565b60408051928352602083019190915201610403565b3480156105bc575f5ffd5b506103f76105cb366004613e81565b610eed565b3480156105db575f5ffd5b5061044c6105ea366004613fe1565b610f0e565b3480156105fa575f5ffd5b506103f7610609366004613ff8565b610f64565b348015610619575f5ffd5b506104bb610628366004613e54565b60036020525f908152604090205481565b348015610644575f5ffd5b5061044c610653366004613ff8565b61102d565b348015610663575f5ffd5b506104bb5f81565b348015610676575f5ffd5b506105257f000000000000000000000000388b4d498bba598adeac20acdae85c500153c8c181565b3480156106a9575f5ffd5b5061056b5f81565b3480156106bc575f5ffd5b5061044c6106cb366004613fe1565b6110b7565b3480156106db575f5ffd5b506014546103f790640100000000900460ff1681565b3480156106fc575f5ffd5b506104bb61070b3660046140c6565b600560209081525f9384526040808520845180860184018051928152908401958401959095209452929052825290205481565b348015610749575f5ffd5b5061044c610758366004613fe1565b611156565b348015610768575f5ffd5b5061044c61077736600461415f565b611163565b61044c61078a3660046141e6565b611392565b34801561079a575f5ffd5b506104bb6107a9366004614254565b6001600160a01b03165f9081526007602052604090205490565b3480156107ce575f5ffd5b5061044c611404565b3480156107e2575f5ffd5b506104206107f1366004613e54565b611417565b61044c61080436600461426f565b6114ae565b348015610814575f5ffd5b5061056b7f000000000000000000000000000000000000000000000000000000000000000881565b348015610847575f5ffd5b506104bb61085636600461431c565b600260209081525f928352604080842090915290825290205481565b34801561087d575f5ffd5b505f546001600160a01b0316610525565b348015610899575f5ffd5b506104bb61155b565b3480156108ad575f5ffd5b50600454610525906001600160a01b031681565b3480156108cc575f5ffd5b5061042061156a565b3480156108e0575f5ffd5b5061044c6108ef36600461434d565b611579565b3480156108ff575f5ffd5b506103f761090e3660046140c6565b600660209081525f9384526040808520845180860184018051928152908401958401959095209452929052825290205460ff1681565b34801561094f575f5ffd5b5061042061095e366004613e54565b6116a1565b34801561096e575f5ffd5b506103f761097d366004613e81565b6117be565b34801561098d575f5ffd5b5061059c61099c36600461440d565b611838565b3480156109ac575f5ffd5b5061044c6109bb366004613ff8565b6118c4565b3480156109cb575f5ffd5b5061044c6109da366004614254565b61194c565b3480156109ea575f5ffd5b506103f76109f9366004613e81565b611984565b348015610a09575f5ffd5b5061044c610a18366004613f12565b611991565b348015610a28575f5ffd5b506105257f00000000000000000000000065058ccc25a49c3f0f186afbb6f95319b34d3d5081565b348015610a5b575f5ffd5b5061044c610a6a366004613fe1565b6119b5565b348015610a7a575f5ffd5b5061044c610a89366004614254565b6119c6565b348015610a99575f5ffd5b506104bb60125481565b348015610aae575f5ffd5b5061044c611a22565b348015610ac2575f5ffd5b5061044c610ad13660046144c0565b611a95565b348015610ae1575f5ffd5b5061044c610af0366004613fe1565b611ac7565b348015610b00575f5ffd5b506104bb61271081565b348015610b15575f5ffd5b5061044c610b243660046144ea565b611ad4565b61044c610b3736600461415f565b611b59565b348015610b47575f5ffd5b5061044c610b5636600461415f565b611d75565b348015610b66575f5ffd5b506104bb610b75366004614553565b611e53565b348015610b85575f5ffd5b5061044c610b9436600461458a565b611e7d565b348015610ba4575f5ffd5b5061044c610bb33660046145b3565b611ee6565b348015610bc3575f5ffd5b506103f7610bd2366004614254565b60156020525f908152604090205460ff1681565b348015610bf1575f5ffd5b5061056b600181565b348015610c05575f5ffd5b506104bb600e5481565b348015610c1a575f5ffd5b5061044c610c29366004613ff8565b611f61565b348015610c39575f5ffd5b5061044c610c48366004614254565b611fba565b348015610c58575f5ffd5b50610420610c673660046145d3565b612030565b348015610c77575f5ffd5b5030610525565b5f6001600160e01b03198216631f7ecdf760e01b1480610cae57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600a8054610cc39061461d565b80601f0160208091040260200160405190810160405280929190818152602001828054610cef9061461d565b8015610d3a5780601f10610d1157610100808354040283529160200191610d3a565b820191905f5260205f20905b815481529060010190602001808311610d1d57829003601f168201915b5050505050905090565b610d4c6120dd565b6040516307e0db1760e01b815261ffff821660048201527f00000000000000000000000065058ccc25a49c3f0f186afbb6f95319b34d3d506001600160a01b0316906307e0db17906024015b5f604051808303815f87803b158015610daf575f5ffd5b505af1158015610dc1573d5f5f3e3d5ffd5b5050505050565b5f33610dd5818585612136565b5060019392505050565b610de76120dd565b61ffff9091165f90815260036020526040902055565b610e056120dd565b6040516310ddb13760e01b815261ffff821660048201527f00000000000000000000000065058ccc25a49c3f0f186afbb6f95319b34d3d506001600160a01b0316906310ddb13790602401610d98565b5f33610e62858285612259565b610e6d8585856122d1565b506001949350505050565b610e806120dd565b601480549115156101000261ff0019909216919091179055565b5f5f610ede8888888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506126d192505050565b91509150965096945050505050565b5f33610dd5818585610eff8383611e53565b610f099190614663565b612136565b610f166120dd565b5f8111610f5f5760405162461bcd60e51b815260206004820152601260248201527143616e6e6f742073657420746f207a65726f60701b60448201526064015b60405180910390fd5b600f55565b61ffff83165f9081526001602052604081208054829190610f849061461d565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb09061461d565b8015610ffb5780601f10610fd257610100808354040283529160200191610ffb565b820191905f5260205f20905b815481529060010190602001808311610fde57829003601f168201915b505050505090508383604051611012929190614676565b60405180910390208180519060200120149150509392505050565b6110356120dd565b6040516342d65a8d60e01b81526001600160a01b037f00000000000000000000000065058ccc25a49c3f0f186afbb6f95319b34d3d5016906342d65a8d90611085908690869086906004016146ad565b5f604051808303815f87803b15801561109c575f5ffd5b505af11580156110ae573d5f5f3e3d5ffd5b50505050505050565b80601154036110cd576019600d819055600e5550565b8060115460016110dd9190614663565b106110ef576019600d819055600e5550565b8060115460056110ff9190614663565b1061111157600f600d819055600e5550565b80601154600b6111219190614663565b1061113357600f600d819055600e5550565b8060115460186111439190614663565b1061115357600a600d819055600e555b50565b61115e6120dd565b600c55565b337f00000000000000000000000065058ccc25a49c3f0f186afbb6f95319b34d3d506001600160a01b0316146111e75760405162461bcd60e51b8152602060048201526024808201527f45746865723935654170703a20696e76616c696420656e64706f696e74206361604482015263363632b960e11b6064820152608401610f56565b61ffff86165f90815260016020526040812080546112049061461d565b80601f01602080910402602001604051908101604052809291908181526020018280546112309061461d565b801561127b5780601f106112525761010080835404028352916020019161127b565b820191905f5260205f20905b81548152906001019060200180831161125e57829003601f168201915b5050505050905080518686905014801561129557505f8151115b80156112bd5750805160208201206040516112b39088908890614676565b6040518091039020145b61131e5760405162461bcd60e51b815260206004820152602c60248201527f45746865723935654170703a20696e76616c696420736f757263652073656e6460448201526b1a5b99c818dbdb9d1c9858dd60a21b6064820152608401610f56565b6110ae8787878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050604080516020601f8a018190048102820181019092528881528a9350915088908890819084018382808284375f920191909152506127c092505050565b6113fc858585856113a66020870187614254565b6113b66040880160208901614254565b6113c360408901896146ca565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061283892505050565b505050505050565b61140c6120dd565b6114155f612921565b565b60016020525f90815260409020805461142f9061461d565b80601f016020809104026020016040519081016040528092919081815260200182805461145b9061461d565b80156114a65780601f1061147d576101008083540402835291602001916114a6565b820191905f5260205f20905b81548152906001019060200180831161148957829003601f168201915b505050505081565b6115508888888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508a92506114fa9150506020890189614254565b61150a60408a0160208b01614254565b61151760408b018b6146ca565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061297092505050565b505050505050505050565b5f61156560095490565b905090565b6060600b8054610cc39061461d565b3330146115d65760405162461bcd60e51b815260206004820152602560248201527f524542415345436f72653a2063616c6c6572206d75737420626520524542415360448201526445436f726560d81b6064820152608401610f56565b6115e1308686612a6d565b9350846001600160a01b03168a61ffff167fbf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bf8660405161162391815260200190565b60405180910390a3604051631d9f3d3160e11b81526001600160a01b03861690633b3e7a62908390611667908e908e908e908e908e908d908d908d9060040161470c565b5f604051808303815f88803b15801561167e575f5ffd5b5087f1158015611690573d5f5f3e3d5ffd5b505050505050505050505050505050565b61ffff81165f908152600160205260408120805460609291906116c39061461d565b80601f01602080910402602001604051908101604052809291908181526020018280546116ef9061461d565b801561173a5780601f106117115761010080835404028352916020019161173a565b820191905f5260205f20905b81548152906001019060200180831161171d57829003601f168201915b5050505050905080515f0361179d5760405162461bcd60e51b815260206004820152602360248201527f45746865723935654170703a206e6f20747275737465642070617468207265636044820152621bdc9960ea1b6064820152608401610f56565b6117b75f601483516117af9190614766565b839190612abe565b9392505050565b5f33816117cb8286611e53565b90508381101561182b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610f56565b610e6d8286868403612136565b5f5f6118b28b8b8b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050604080516020601f8d018190048102820181019092528b81528e93508d9250908c908c90819084018382808284375f92019190915250612bca92505050565b91509150995099975050505050505050565b6118cc6120dd565b8181306040516020016118e193929190614779565b60408051601f1981840301815291815261ffff85165f9081526001602052209061190b90826147e3565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce83838360405161193f939291906146ad565b60405180910390a1505050565b6119546120dd565b601480546001600160a01b03909216650100000000000265010000000000600160c81b0319909216919091179055565b5f33610dd58185856122d1565b6119996120dd565b60148054911515620100000262ff000019909216919091179055565b6119bd6120dd565b61115381612c81565b6119ce6120dd565b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b9060200160405180910390a150565b611a2a6120dd565b601454640100000000900460ff1615611a7a5760405162461bcd60e51b8152602060048201526012602482015271151c98591a5b99c81b9bdd081c185d5cd95960721b6044820152606401610f56565b601480544360115564ff000000ff1916640100000001179055565b611a9d6120dd565b6001600160a01b03919091165f908152601560205260409020805460ff1916911515919091179055565b611acf6120dd565b601055565b611adc6120dd565b6040516332fb62e760e21b81526001600160a01b037f00000000000000000000000065058ccc25a49c3f0f186afbb6f95319b34d3d50169063cbed8b9c90611b30908890889088908890889060040161489d565b5f604051808303815f87803b158015611b47575f5ffd5b505af1158015611550573d5f5f3e3d5ffd5b61ffff86165f908152600560205260408082209051611b7b9088908890614676565b90815260408051602092819003830190206001600160401b0387165f9081529252902054905080611c005760405162461bcd60e51b815260206004820152602960248201527f4e6f6e626c6f636b696e6745746865723935654170703a206e6f2073746f726560448201526864206d65737361676560b81b6064820152608401610f56565b808383604051611c11929190614676565b604051809103902014611c765760405162461bcd60e51b815260206004820152602760248201527f4e6f6e626c6f636b696e6745746865723935654170703a20696e76616c6964206044820152661c185e5b1bd85960ca1b6064820152608401610f56565b61ffff87165f908152600560205260408082209051611c989089908990614676565b90815260408051602092819003830181206001600160401b0389165f90815290845282902093909355601f88018290048202830182019052868252611d2d91899189908990819084018382808284375f9201919091525050604080516020601f8a018190048102820181019092528881528a9350915088908890819084018382808284375f92019190915250612e6792505050565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e58787878785604051611d649594939291906148d5565b60405180910390a150505050505050565b333014611ddf5760405162461bcd60e51b815260206004820152603260248201527f4e6f6e626c6f636b696e6745746865723935654170703a2063616c6c6572206d60448201527107573742062652045746865723935654170760741b6064820152608401610f56565b6113fc8686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050604080516020601f8901819004810282018101909252878152899350915087908790819084018382808284375f92019190915250612e6792505050565b6001600160a01b039182165f90815260086020908152604080832093909416825291909152205490565b611e856120dd565b61ffff8381165f8181526002602090815260408083209487168084529482529182902085905581519283528201929092529081018290527f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac09060600161193f565b611eee6120dd565b600a8211158015611f005750600a8111155b611f4c5760405162461bcd60e51b815260206004820152601960248201527f43616e6e6f74207365742074617865732061626f7665203130000000000000006044820152606401610f56565b600d91909155600e556014805460ff19169055565b611f696120dd565b61ffff83165f908152600160205260409020611f8682848361490f565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab83838360405161193f939291906146ad565b611fc26120dd565b6001600160a01b0381166120275760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610f56565b61115381612921565b604051633d7b2f6f60e21b815261ffff808616600483015284166024820152306044820152606481018290526060907f00000000000000000000000065058ccc25a49c3f0f186afbb6f95319b34d3d506001600160a01b03169063f5ecbdbc906084015f60405180830381865afa1580156120ad573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120d491908101906149c8565b95945050505050565b5f546001600160a01b031633146114155760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610f56565b6001600160a01b0383166121985760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610f56565b6001600160a01b0382166121f95760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610f56565b6001600160a01b038381165f8181526008602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f6122648484611e53565b90505f1981146122cb57818110156122be5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610f56565b6122cb8484848403612136565b50505050565b5f811161232f5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e73666572206d75737420626520677265617465722060448201526507468616e20360d41b6064820152608401610f56565b601454640100000000900460ff166123ad575f546001600160a01b038481169116148061236857505f546001600160a01b038381169116145b6123ad5760405162461bcd60e51b8152602060048201526016602482015275151c98591a5b99c81b9bdd081858dd1a5d99481e595d60521b6044820152606401610f56565b6014545f9060ff16156123c3576123c3436110b7565b7f000000000000000000000000388b4d498bba598adeac20acdae85c500153c8c16001600160a01b0316846001600160a01b031614801561241c57506001600160a01b0383165f9081526015602052604090205460ff16155b156125195760105482612443856001600160a01b03165f9081526007602052604090205490565b61244d9190614663565b11156124925760405162461bcd60e51b815260206004820152601460248201527313585e0815d85b1b195d08125b881159999958dd60621b6044820152606401610f56565b600c548211156124d75760405162461bcd60e51b815260206004820152601060248201526f13585e08151e081a5b881959999958dd60821b6044820152606401610f56565b601454610100900460ff1615612504576064600d54836124f79190614a3c565b6125019190614a67565b90505b60128054905f61251383614a7a565b91905055505b7f000000000000000000000000388b4d498bba598adeac20acdae85c500153c8c16001600160a01b0316836001600160a01b031614801561257257506001600160a01b0384165f9081526015602052604090205460ff16155b156125e957600c548211156125bc5760405162461bcd60e51b815260206004820152601060248201526f13585e08151e081a5b881959999958dd60821b6044820152606401610f56565b601454610100900460ff16156125e9576064600e54836125dc9190614a3c565b6125e69190614a67565b90505b305f90815260076020526040902054600f548110801590819061261657506014546301000000900460ff16155b801561265457507f000000000000000000000000388b4d498bba598adeac20acdae85c500153c8c16001600160a01b0316866001600160a01b031614155b801561267857506001600160a01b0386165f9081526015602052604090205460ff16155b80156126875750601354601254115b1561269757612697600f54612c81565b82156126c6575f6126a88486614766565b90506126b5873086612eec565b6126c0878783612eec565b506113fc565b6113fc868686612eec565b5f5f5f61271c876126e188613095565b604080515f6020820152602181019390935260c09190911b6001600160c01b0319166041830152805160298184030181526049909201905290565b60405163040a7bb160e41b81529091506001600160a01b037f00000000000000000000000065058ccc25a49c3f0f186afbb6f95319b34d3d5016906340a7bb1090612773908b90309086908b908b90600401614a92565b6040805180830381865afa15801561278d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127b19190614ae5565b92509250509550959350505050565b5f5f6128225a609663d494bc9b60e01b898989896040516024016127e79493929190614b07565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091523092919061311a565b91509150816113fc576113fc868686868561319e565b5f61284587828481613238565b61284e85613315565b50905061285d88888884613354565b90505f81116128ae5760405162461bcd60e51b815260206004820152601c60248201527f524542415345436f72653a20616d6f756e7420746f6f20736d616c6c000000006044820152606401610f56565b5f6128bc876126e184613095565b90506128cc888287878734613385565b86896001600160a01b03168961ffff167fd81fc9b8523134ed613870ed029d6170cbb73aa6a6bc311b9a642689fb9df59a8560405161290d91815260200190565b60405180910390a450979650505050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f612987896001846001600160401b038916613238565b61299087613315565b50905061299f8a8a8a84613354565b90505f81116129f05760405162461bcd60e51b815260206004820152601c60248201527f524542415345436f72653a20616d6f756e7420746f6f20736d616c6c000000006044820152606401610f56565b5f612a06338a6129ff85613095565b8a8a613528565b9050612a168a8287878734613385565b888b6001600160a01b03168b61ffff167fd81fc9b8523134ed613870ed029d6170cbb73aa6a6bc311b9a642689fb9df59a85604051612a5791815260200190565b60405180910390a4509998505050505050505050565b5f33306001600160a01b03861614801590612a9a5750806001600160a01b0316856001600160a01b031614155b15612aaa57612aaa858285612259565b612ab58585856122d1565b50909392505050565b606081612acc81601f614663565b1015612b0b5760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401610f56565b612b158284614663565b84511015612b595760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b6044820152606401610f56565b606082158015612b775760405191505f825260208201604052612bc1565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015612bb0578051835260209283019201612b98565b5050858452601f01601f1916604052505b50949350505050565b5f5f5f612bdb338a6129ff8b613095565b60405163040a7bb160e41b81529091506001600160a01b037f00000000000000000000000065058ccc25a49c3f0f186afbb6f95319b34d3d5016906340a7bb1090612c32908d90309086908b908b90600401614a92565b6040805180830381865afa158015612c4c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c709190614ae5565b925092505097509795505050505050565b6014805463ff000000191663010000001790556040805160028082526060820183525f9260208301908036833701905050905030815f81518110612cc757612cc7614b44565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d43573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d679190614b58565b81600181518110612d7a57612d7a614b44565b60200260200101906001600160a01b031690816001600160a01b031681525050612dc5307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84612136565b60145460405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81169263791ac94792612e299287925f92889265010000000000909204909116904290600401614b73565b5f604051808303815f87803b158015612e40575f5ffd5b505af1158015612e52573d5f5f3e3d5ffd5b50506014805463ff0000001916905550505050565b5f612e728282613569565b905060ff8116612e8d57612e88858585856135c4565b610dc1565b5f1960ff821601612ea457612e8885858585613652565b60405162461bcd60e51b815260206004820152601f60248201527f524542415345436f72653a20756e6b6e6f776e207061636b65742074797065006044820152606401610f56565b6001600160a01b038316612f505760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610f56565b6001600160a01b038216612fb25760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610f56565b6001600160a01b0383165f90815260076020526040902054818110156130295760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610f56565b6001600160a01b038085165f8181526007602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906130889086815260200190565b60405180910390a36122cb565b5f806130c17f00000000000000000000000000000000000000000000000000000002540be40084614a67565b90506001600160401b03811115610cae5760405162461bcd60e51b815260206004820152601d60248201527f524542415345436f72653a20616d6f756e745344206f766572666c6f770000006044820152606401610f56565b5f60605f5f5f8661ffff166001600160401b0381111561313c5761313c614046565b6040519080825280601f01601f191660200182016040528015613166576020820181803683370190505b5090505f5f8751602089015f8d8df191503d925086831115613186578692505b828152825f602083013e909890975095505050505050565b818051906020012060055f8761ffff1661ffff1681526020019081526020015f20856040516131cd9190614bfa565b9081526040805191829003602090810183206001600160401b0388165f908152915220919091557fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c906132299087908790879087908790614c05565b60405180910390a15050505050565b5f6132428361385a565b61ffff8087165f90815260026020908152604080832093891683529290522054909150806132b25760405162461bcd60e51b815260206004820181905260248201527f45746865723935654170703a206d696e4761734c696d6974206e6f74207365746044820152606401610f56565b6132bc8382614663565b8210156113fc5760405162461bcd60e51b815260206004820152602160248201527f45746865723935654170703a20676173206c696d697420697320746f6f206c6f6044820152607760f81b6064820152608401610f56565b5f806133417f00000000000000000000000000000000000000000000000000000002540be40084614c56565b905061334d8184614766565b9150915091565b5f336001600160a01b038616811461337157613371868285612259565b61337b86846138c0565b5090949350505050565b61ffff86165f90815260016020526040812080546133a29061461d565b80601f01602080910402602001604051908101604052809291908181526020018280546133ce9061461d565b80156134195780601f106133f057610100808354040283529160200191613419565b820191905f5260205f20905b8154815290600101906020018083116133fc57829003601f168201915b5050505050905080515f0361348f5760405162461bcd60e51b815260206004820152603660248201527f45746865723935654170703a2064657374696e6174696f6e20636861696e206960448201527573206e6f742061207472757374656420736f7572636560501b6064820152608401610f56565b61349a8787516139f2565b60405162c5803160e81b81526001600160a01b037f00000000000000000000000065058ccc25a49c3f0f186afbb6f95319b34d3d50169063c58031009084906134f1908b9086908c908c908c908c90600401614c69565b5f604051808303818588803b158015613508575f5ffd5b505af115801561351a573d5f5f3e3d5ffd5b505050505050505050505050565b6060600185856001600160a01b038916858760405160200161354f96959493929190614ccf565b604051602081830303815290604052905095945050505050565b5f613575826001614663565b835110156135bb5760405162461bcd60e51b8152602060048201526013602482015272746f55696e74385f6f75744f66426f756e647360681b6044820152606401610f56565b50016001015190565b5f5f6135cf83613a71565b90925090506001600160a01b0382166135e85761dead91505b5f6135f282613afa565b90506135ff878483613b2e565b9050826001600160a01b03168761ffff167fbf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bf8360405161364191815260200190565b60405180910390a350505050505050565b5f5f5f5f5f61366086613b40565b945094509450945094505f60065f8b61ffff1661ffff1681526020019081526020015f20896040516136929190614bfa565b90815260408051602092819003830190206001600160401b038b165f908152925281205460ff1691506136c485613afa565b905081613730576136d68b3083613b2e565b61ffff8c165f908152600660205260409081902090519192506001916136fd908d90614bfa565b90815260408051602092819003830190206001600160401b038d165f90815292529020805460ff19169115159190911790555b6001600160a01b0386163b613787576040516001600160a01b03871681527f9aedf5fdba8716db3b6705ca00150643309995d4f818a249ed6dde6677e7792d9060200160405180910390a1505050505050506122cb565b8a8a8a8a8a8a868a5f8a6137a4578b6001600160401b03166137a6565b5a5b90505f5f6137d75a6096639a2095a560e01b8e8e8e8d8d8d8d8d6040516024016127e7989796959493929190614d1f565b915091508115613830578751602089012060405161ffff8d16907f6d76c6b2837f234f610c722403fa5f92d7d05f167f2918924b59b8e34f3a43bf90613822908e908e908690614d91565b60405180910390a25061383d565b61383d8b8b8b8b8561319e565b50505050505050505050505050505050505050505050565b505050565b5f6022825110156138b85760405162461bcd60e51b815260206004820152602260248201527f45746865723935654170703a20696e76616c69642061646170746572506172616044820152616d7360f01b6064820152608401610f56565b506022015190565b6001600160a01b0382166139205760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610f56565b6001600160a01b0382165f90815260076020526040902054818110156139935760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610f56565b6001600160a01b0383165f8181526007602090815260408083208686039055600980548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b61ffff82165f9081526003602052604081205490819003613a1257506127105b808211156138555760405162461bcd60e51b815260206004820152602660248201527f45746865723935654170703a207061796c6f61642073697a6520697320746f6f604482015265206c6172676560d01b6064820152608401610f56565b5f8080613a7e8482613569565b60ff16148015613a8f575082516029145b613adb5760405162461bcd60e51b815260206004820152601b60248201527f524542415345436f72653a20696e76616c6964207061796c6f616400000000006044820152606401610f56565b613ae683600d613bfb565b9150613af3836021613c5f565b9050915091565b5f610cae7f00000000000000000000000000000000000000000000000000000002540be4006001600160401b038416614a3c565b5f613b398383613cbb565b5092915050565b5f80806060816001613b528783613569565b60ff1614613ba25760405162461bcd60e51b815260206004820152601b60248201527f524542415345436f72653a20696e76616c6964207061796c6f616400000000006044820152606401610f56565b613bad86600d613bfb565b9350613bba866021613c5f565b9250613bc7866029613d7a565b9450613bd4866049613c5f565b9050613bf06051808851613be89190614766565b889190612abe565b915091939590929450565b5f613c07826014614663565b83511015613c4f5760405162461bcd60e51b8152602060048201526015602482015274746f416464726573735f6f75744f66426f756e647360581b6044820152606401610f56565b500160200151600160601b900490565b5f613c6b826008614663565b83511015613cb25760405162461bcd60e51b8152602060048201526014602482015273746f55696e7436345f6f75744f66426f756e647360601b6044820152606401610f56565b50016008015190565b6001600160a01b038216613d115760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610f56565b8060095f828254613d229190614663565b90915550506001600160a01b0382165f818152600760209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b5f613d86826020614663565b83511015613dce5760405162461bcd60e51b8152602060048201526015602482015274746f427974657333325f6f75744f66426f756e647360581b6044820152606401610f56565b50016020015190565b5f60208284031215613de7575f5ffd5b81356001600160e01b0319811681146117b7575f5ffd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6117b76020830184613dfe565b803561ffff81168114613e4f575f5ffd5b919050565b5f60208284031215613e64575f5ffd5b6117b782613e3e565b6001600160a01b0381168114611153575f5ffd5b5f5f60408385031215613e92575f5ffd5b8235613e9d81613e6d565b946020939093013593505050565b5f5f60408385031215613ebc575f5ffd5b613e9d83613e3e565b5f5f5f60608486031215613ed7575f5ffd5b8335613ee281613e6d565b92506020840135613ef281613e6d565b929592945050506040919091013590565b80358015158114613e4f575f5ffd5b5f60208284031215613f22575f5ffd5b6117b782613f03565b5f5f83601f840112613f3b575f5ffd5b5081356001600160401b03811115613f51575f5ffd5b602083019150836020828501011115613f68575f5ffd5b9250929050565b5f5f5f5f5f5f60a08789031215613f84575f5ffd5b613f8d87613e3e565b95506020870135945060408701359350613fa960608801613f03565b925060808701356001600160401b03811115613fc3575f5ffd5b613fcf89828a01613f2b565b979a9699509497509295939492505050565b5f60208284031215613ff1575f5ffd5b5035919050565b5f5f5f6040848603121561400a575f5ffd5b61401384613e3e565b925060208401356001600160401b0381111561402d575f5ffd5b61403986828701613f2b565b9497909650939450505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561408257614082614046565b604052919050565b5f6001600160401b038211156140a2576140a2614046565b50601f01601f191660200190565b80356001600160401b0381168114613e4f575f5ffd5b5f5f5f606084860312156140d8575f5ffd5b6140e184613e3e565b925060208401356001600160401b038111156140fb575f5ffd5b8401601f8101861361410b575f5ffd5b803561411e6141198261408a565b61405a565b818152876020838501011115614132575f5ffd5b816020840160208301375f60208383010152809450505050614156604085016140b0565b90509250925092565b5f5f5f5f5f5f60808789031215614174575f5ffd5b61417d87613e3e565b955060208701356001600160401b03811115614197575f5ffd5b6141a389828a01613f2b565b90965094506141b69050604088016140b0565b925060608701356001600160401b03811115613fc3575f5ffd5b5f606082840312156141e0575f5ffd5b50919050565b5f5f5f5f5f60a086880312156141fa575f5ffd5b853561420581613e6d565b945061421360208701613e3e565b9350604086013592506060860135915060808601356001600160401b0381111561423b575f5ffd5b614247888289016141d0565b9150509295509295909350565b5f60208284031215614264575f5ffd5b81356117b781613e6d565b5f5f5f5f5f5f5f5f60e0898b031215614286575f5ffd5b883561429181613e6d565b975061429f60208a01613e3e565b9650604089013595506060890135945060808901356001600160401b038111156142c7575f5ffd5b6142d38b828c01613f2b565b90955093506142e6905060a08a016140b0565b915060c08901356001600160401b03811115614300575f5ffd5b61430c8b828c016141d0565b9150509295985092959890939650565b5f5f6040838503121561432d575f5ffd5b61433683613e3e565b915061434460208401613e3e565b90509250929050565b5f5f5f5f5f5f5f5f5f5f6101008b8d031215614367575f5ffd5b6143708b613e3e565b995060208b01356001600160401b0381111561438a575f5ffd5b6143968d828e01613f2b565b909a5098506143a9905060408c016140b0565b965060608b0135955060808b01356143c081613e6d565b945060a08b0135935060c08b01356001600160401b038111156143e1575f5ffd5b6143ed8d828e01613f2b565b9b9e9a9d50989b979a96999598949794969560e090950135949350505050565b5f5f5f5f5f5f5f5f5f60e08a8c031215614425575f5ffd5b61442e8a613e3e565b985060208a0135975060408a0135965060608a01356001600160401b03811115614456575f5ffd5b6144628c828d01613f2b565b9097509550614475905060808b016140b0565b935061448360a08b01613f03565b925060c08a01356001600160401b0381111561449d575f5ffd5b6144a98c828d01613f2b565b915080935050809150509295985092959850929598565b5f5f604083850312156144d1575f5ffd5b82356144dc81613e6d565b915061434460208401613f03565b5f5f5f5f5f608086880312156144fe575f5ffd5b61450786613e3e565b945061451560208701613e3e565b93506040860135925060608601356001600160401b03811115614536575f5ffd5b61454288828901613f2b565b969995985093965092949392505050565b5f5f60408385031215614564575f5ffd5b823561456f81613e6d565b9150602083013561457f81613e6d565b809150509250929050565b5f5f5f6060848603121561459c575f5ffd5b6145a584613e3e565b9250613ef260208501613e3e565b5f5f604083850312156145c4575f5ffd5b50508035926020909101359150565b5f5f5f5f608085870312156145e6575f5ffd5b6145ef85613e3e565b93506145fd60208601613e3e565b9250604085013561460d81613e6d565b9396929550929360600135925050565b600181811c9082168061463157607f821691505b6020821081036141e057634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b80820180821115610cae57610cae61464f565b818382375f9101908152919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b61ffff84168152604060208201525f6120d4604083018486614685565b5f5f8335601e198436030181126146df575f5ffd5b8301803591506001600160401b038211156146f8575f5ffd5b602001915036819003821315613f68575f5ffd5b61ffff8916815260c060208201525f61472960c08301898b614685565b6001600160401b038816604084015286606084015285608084015282810360a0840152614757818587614685565b9b9a5050505050505050505050565b81810381811115610cae57610cae61464f565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b601f82111561385557805f5260205f20601f840160051c810160208510156147c45750805b601f840160051c820191505b81811015610dc1575f81556001016147d0565b81516001600160401b038111156147fc576147fc614046565b6148108161480a845461461d565b8461479f565b6020601f821160018114614842575f831561482b5750848201515b5f19600385901b1c1916600184901b178455610dc1565b5f84815260208120601f198516915b828110156148715787850151825560209485019460019092019101614851565b508482101561488e57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b61ffff8616815261ffff85166020820152836040820152608060608201525f6148ca608083018486614685565b979650505050505050565b61ffff86168152608060208201525f6148f2608083018688614685565b6001600160401b0394909416604083015250606001529392505050565b6001600160401b0383111561492657614926614046565b61493a83614934835461461d565b8361479f565b5f601f84116001811461496b575f85156149545750838201355b5f19600387901b1c1916600186901b178355610dc1565b5f83815260208120601f198716915b8281101561499a578685013582556020948501946001909201910161497a565b50868210156149b6575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b5f602082840312156149d8575f5ffd5b81516001600160401b038111156149ed575f5ffd5b8201601f810184136149fd575f5ffd5b8051614a0b6141198261408a565b818152856020838501011115614a1f575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b8082028115828204841417610cae57610cae61464f565b634e487b7160e01b5f52601260045260245ffd5b5f82614a7557614a75614a53565b500490565b5f60018201614a8b57614a8b61464f565b5060010190565b61ffff861681526001600160a01b038516602082015260a0604082018190525f90614abf90830186613dfe565b84151560608401528281036080840152614ad98185613dfe565b98975050505050505050565b5f5f60408385031215614af6575f5ffd5b505080516020909101519092909150565b61ffff85168152608060208201525f614b236080830186613dfe565b6001600160401b038516604084015282810360608401526148ca8185613dfe565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215614b68575f5ffd5b81516117b781613e6d565b5f60a0820187835286602084015260a0604084015280865180835260c0850191506020880192505f5b81811015614bc35783516001600160a01b0316835260209384019390920191600101614b9c565b50506001600160a01b039590951660608401525050608001529392505050565b5f81518060208401855e5f93019283525090919050565b5f6117b78284614be3565b61ffff8616815260a060208201525f614c2160a0830187613dfe565b6001600160401b03861660408401528281036060840152614c428186613dfe565b90508281036080840152614ad98185613dfe565b5f82614c6457614c64614a53565b500690565b61ffff8716815260c060208201525f614c8560c0830188613dfe565b8281036040840152614c978188613dfe565b6001600160a01b0387811660608601528616608085015283810360a08501529050614cc28185613dfe565b9998505050505050505050565b60ff60f81b8760f81b1681528560018201526001600160401b0360c01b8560c01b1660218201528360298201526001600160401b0360c01b8360c01b1660498201525f614ad96051830184614be3565b61ffff8916815261010060208201525f614d3d61010083018a613dfe565b6001600160401b0389166040840152606083018890526001600160a01b038716608084015260a0830186905282810360c0840152614d7b8186613dfe565b9150508260e08301529998505050505050505050565b606081525f614da36060830186613dfe565b6001600160401b03949094166020830152506040015291905056fea264697066735822122006ef3a41d0e82403b7074052ffa089b3f97c0488184b2e92e46458132c70f32564736f6c634300081c0033
Deployed Bytecode Sourcemap
86308:6522:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66082:216;;;;;;;;;;-1:-1:-1;66082:216:0;;;;;:::i;:::-;;:::i;:::-;;;470:14:1;;463:22;445:41;;433:2;418:18;66082:216:0;;;;;;;;72996:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;47256:123::-;;;;;;;;;;-1:-1:-1;47256:123:0;;;;;:::i;:::-;;:::i;:::-;;75356:201;;;;;;;;;;-1:-1:-1;75356:201:0;;;;;:::i;:::-;;:::i;49165:142::-;;;;;;;;;;-1:-1:-1;49165:142:0;;;;;:::i;:::-;;:::i;47387:129::-;;;;;;;;;;-1:-1:-1;47387:129:0;;;;;:::i;:::-;;:::i;74125:108::-;;;;;;;;;;-1:-1:-1;74213:12:0;;74125:108;;;2326:25:1;;;2314:2;2299:18;74125:108:0;2180:177:1;86417:25:0;;;;;;;;;;;;;;;;76137:261;;;;;;;;;;-1:-1:-1;76137:261:0;;;;;:::i;:::-;;:::i;86778:24::-;;;;;;;;;;-1:-1:-1;86778:24:0;;;;;;;-1:-1:-1;;;;;86778:24:0;;;;;;-1:-1:-1;;;;;3039:32:1;;;3021:51;;3009:2;2994:18;86778:24:0;2875:203:1;92308:95:0;;;;;;;;;;-1:-1:-1;92308:95:0;;;;;:::i;:::-;;:::i;73967:93::-;;;;;;;;;;-1:-1:-1;74050:2:0;73967:93;;;3605:4:1;3593:17;;;3575:36;;3563:2;3548:18;73967:93:0;3433:184:1;66306:344:0;;;;;;;;;;-1:-1:-1;66306:344:0;;;;;:::i;:::-;;:::i;:::-;;;;4938:25:1;;;4994:2;4979:18;;4972:34;;;;4911:18;66306:344:0;4764:248:1;76807:238:0;;;;;;;;;;-1:-1:-1;76807:238:0;;;;;:::i;:::-;;:::i;92095:205::-;;;;;;;;;;-1:-1:-1;92095:205:0;;;;;:::i;:::-;;:::i;49405:250::-;;;;;;;;;;-1:-1:-1;49405:250:0;;;;;:::i;:::-;;:::i;43108:53::-;;;;;;;;;;-1:-1:-1;43108:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;47524:178;;;;;;;;;;-1:-1:-1;47524:178:0;;;;;:::i;:::-;;:::i;53353:37::-;;;;;;;;;;;;53389:1;53353:37;;86809:38;;;;;;;;;;;;;;;53419:33;;;;;;;;;;;;53451:1;53419:33;;90582:556;;;;;;;;;;-1:-1:-1;90582:556:0;;;;;:::i;:::-;;:::i;86743:26::-;;;;;;;;;;-1:-1:-1;86743:26:0;;;;;;;;;;;50286:85;;;;;;;;;;-1:-1:-1;50286:85:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;91978:109;;;;;;;;;;-1:-1:-1;91978:109:0;;;;;:::i;:::-;;:::i;43564:872::-;;;;;;;;;;-1:-1:-1;43564:872:0;;;;;:::i;:::-;;:::i;64935:356::-;;;;;;:::i;:::-;;:::i;74296:127::-;;;;;;;;;;-1:-1:-1;74296:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;74397:18:0;74370:7;74397:18;;;:9;:18;;;;;;;74296:127;41663:103;;;;;;;;;;;;;:::i;42978:51::-;;;;;;;;;;-1:-1:-1;42978:51:0;;;;;:::i;:::-;;:::i;65299:586::-;;;;;;:::i;:::-;;:::i;53510:37::-;;;;;;;;;;;;;;;43036:65;;;;;;;;;;-1:-1:-1;43036:65:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;41022:87;;;;;;;;;;-1:-1:-1;41068:7:0;41095:6;-1:-1:-1;;;;;41095:6:0;41022:87;;84767:112;;;;;;;;;;;;;:::i;43168:23::-;;;;;;;;;;-1:-1:-1;43168:23:0;;;;-1:-1:-1;;;;;43168:23:0;;;73215:104;;;;;;;;;;;;;:::i;54769:648::-;;;;;;;;;;-1:-1:-1;54769:648:0;;;;;:::i;:::-;;:::i;53556:83::-;;;;;;;;;;-1:-1:-1;53556:83:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48353:336;;;;;;;;;;-1:-1:-1;48353:336:0;;;;;:::i;:::-;;:::i;77548:436::-;;;;;;;;;;-1:-1:-1;77548:436:0;;;;;:::i;:::-;;:::i;66658:450::-;;;;;;;;;;-1:-1:-1;66658:450:0;;;;;:::i;:::-;;:::i;48064:281::-;;;;;;;;;;-1:-1:-1;48064:281:0;;;;;:::i;:::-;;:::i;91146:111::-;;;;;;;;;;-1:-1:-1;91146:111:0;;;;;:::i;:::-;;:::i;74629:193::-;;;;;;;;;;-1:-1:-1;74629:193:0;;;;;:::i;:::-;;:::i;92615:109::-;;;;;;;;;;-1:-1:-1;92615:109:0;;;;;:::i;:::-;;:::i;42927:44::-;;;;;;;;;;;;;;;92732:95;;;;;;;;;;-1:-1:-1;92732:95:0;;;;;:::i;:::-;;:::i;48697:136::-;;;;;;;;;;-1:-1:-1;48697:136:0;;;;;:::i;:::-;;:::i;86572:19::-;;;;;;;;;;;;;;;;92411:196;;;;;;;;;;;;;:::i;91646:167::-;;;;;;;;;;-1:-1:-1;91646:167:0;;;;;:::i;:::-;;:::i;91821:149::-;;;;;;;;;;-1:-1:-1;91821:149:0;;;;;:::i;:::-;;:::i;42863:55::-;;;;;;;;;;;;42913:5;42863:55;;47001:247;;;;;;;;;;-1:-1:-1;47001:247:0;;;;;:::i;:::-;;:::i;52275:828::-;;;;;;:::i;:::-;;:::i;51627:413::-;;;;;;;;;;-1:-1:-1;51627:413:0;;;;;:::i;:::-;;:::i;74885:151::-;;;;;;;;;;-1:-1:-1;74885:151:0;;;;;:::i;:::-;;:::i;48841:262::-;;;;;;;;;;-1:-1:-1;48841:262:0;;;;;:::i;:::-;;:::i;91265:373::-;;;;;;;;;;-1:-1:-1;91265:373:0;;;;;:::i;:::-;;:::i;86856:51::-;;;;;;;;;;-1:-1:-1;86856:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;53459:42;;;;;;;;;;;;53500:1;53459:42;;86449:26;;;;;;;;;;;;;;;;47849:207;;;;;;;;;;-1:-1:-1;47849:207:0;;;;;:::i;:::-;;:::i;41921:201::-;;;;;;;;;;-1:-1:-1;41921:201:0;;;;;:::i;:::-;;:::i;46687:254::-;;;;;;;;;;-1:-1:-1;46687:254:0;;;;;:::i;:::-;;:::i;84887:103::-;;;;;;;;;;-1:-1:-1;84977:4:0;84887:103;;66082:216;66184:4;-1:-1:-1;;;;;;66208:42:0;;-1:-1:-1;;;66208:42:0;;:82;;-1:-1:-1;;;;;;;;;;2876:40:0;;;66254:36;66201:89;66082:216;-1:-1:-1;;66082:216:0:o;72996:100::-;73050:13;73083:5;73076:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72996:100;:::o;47256:123::-;40908:13;:11;:13::i;:::-;47336:35:::1;::::0;-1:-1:-1;;;47336:35:0;;17263:6:1;17251:19;;47336:35:0::1;::::0;::::1;17233:38:1::0;47336:10:0::1;-1:-1:-1::0;;;;;47336:25:0::1;::::0;::::1;::::0;17206:18:1;;47336:35:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47256:123:::0;:::o;75356:201::-;75439:4;39653:10;75495:32;39653:10;75511:7;75520:6;75495:8;:32::i;:::-;-1:-1:-1;75545:4:0;;75356:201;-1:-1:-1;;;75356:201:0:o;49165:142::-;40908:13;:11;:13::i;:::-;49256:35:::1;::::0;;::::1;;::::0;;;:22:::1;:35;::::0;;;;:43;49165:142::o;47387:129::-;40908:13;:11;:13::i;:::-;47470:38:::1;::::0;-1:-1:-1;;;47470:38:0;;17263:6:1;17251:19;;47470:38:0::1;::::0;::::1;17233::1::0;47470:10:0::1;-1:-1:-1::0;;;;;47470:28:0::1;::::0;::::1;::::0;17206:18:1;;47470:38:0::1;17089:188:1::0;76137:261:0;76234:4;39653:10;76292:38;76308:4;39653:10;76323:6;76292:15;:38::i;:::-;76341:27;76351:4;76357:2;76361:6;76341:9;:27::i;:::-;-1:-1:-1;76386:4:0;;76137:261;-1:-1:-1;;;;76137:261:0:o;92308:95::-;40908:13;:11;:13::i;:::-;92373:12:::1;:22:::0;;;::::1;;;;-1:-1:-1::0;;92373:22:0;;::::1;::::0;;;::::1;::::0;;92308:95::o;66306:344::-;66520:14;66536:11;66567:75;66584:11;66597:10;66609:7;66618;66627:14;;66567:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66567:16:0;;-1:-1:-1;;;66567:75:0:i;:::-;66560:82;;;;66306:344;;;;;;;;;:::o;76807:238::-;76895:4;39653:10;76951:64;39653:10;76967:7;77004:10;76976:25;39653:10;76967:7;76976:9;:25::i;:::-;:38;;;;:::i;:::-;76951:8;:64::i;92095:205::-;40908:13;:11;:13::i;:::-;92222:1:::1;92207:12;:16;92199:47;;;::::0;-1:-1:-1;;;92199:47:0;;17746:2:1;92199:47:0::1;::::0;::::1;17728:21:1::0;17785:2;17765:18;;;17758:30;-1:-1:-1;;;17804:18:1;;;17797:48;17862:18;;92199:47:0::1;;;;;;;;;92257:20;:35:::0;92095:205::o;49405:250::-;49547:32;;;49501:4;49547:32;;;:19;:32;;;;;49518:61;;49501:4;;49547:32;49518:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49635:11;;49625:22;;;;;;;:::i;:::-;;;;;;;;49607:13;49597:24;;;;;;:50;49590:57;;;49405:250;;;;;:::o;47524:178::-;40908:13;:11;:13::i;:::-;47639:55:::1;::::0;-1:-1:-1;;;47639:55:0;;-1:-1:-1;;;;;47639:10:0::1;:29;::::0;::::1;::::0;:55:::1;::::0;47669:11;;47682;;;;47639:55:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47524:178:::0;;;:::o;90582:556::-;90652:6;90638:10;;:20;90634:497;;90684:2;90675:6;:11;;;90701:7;:12;90582:556;:::o;90634:497::-;90753:6;90735:10;;90748:1;90735:14;;;;:::i;:::-;:24;90731:400;;90785:2;90776:6;:11;;;90802:7;:12;90582:556;:::o;90731:400::-;90854:6;90836:10;;90849:1;90836:14;;;;:::i;:::-;:24;90832:299;;90886:2;90877:6;:11;;;90903:7;:12;90582:556;:::o;90832:299::-;90956:6;90937:10;;90950:2;90937:15;;;;:::i;:::-;:25;90933:198;;90988:2;90979:6;:11;;;91005:7;:12;90582:556;:::o;90933:198::-;91058:6;91039:10;;91052:2;91039:15;;;;:::i;:::-;:25;91035:96;;91090:2;91081:6;:11;;;91107:7;:12;91035:96;90582:556;:::o;91978:109::-;40908:13;:11;:13::i;:::-;92055:11:::1;:24:::0;91978:109::o;43564:872::-;39653:10;43859;-1:-1:-1;;;;;43835:35:0;;43827:84;;;;-1:-1:-1;;;43827:84:0;;18971:2:1;43827:84:0;;;18953:21:1;19010:2;18990:18;;;18983:30;19049:34;19029:18;;;19022:62;-1:-1:-1;;;19100:18:1;;;19093:34;19144:19;;43827:84:0;18769:400:1;43827:84:0;43953:32;;;43924:26;43953:32;;;:19;:32;;;;;43924:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44173:13;:20;44151:11;;:18;;:42;:70;;;;;44220:1;44197:13;:20;:24;44151:70;:124;;;;-1:-1:-1;44251:24:0;;;;;;44225:22;;;;44235:11;;;;44225:22;:::i;:::-;;;;;;;;:50;44151:124;44129:218;;;;-1:-1:-1;;;44129:218:0;;19376:2:1;44129:218:0;;;19358:21:1;19415:2;19395:18;;;19388:30;19454:34;19434:18;;;19427:62;-1:-1:-1;;;19505:18:1;;;19498:42;19557:19;;44129:218:0;19174:408:1;44129:218:0;44360:68;44385:11;44398;;44360:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44360:68:0;;;;;;;;;;;;;;;;;;;;;;44411:6;;-1:-1:-1;44360:68:0;-1:-1:-1;44419:8:0;;;;;;44360:68;;44419:8;;;;44360:68;;;;;;;;;-1:-1:-1;44360:24:0;;-1:-1:-1;;;44360:68:0:i;64935:356::-;65152:131;65158:5;65165:11;65178:10;65190:7;65199:25;;;;:11;:25;:::i;:::-;65226:29;;;;;;;;:::i;:::-;65257:25;;;;:11;:25;:::i;:::-;65152:131;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65152:5:0;;-1:-1:-1;;;65152:131:0:i;:::-;;64935:356;;;;;:::o;41663:103::-;40908:13;:11;:13::i;:::-;41728:30:::1;41755:1;41728:18;:30::i;:::-;41663:103::o:0;42978:51::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;65299:586::-;65585:292;65612:5;65632:11;65658:10;65683:7;65705:8;;65585:292;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65728:14:0;;-1:-1:-1;65757:25:0;;-1:-1:-1;;65757:25:0;;;:11;:25;:::i;:::-;65797:29;;;;;;;;:::i;:::-;65841:25;;;;:11;:25;:::i;:::-;65585:292;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65585:12:0;;-1:-1:-1;;;65585:292:0:i;:::-;;65299:586;;;;;;;;:::o;84767:112::-;84834:4;84858:13;74213:12;;;74125:108;84858:13;84851:20;;84767:112;:::o;73215:104::-;73271:13;73304:7;73297:14;;;;;:::i;54769:648::-;39653:10;55084:4;55060:29;55052:79;;;;-1:-1:-1;;;55052:79:0;;20575:2:1;55052:79:0;;;20557:21:1;20614:2;20594:18;;;20587:30;20653:34;20633:18;;;20626:62;-1:-1:-1;;;20704:18:1;;;20697:35;20749:19;;55052:79:0;20373:401:1;55052:79:0;55171:42;55193:4;55200:3;55205:7;55171:13;:42::i;:::-;55161:52;;55259:3;-1:-1:-1;;;;;55229:43:0;55246:11;55229:43;;;55264:7;55229:43;;;;2326:25:1;;2314:2;2299:18;;2180:177;55229:43:0;;;;;;;;55302:107;;-1:-1:-1;;;55302:107:0;;-1:-1:-1;;;;;55302:29:0;;;;;55337:11;;55302:107;;55350:11;;55363;;;;55376:6;;55384:5;;55391:7;;55400:8;;;;55302:107;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54769:648;;;;;;;;;;:::o;48353:336::-;48477:35;;;48457:17;48477:35;;;:19;:35;;;;;48457:55;;48432:12;;48457:17;48477:35;48457:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48531:4;:11;48546:1;48531:16;48523:64;;;;-1:-1:-1;;;48523:64:0;;21739:2:1;48523:64:0;;;21721:21:1;21778:2;21758:18;;;21751:30;21817:34;21797:18;;;21790:62;-1:-1:-1;;;21868:18:1;;;21861:33;21911:19;;48523:64:0;21537:399:1;48523:64:0;48605:31;48616:1;48633:2;48619:4;:11;:16;;;;:::i;:::-;48605:4;;:31;:10;:31::i;:::-;48598:38;48353:336;-1:-1:-1;;;48353:336:0:o;77548:436::-;77641:4;39653:10;77641:4;77724:25;39653:10;77741:7;77724:9;:25::i;:::-;77697:52;;77788:15;77768:16;:35;;77760:85;;;;-1:-1:-1;;;77760:85:0;;22276:2:1;77760:85:0;;;22258:21:1;22315:2;22295:18;;;22288:30;22354:34;22334:18;;;22327:62;-1:-1:-1;;;22405:18:1;;;22398:35;22450:19;;77760:85:0;22074:401:1;77760:85:0;77881:60;77890:5;77897:7;77925:15;77906:16;:34;77881:8;:60::i;66658:450::-;66945:14;66961:11;66992:108;67016:11;67029:10;67041:7;67050:8;;66992:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;66992:108:0;;;;;;;;;;;;;;;;;;;;;;67060:14;;-1:-1:-1;67076:7:0;;-1:-1:-1;66992:108:0;67085:14;;;;;;66992:108;;67085:14;;;;66992:108;;;;;;;;;-1:-1:-1;66992:23:0;;-1:-1:-1;;;66992:108:0:i;:::-;66985:115;;;;66658:450;;;;;;;;;;;;:::o;48064:281::-;40908:13;:11;:13::i;:::-;48236:14:::1;;48260:4;48219:47;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;48219:47:0;;::::1;::::0;;;;;;48181:35:::1;::::0;::::1;;::::0;;;:19:::1;48219:47;48181:35:::0;;;:85:::1;::::0;:35;:85:::1;:::i;:::-;;48282:55;48306:14;48322;;48282:55;;;;;;;;:::i;:::-;;;;;;;;48064:281:::0;;;:::o;91146:111::-;40908:13;:11;:13::i;:::-;91224:9:::1;:25:::0;;-1:-1:-1;;;;;91224:25:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;91224:25:0;;::::1;::::0;;;::::1;::::0;;91146:111::o;74629:193::-;74708:4;39653:10;74764:28;39653:10;74781:2;74785:6;74764:9;:28::i;92615:109::-;40908:13;:11;:13::i;:::-;92687::::1;:29:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;92687:29:0;;::::1;::::0;;;::::1;::::0;;92615:109::o;92732:95::-;40908:13;:11;:13::i;:::-;92799:20:::1;92811:7;92799:11;:20::i;48697:136::-:0;40908:13;:11;:13::i;:::-;48767:8:::1;:20:::0;;-1:-1:-1;;;;;;48767:20:0::1;-1:-1:-1::0;;;;;48767:20:0;::::1;::::0;;::::1;::::0;;;48803:22:::1;::::0;3021:51:1;;;48803:22:0::1;::::0;3009:2:1;2994:18;48803:22:0::1;;;;;;;48697:136:::0;:::o;92411:196::-;40908:13;:11;:13::i;:::-;92467:14:::1;::::0;;;::::1;;;92466:15;92458:46;;;::::0;-1:-1:-1;;;92458:46:0;;25165:2:1;92458:46:0::1;::::0;::::1;25147:21:1::0;25204:2;25184:18;;;25177:30;-1:-1:-1;;;25223:18:1;;;25216:48;25281:18;;92458:46:0::1;24963:342:1::0;92458:46:0::1;92515:14;:21:::0;;92560:12:::1;92547:10;:25:::0;-1:-1:-1;;92583:16:0;;;;;92411:196::o;91646:167::-;40908:13;:11;:13::i;:::-;-1:-1:-1;;;;;91762:29:0;;;::::1;;::::0;;;:19:::1;:29;::::0;;;;:43;;-1:-1:-1;;91762:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;91646:167::o;91821:149::-;40908:13;:11;:13::i;:::-;91926:15:::1;:36:::0;91821:149::o;47001:247::-;40908:13;:11;:13::i;:::-;47178:62:::1;::::0;-1:-1:-1;;;47178:62:0;;-1:-1:-1;;;;;47178:10:0::1;:20;::::0;::::1;::::0;:62:::1;::::0;47199:8;;47209;;47219:11;;47232:7;;;;47178:62:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52275:828:::0;52529:27;;;52507:19;52529:27;;;:14;:27;;;;;;:40;;;;52557:11;;;;52529:40;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52529:48:0;;;;;;;;;;;;-1:-1:-1;52529:48:0;52588:79;;;;-1:-1:-1;;;52588:79:0;;25998:2:1;52588:79:0;;;25980:21:1;26037:2;26017:18;;;26010:30;26076:34;26056:18;;;26049:62;-1:-1:-1;;;26127:18:1;;;26120:39;26176:19;;52588:79:0;25796:405:1;52588:79:0;52709:11;52696:8;;52686:19;;;;;;;:::i;:::-;;;;;;;;:34;52678:86;;;;-1:-1:-1;;;52678:86:0;;26408:2:1;52678:86:0;;;26390:21:1;26447:2;26427:18;;;26420:30;26486:34;26466:18;;;26459:62;-1:-1:-1;;;26537:18:1;;;26530:37;26584:19;;52678:86:0;26206:403:1;52678:86:0;52812:27;;;52871:1;52812:27;;;:14;:27;;;;;;:40;;;;52840:11;;;;52812:40;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52812:48:0;;;;;;;;;;;;:61;;;;52942:71;;;;;;;;;;;;;;;;;;;52970:11;;52983;;52942:71;;;;;;52983:11;52942:71;;52983:11;52942:71;;;;;;;;;-1:-1:-1;;52942:71:0;;;;;;;;;;;;;;;;;;;;;;52996:6;;-1:-1:-1;52942:71:0;-1:-1:-1;53004:8:0;;;;;;52942:71;;53004:8;;;;52942:71;;;;;;;;;-1:-1:-1;52942:27:0;;-1:-1:-1;;;52942:71:0:i;:::-;53029:66;53049:11;53062;;53075:6;53083:11;53029:66;;;;;;;;;;:::i;:::-;;;;;;;;52451:652;52275:828;;;;;;:::o;51627:413::-;39653:10;51890:4;51866:29;51858:92;;;;-1:-1:-1;;;51858:92:0;;27314:2:1;51858:92:0;;;27296:21:1;27353:2;27333:18;;;27326:30;27392:34;27372:18;;;27365:62;-1:-1:-1;;;27443:18:1;;;27436:48;27501:19;;51858:92:0;27112:414:1;51858:92:0;51961:71;51989:11;52002;;51961:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51961:71:0;;;;;;;;;;;;;;;;;;;;;;52015:6;;-1:-1:-1;51961:71:0;-1:-1:-1;52023:8:0;;;;;;51961:71;;52023:8;;;;51961:71;;;;;;;;;-1:-1:-1;51961:27:0;;-1:-1:-1;;;51961:71:0:i;74885:151::-;-1:-1:-1;;;;;75001:18:0;;;74974:7;75001:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;74885:151::o;48841:262::-;40908:13;:11;:13::i;:::-;48981:28:::1;::::0;;::::1;;::::0;;;:15:::1;:28;::::0;;;;;;;:41;;::::1;::::0;;;;;;;;;;:51;;;49048:47;;27729:38:1;;;27783:18;;27776:47;;;;27839:18;;;27832:34;;;49048:47:0::1;::::0;27717:2:1;27702:18;49048:47:0::1;27531:341:1::0;91265:373:0;40908:13;:11;:13::i;:::-;91443:2:::1;91422:17;:23;;:51;;;;;91471:2;91449:18;:24;;91422:51;91400:126;;;::::0;-1:-1:-1;;;91400:126:0;;28079:2:1;91400:126:0::1;::::0;::::1;28061:21:1::0;28118:2;28098:18;;;28091:30;28157:27;28137:18;;;28130:55;28202:18;;91400:126:0::1;27877:349:1::0;91400:126:0::1;91537:6;:26:::0;;;;91574:7:::1;:28:::0;91613:9:::1;:17:::0;;-1:-1:-1;;91613:17:0::1;::::0;;91265:373::o;47849:207::-;40908:13;:11;:13::i;:::-;47950:35:::1;::::0;::::1;;::::0;;;:19:::1;:35;::::0;;;;:43:::1;47988:5:::0;;47950:35;:43:::1;:::i;:::-;;48009:39;48026:14;48042:5;;48009:39;;;;;;;;:::i;41921:201::-:0;40908:13;:11;:13::i;:::-;-1:-1:-1;;;;;42010:22:0;::::1;42002:73;;;::::0;-1:-1:-1;;;42002:73:0;;29632:2:1;42002:73:0::1;::::0;::::1;29614:21:1::0;29671:2;29651:18;;;29644:30;29710:34;29690:18;;;29683:62;-1:-1:-1;;;29761:18:1;;;29754:36;29807:19;;42002:73:0::1;29430:402:1::0;42002:73:0::1;42086:28;42105:8;42086:18;:28::i;46687:254::-:0;46865:68;;-1:-1:-1;;;46865:68:0;;30094:6:1;30082:19;;;46865:68:0;;;30064:38:1;30138:19;;30118:18;;;30111:47;46914:4:0;30174:18:1;;;30167:60;30243:18;;;30236:34;;;46833:12:0;;46865:10;-1:-1:-1;;;;;46865:20:0;;;;30036:19:1;;46865:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46865:68:0;;;;;;;;;;;;:::i;:::-;46858:75;46687:254;-1:-1:-1;;;;;46687:254:0:o;41187:132::-;41068:7;41095:6;-1:-1:-1;;;;;41095:6:0;39653:10;41251:23;41243:68;;;;-1:-1:-1;;;41243:68:0;;31173:2:1;41243:68:0;;;31155:21:1;;;31192:18;;;31185:30;31251:34;31231:18;;;31224:62;31303:18;;41243:68:0;30971:356:1;81541:346:0;-1:-1:-1;;;;;81643:19:0;;81635:68;;;;-1:-1:-1;;;81635:68:0;;31534:2:1;81635:68:0;;;31516:21:1;31573:2;31553:18;;;31546:30;31612:34;31592:18;;;31585:62;-1:-1:-1;;;31663:18:1;;;31656:34;31707:19;;81635:68:0;31332:400:1;81635:68:0;-1:-1:-1;;;;;81722:21:0;;81714:68;;;;-1:-1:-1;;;81714:68:0;;31939:2:1;81714:68:0;;;31921:21:1;31978:2;31958:18;;;31951:30;32017:34;31997:18;;;31990:62;-1:-1:-1;;;32068:18:1;;;32061:32;32110:19;;81714:68:0;31737:398:1;81714:68:0;-1:-1:-1;;;;;81795:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;81847:32;;2326:25:1;;;81847:32:0;;2299:18:1;81847:32:0;;;;;;;81541:346;;;:::o;82178:419::-;82279:24;82306:25;82316:5;82323:7;82306:9;:25::i;:::-;82279:52;;-1:-1:-1;;82346:16:0;:37;82342:248;;82428:6;82408:16;:26;;82400:68;;;;-1:-1:-1;;;82400:68:0;;32342:2:1;82400:68:0;;;32324:21:1;32381:2;32361:18;;;32354:30;32420:31;32400:18;;;32393:59;32469:18;;82400:68:0;32140:353:1;82400:68:0;82512:51;82521:5;82528:7;82556:6;82537:16;:25;82512:8;:51::i;:::-;82268:329;82178:419;;;:::o;88113:1780::-;88254:1;88245:6;:10;88237:61;;;;-1:-1:-1;;;88237:61:0;;32700:2:1;88237:61:0;;;32682:21:1;32739:2;32719:18;;;32712:30;32778:34;32758:18;;;32751:62;-1:-1:-1;;;32829:18:1;;;32822:36;32875:19;;88237:61:0;32498:402:1;88237:61:0;88316:14;;;;;;;88311:115;;41068:7;41095:6;-1:-1:-1;;;;;88355:15:0;;;41095:6;;88355:15;;:32;;-1:-1:-1;41068:7:0;41095:6;-1:-1:-1;;;;;88374:13:0;;;41095:6;;88374:13;88355:32;88347:67;;;;-1:-1:-1;;;88347:67:0;;33107:2:1;88347:67:0;;;33089:21:1;33146:2;33126:18;;;33119:30;-1:-1:-1;;;33165:18:1;;;33158:52;33227:18;;88347:67:0;32905:346:1;88347:67:0;88472:9;;88438:17;;88472:9;;88468:64;;;88498:22;88507:12;88498:8;:22::i;:::-;88556:13;-1:-1:-1;;;;;88548:21:0;:4;-1:-1:-1;;;;;88548:21:0;;:49;;;;-1:-1:-1;;;;;;88574:23:0;;;;;;:19;:23;;;;;;;;88573:24;88548:49;88544:395;;;88666:15;;88656:6;88640:13;88650:2;-1:-1:-1;;;;;74397:18:0;74370:7;74397:18;;;:9;:18;;;;;;;74296:127;88640:13;:22;;;;:::i;:::-;:41;;88614:123;;;;-1:-1:-1;;;88614:123:0;;33458:2:1;88614:123:0;;;33440:21:1;33497:2;33477:18;;;33470:30;-1:-1:-1;;;33516:18:1;;;33509:50;33576:18;;88614:123:0;33256:344:1;88614:123:0;88770:11;;88760:6;:21;;88752:50;;;;-1:-1:-1;;;88752:50:0;;33807:2:1;88752:50:0;;;33789:21:1;33846:2;33826:18;;;33819:30;-1:-1:-1;;;33865:18:1;;;33858:46;33921:18;;88752:50:0;33605:340:1;88752:50:0;88821:12;;;;;;;88817:88;;;88886:3;88876:6;;88867;:15;;;;:::i;:::-;88866:23;;;;:::i;:::-;88854:35;;88817:88;88921:4;:6;;;:4;:6;;;:::i;:::-;;;;;;88544:395;88961:13;-1:-1:-1;;;;;88955:19:0;:2;-1:-1:-1;;;;;88955:19:0;;:49;;;;-1:-1:-1;;;;;;88979:25:0;;;;;;:19;:25;;;;;;;;88978:26;88955:49;88951:235;;;89039:11;;89029:6;:21;;89021:50;;;;-1:-1:-1;;;89021:50:0;;33807:2:1;89021:50:0;;;33789:21:1;33846:2;33826:18;;;33819:30;-1:-1:-1;;;33865:18:1;;;33858:46;33921:18;;89021:50:0;33605:340:1;89021:50:0;89090:12;;;;;;;89086:89;;;89156:3;89145:7;;89136:6;:16;;;;:::i;:::-;89135:24;;;;:::i;:::-;89123:36;;89086:89;89247:4;89198:28;74397:18;;;:9;:18;;;;;;89317:20;;89293:44;;;;;;;89368:49;;-1:-1:-1;89405:12:0;;;;;;;89404:13;89368:49;:87;;;;;89442:13;-1:-1:-1;;;;;89434:21:0;:4;-1:-1:-1;;;;;89434:21:0;;;89368:87;:130;;;;-1:-1:-1;;;;;;89473:25:0;;;;;;:19;:25;;;;;;;;89472:26;89368:130;:169;;;;;89522:15;;89515:4;;:22;89368:169;89350:259;;;89564:33;89576:20;;89564:11;:33::i;:::-;89625:13;;89621:265;;89655:18;89676;89685:9;89676:6;:18;:::i;:::-;89655:39;;89709:47;89725:4;89739;89746:9;89709:15;:47::i;:::-;89771:37;89787:4;89793:2;89797:10;89771:15;:37::i;:::-;89640:180;89621:265;;;89841:33;89857:4;89863:2;89867:6;89841:15;:33::i;55611:471::-;55817:14;55833:11;55901:20;55924:47;55943:10;55955:15;55962:7;55955:6;:15::i;:::-;62333:48;;;53451:1;62333:48;;;40589:49:1;40654:11;;;40647:27;;;;40730:3;40708:16;;;;-1:-1:-1;;;;;;40704:51:1;40690:12;;;40683:73;62333:48:0;;;;;;;;;40772:12:1;;;;62333:48:0;;;62204:185;55924:47;55989:85;;-1:-1:-1;;;55989:85:0;;55901:70;;-1:-1:-1;;;;;;55989:10:0;:23;;;;:85;;56013:11;;56034:4;;55901:70;;56050:7;;56059:14;;55989:85;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55982:92;;;;;55611:471;;;;;;;;:::o;50661:575::-;50860:12;50874:19;50897:209;50945:9;50969:3;51010:40;;;51052:11;51065;51078:6;51086:8;50987:108;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;50987:108:0;;;;;;;;;;;;;;-1:-1:-1;;;;;50987:108:0;-1:-1:-1;;;;;;50987:108:0;;;;;;;;;;50905:4;;50897:209;;:33;:209::i;:::-;50859:247;;;;51122:7;51117:112;;51146:71;51166:11;51179;51192:6;51200:8;51210:6;51146:19;:71::i;57263:843::-;57532:11;57556:66;57571:11;57532;57593:14;57532:11;57556:14;:66::i;:::-;57648:20;57660:7;57648:11;:20::i;:::-;-1:-1:-1;57635:33:0;-1:-1:-1;57688:50:0;57699:5;57706:11;57719:10;57635:33;57688:10;:50::i;:::-;57679:59;;57806:1;57797:6;:10;57789:51;;;;-1:-1:-1;;;57789:51:0;;36279:2:1;57789:51:0;;;36261:21:1;36318:2;36298:18;;;36291:30;36357;36337:18;;;36330:58;36405:18;;57789:51:0;36077:352:1;57789:51:0;57853:22;57878:46;57897:10;57909:14;57916:6;57909;:14::i;57878:46::-;57853:71;;57935:94;57943:11;57956:9;57967:14;57983:18;58003:14;58019:9;57935:7;:94::i;:::-;58079:10;58072:5;-1:-1:-1;;;;;58047:51:0;58059:11;58047:51;;;58091:6;58047:51;;;;2326:25:1;;2314:2;2299:18;;2180:177;58047:51:0;;;;;;;;57545:561;57263:843;;;;;;;;;:::o;42282:191::-;42356:16;42375:6;;-1:-1:-1;;;;;42392:17:0;;;-1:-1:-1;;;;;;42392:17:0;;;;;;42425:40;;42375:6;;;;;;;42425:40;;42356:16;42425:40;42345:128;42282:191;:::o;58579:998::-;58919:11;58943:77;58958:11;53500:1;58989:14;-1:-1:-1;;;;;58943:77:0;;:14;:77::i;:::-;59046:20;59058:7;59046:11;:20::i;:::-;-1:-1:-1;59033:33:0;-1:-1:-1;59086:50:0;59097:5;59104:11;59117:10;59033:33;59086:10;:50::i;:::-;59077:59;;59164:1;59155:6;:10;59147:51;;;;-1:-1:-1;;;59147:51:0;;36279:2:1;59147:51:0;;;36261:21:1;36318:2;36298:18;;;36291:30;36357;36337:18;;;36330:58;36405:18;;59147:51:0;36077:352:1;59147:51:0;59279:22;59304:91;59330:10;59342;59354:14;59361:6;59354;:14::i;:::-;59370:8;59380:14;59304:25;:91::i;:::-;59279:116;;59406:94;59414:11;59427:9;59438:14;59454:18;59474:14;59490:9;59406:7;:94::i;:::-;59550:10;59543:5;-1:-1:-1;;;;;59518:51:0;59530:11;59518:51;;;59562:6;59518:51;;;;2326:25:1;;2314:2;2299:18;;2180:177;59518:51:0;;;;;;;;58932:645;58579:998;;;;;;;;;;;:::o;85735:425::-;85869:4;39653:10;86019:4;-1:-1:-1;;;;;86002:22:0;;;;;;:42;;;86037:7;-1:-1:-1;;;;;86028:16:0;:5;-1:-1:-1;;;;;86028:16:0;;;86002:42;85998:88;;;86046:40;86062:5;86069:7;86078;86046:15;:40::i;:::-;86097:30;86107:5;86114:3;86119:7;86097:9;:30::i;:::-;-1:-1:-1;86145:7:0;;85735:425;-1:-1:-1;;;85735:425:0:o;20685:2833::-;20805:12;20854:7;20838:12;20854:7;20848:2;20838:12;:::i;:::-;:23;;20830:50;;;;-1:-1:-1;;;20830:50:0;;36636:2:1;20830:50:0;;;36618:21:1;36675:2;36655:18;;;36648:30;-1:-1:-1;;;36694:18:1;;;36687:44;36748:18;;20830:50:0;36434:338:1;20830:50:0;20916:16;20925:7;20916:6;:16;:::i;:::-;20899:6;:13;:33;;20891:63;;;;-1:-1:-1;;;20891:63:0;;36979:2:1;20891:63:0;;;36961:21:1;37018:2;36998:18;;;36991:30;-1:-1:-1;;;37037:18:1;;;37030:47;37094:18;;20891:63:0;36777:341:1;20891:63:0;20967:22;21033:15;;21062:2005;;;;23211:4;23205:11;23192:24;;23400:1;23389:9;23382:20;23450:4;23439:9;23435:20;23429:4;23422:34;21026:2445;;21062:2005;21247:4;21241:11;21228:24;;21916:2;21907:7;21903:16;22304:9;22297:17;22291:4;22287:28;22275:9;22264;22260:25;22256:60;22353:7;22349:2;22345:16;22610:6;22596:9;22589:17;22583:4;22579:28;22567:9;22559:6;22555:22;22551:57;22547:70;22381:434;22644:3;22640:2;22637:11;22381:434;;;22786:9;;22775:21;;22686:4;22678:13;;;;22719;22381:434;;;-1:-1:-1;;22835:26:0;;;23047:2;23030:11;-1:-1:-1;;23026:25:0;23020:4;23013:39;-1:-1:-1;21026:2445:0;-1:-1:-1;23501:9:0;20685:2833;-1:-1:-1;;;;20685:2833:0:o;56090:590::-;56367:14;56383:11;56454:20;56477:92;56503:10;56515;56527:15;56534:7;56527:6;:15::i;56477:92::-;56587:85;;-1:-1:-1;;;56587:85:0;;56454:115;;-1:-1:-1;;;;;;56587:10:0;:23;;;;:85;;56611:11;;56632:4;;56454:115;;56648:7;;56657:14;;56587:85;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56580:92;;;;;56090:590;;;;;;;;;;:::o;89901:673::-;86950:12;:19;;-1:-1:-1;;86950:19:0;;;;;90069:16:::1;::::0;;90083:1:::1;90069:16:::0;;;;;::::1;::::0;;-1:-1:-1;;90069:16:0::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;90069:16:0::1;90045:40;;90114:4;90096;90101:1;90096:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1::0;;;;;90096:23:0::1;;;-1:-1:-1::0;;;;;90096:23:0::1;;;::::0;::::1;90140:15;-1:-1:-1::0;;;;;90140:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;90130:4;90135:1;90130:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1::0;;;;;90130:32:0::1;;;-1:-1:-1::0;;;;;90130:32:0::1;;;::::0;::::1;90175:122;90206:4;90234:15;90265:21;90175:8;:122::i;:::-;90516:9;::::0;90336:230:::1;::::0;-1:-1:-1;;;90336:230:0;;-1:-1:-1;;;;;90336:15:0::1;:66:::0;::::1;::::0;::::1;::::0;:230:::1;::::0;90417:21;;90453:1:::1;::::0;90497:4;;90516:9;;;::::1;::::0;;::::1;::::0;90540:15:::1;::::0;90336:230:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;86992:12:0;:20;;-1:-1:-1;;86992:20:0;;;-1:-1:-1;;;;89901:673:0:o;56688:567::-;56889:16;56908:19;:8;56889:16;56908;:19::i;:::-;56889:38;-1:-1:-1;56944:21:0;;;56940:308;;56982:52;56991:11;57004;57017:6;57025:8;56982;:52::i;:::-;56940:308;;;-1:-1:-1;;57056:30:0;;;;57052:196;;57103:59;57119:11;57132;57145:6;57153:8;57103:15;:59::i;57052:196::-;57195:41;;-1:-1:-1;;;57195:41:0;;38677:2:1;57195:41:0;;;38659:21:1;38716:2;38696:18;;;38689:30;38755:33;38735:18;;;38728:61;38806:18;;57195:41:0;38475:355:1;78454:806:0;-1:-1:-1;;;;;78551:18:0;;78543:68;;;;-1:-1:-1;;;78543:68:0;;39037:2:1;78543:68:0;;;39019:21:1;39076:2;39056:18;;;39049:30;39115:34;39095:18;;;39088:62;-1:-1:-1;;;39166:18:1;;;39159:35;39211:19;;78543:68:0;38835:401:1;78543:68:0;-1:-1:-1;;;;;78630:16:0;;78622:64;;;;-1:-1:-1;;;78622:64:0;;39443:2:1;78622:64:0;;;39425:21:1;39482:2;39462:18;;;39455:30;39521:34;39501:18;;;39494:62;-1:-1:-1;;;39572:18:1;;;39565:33;39615:19;;78622:64:0;39241:399:1;78622:64:0;-1:-1:-1;;;;;78772:15:0;;78750:19;78772:15;;;:9;:15;;;;;;78806:21;;;;78798:72;;;;-1:-1:-1;;;78798:72:0;;39847:2:1;78798:72:0;;;39829:21:1;39886:2;39866:18;;;39859:30;39925:34;39905:18;;;39898:62;-1:-1:-1;;;39976:18:1;;;39969:36;40022:19;;78798:72:0;39645:402:1;78798:72:0;-1:-1:-1;;;;;78906:15:0;;;;;;;:9;:15;;;;;;78924:20;;;78906:38;;79124:13;;;;;;;;;;:23;;;;;;79176:26;;;;;;78938:6;2326:25:1;;2314:2;2299:18;;2180:177;79176:26:0;;;;;;;;79215:37;83197:91;61636:241;61697:6;;61732:22;86254:9;61732:7;:22;:::i;:::-;61716:38;-1:-1:-1;;;;;;61773:28:0;;;61765:70;;;;-1:-1:-1;;;61765:70:0;;40254:2:1;61765:70:0;;;40236:21:1;40293:2;40273:18;;;40266:30;40332:31;40312:18;;;40305:59;40381:18;;61765:70:0;40052:353:1;6736:1309:0;6895:4;6901:12;6963;6986:13;7010:24;7047:8;7037:19;;-1:-1:-1;;;;;7037:19:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7037:19:0;;7010:46;;7566:1;7536;7498:9;7492:16;7459:4;7448:9;7444:20;7409:1;7370:7;7340:4;7317:275;7305:287;;7661:16;7650:27;;7706:8;7697:7;7694:21;7691:78;;;7746:8;7735:19;;7691:78;7856:7;7843:11;7836:28;7978:7;7975:1;7968:4;7955:11;7951:22;7936:50;8015:8;;;;-1:-1:-1;6736:1309:0;-1:-1:-1;;;;;;6736:1309:0:o;51244:375::-;51520:8;51510:19;;;;;;51459:14;:27;51474:11;51459:27;;;;;;;;;;;;;;;51487:11;51459:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51459:48:0;;;;;;;;;:70;;;;51545:66;;;;51559:11;;51572;;51500:6;;51593:8;;51603:7;;51545:66;:::i;:::-;;;;;;;;51244:375;;;;;:::o;45406:475::-;45585:21;45609:28;45622:14;45609:12;:28::i;:::-;45667;;;;45648:16;45667:28;;;:15;:28;;;;;;;;:35;;;;;;;;;;45585:52;;-1:-1:-1;45721:15:0;45713:60;;;;-1:-1:-1;;;45713:60:0;;42131:2:1;45713:60:0;;;42113:21:1;;;42150:18;;;42143:30;42209:34;42189:18;;;42182:62;42261:18;;45713:60:0;41929:356:1;45713:60:0;45812:23;45826:9;45812:11;:23;:::i;:::-;45792:16;:43;;45784:89;;;;-1:-1:-1;;;45784:89:0;;42492:2:1;45784:89:0;;;42474:21:1;42531:2;42511:18;;;42504:30;42570:34;42550:18;;;42543:62;-1:-1:-1;;;42621:18:1;;;42614:31;42662:19;;45784:89:0;42290:397:1;62014:182:0;62080:16;;62127:22;86254:9;62127:7;:22;:::i;:::-;62120:29;-1:-1:-1;62174:14:0;62120:29;62174:7;:14;:::i;:::-;62160:28;;62014:182;;;:::o;85184:329::-;85328:4;39653:10;-1:-1:-1;;;;;85390:16:0;;;;85386:62;;85408:40;85424:5;85431:7;85440;85408:15;:40::i;:::-;85459:21;85465:5;85472:7;85459:5;:21::i;:::-;-1:-1:-1;85498:7:0;;85184:329;-1:-1:-1;;;;85184:329:0:o;44778:620::-;45062:32;;;45033:26;45062:32;;;:19;:32;;;;;45033:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45113:13;:20;45137:1;45113:25;45105:92;;;;-1:-1:-1;;;45105:92:0;;43011:2:1;45105:92:0;;;42993:21:1;43050:2;43030:18;;;43023:30;43089:34;43069:18;;;43062:62;-1:-1:-1;;;43140:18:1;;;43133:52;43202:19;;45105:92:0;42809:418:1;45105:92:0;45208:47;45226:11;45239:8;:15;45208:17;:47::i;:::-;45266:124;;-1:-1:-1;;;45266:124:0;;-1:-1:-1;;;;;45266:10:0;:15;;;;45289:10;;45266:124;;45301:11;;45314:13;;45329:8;;45339:14;;45355:18;;45375:14;;45266:124;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45022:376;44778:620;;;;;;:::o;62751:366::-;62968:12;53500:1;63035:10;63047:9;-1:-1:-1;;;;;63905:23:0;;63084:14;63100:8;63000:109;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62993:116;;62751:366;;;;;;;:::o;23894:307::-;23968:5;24011:10;:6;24020:1;24011:10;:::i;:::-;23994:6;:13;:27;;23986:59;;;;-1:-1:-1;;;23986:59:0;;44905:2:1;23986:59:0;;;44887:21:1;44944:2;44924:18;;;44917:30;-1:-1:-1;;;44963:18:1;;;44956:49;45022:18;;23986:59:0;44703:343:1;23986:59:0;-1:-1:-1;24125:29:0;24141:3;24125:29;24119:36;;23894:307::o;58114:457::-;58269:10;58281:15;58300:28;58319:8;58300:18;:28::i;:::-;58268:60;;-1:-1:-1;58268:60:0;-1:-1:-1;;;;;;58343:16:0;;58339:69;;58389:6;58376:20;;58339:69;58420:11;58434:16;58441:8;58434:6;:16::i;:::-;58420:30;;58470:34;58480:11;58493:2;58497:6;58470:9;:34::i;:::-;58461:43;;58552:2;-1:-1:-1;;;;;58522:41:0;58539:11;58522:41;;;58556:6;58522:41;;;;2326:25:1;;2314:2;2299:18;;2180:177;58522:41:0;;;;;;;;58257:314;;;58114:457;;;;:::o;59585:1917::-;59766:12;59780:10;59792:15;59809:27;59838:17;59859:35;59885:8;59859:25;:35::i;:::-;59765:129;;;;;;;;;;59907:13;59923:15;:28;59939:11;59923:28;;;;;;;;;;;;;;;59952:11;59923:41;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;59923:49:0;;;;;;;;;;;;;;-1:-1:-1;59997:16:0;60004:8;59997:6;:16::i;:::-;59983:30;;60144:8;60139:167;;60178:45;60188:11;60209:4;60216:6;60178:9;:45::i;:::-;60238:28;;;;;;;:15;:28;;;;;;;:41;;60169:54;;-1:-1:-1;60290:4:0;;60238:41;;60267:11;;60238:41;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60238:49:0;;;;;;;;;;:56;;-1:-1:-1;;60238:56:0;;;;;;;;;;60139:167;-1:-1:-1;;;;;61596:20:0;;;60318:97;;60360:22;;-1:-1:-1;;;;;3039:32:1;;3021:51;;60360:22:0;;3009:2:1;2994:18;60360:22:0;;;;;;;60397:7;;;;;;;;;60318:97;60489:11;60537;60574:6;60614:8;60649:4;60678:2;60706:6;60754:14;60469:17;60839:8;:33;;60862:10;-1:-1:-1;;;;;60839:33:0;;;;60850:9;60839:33;60828:44;;60884:12;60898:19;60921:233;60969:9;60993:3;61034:34;;;61070:10;61082;61094:5;61101;61108:3;61113:7;61122:15;61139:3;61011:132;;;;;;;;;;;;;;;:::i;60921:233::-;60883:271;;;;61171:7;61167:328;;;61210:18;;;;;;61248:62;;;;;;;;;;61286:10;;61298:5;;61210:18;;61248:62;:::i;:::-;;;;;;;;61180:142;61167:328;;;61416:67;61436:10;61448;61460:5;61467:7;61476:6;61416:19;:67::i;:::-;59754:1748;;;;;;;;;;;;;;;;;;59585:1917;;;;:::o;83197:91::-;;;;:::o;45889:277::-;45971:13;46030:2;46005:14;:21;:27;;45997:74;;;;-1:-1:-1;;;45997:74:0;;46517:2:1;45997:74:0;;;46499:21:1;46556:2;46536:18;;;46529:30;46595:34;46575:18;;;46568:62;-1:-1:-1;;;46646:18:1;;;46639:32;46688:19;;45997:74:0;46315:398:1;45997:74:0;-1:-1:-1;46144:2:0;46124:23;46118:30;;45889:277::o;80428:675::-;-1:-1:-1;;;;;80512:21:0;;80504:67;;;;-1:-1:-1;;;80504:67:0;;46920:2:1;80504:67:0;;;46902:21:1;46959:2;46939:18;;;46932:30;46998:34;46978:18;;;46971:62;-1:-1:-1;;;47049:18:1;;;47042:31;47090:19;;80504:67:0;46718:397:1;80504:67:0;-1:-1:-1;;;;;80671:18:0;;80646:22;80671:18;;;:9;:18;;;;;;80708:24;;;;80700:71;;;;-1:-1:-1;;;80700:71:0;;47322:2:1;80700:71:0;;;47304:21:1;47361:2;47341:18;;;47334:30;47400:34;47380:18;;;47373:62;-1:-1:-1;;;47451:18:1;;;47444:32;47493:19;;80700:71:0;47120:398:1;80700:71:0;-1:-1:-1;;;;;80807:18:0;;;;;;:9;:18;;;;;;;;80828:23;;;80807:44;;80946:12;:22;;;;;;;80997:37;2326:25:1;;;80807:18:0;;;80997:37;;2299:18:1;80997:37:0;;;;;;;83197:91;;;:::o;46174:408::-;46297:35;;;46273:21;46297:35;;;:22;:35;;;;;;;46347:21;;;46343:138;;-1:-1:-1;42913:5:0;46343:138;46515:16;46499:12;:32;;46491:83;;;;-1:-1:-1;;;46491:83:0;;47725:2:1;46491:83:0;;;47707:21:1;47764:2;47744:18;;;47737:30;47803:34;47783:18;;;47776:62;-1:-1:-1;;;47854:18:1;;;47847:36;47900:19;;46491:83:0;47523:402:1;62397:346:0;62479:10;;;62527:19;:8;62479:10;62527:16;:19::i;:::-;:30;;;:55;;;;;62561:8;:15;62580:2;62561:21;62527:55;62519:95;;;;-1:-1:-1;;;62519:95:0;;48132:2:1;62519:95:0;;;48114:21:1;48171:2;48151:18;;;48144:30;48210:29;48190:18;;;48183:57;48257:18;;62519:95:0;47930:351:1;62519:95:0;62632:22;:8;62651:2;62632:18;:22::i;:::-;62627:27;-1:-1:-1;62714:21:0;:8;62732:2;62714:17;:21::i;:::-;62703:32;;62397:346;;;:::o;61885:121::-;61950:4;61974:24;86254:9;-1:-1:-1;;;;;61974:24:0;;;:::i;85521:206::-;85651:4;85668:26;85674:10;85686:7;85668:5;:26::i;:::-;-1:-1:-1;85712:7:0;85521:206;-1:-1:-1;;85521:206:0:o;63125:661::-;63264:12;;;63346:20;63264:12;53500:1;63437:19;:8;63264:12;63437:16;:19::i;:::-;:39;;;63429:79;;;;-1:-1:-1;;;63429:79:0;;48132:2:1;63429:79:0;;;48114:21:1;48171:2;48151:18;;;48144:30;48210:29;48190:18;;;48183:57;48257:18;;63429:79:0;47930:351:1;63429:79:0;63526:22;:8;63545:2;63526:18;:22::i;:::-;63521:27;-1:-1:-1;63608:21:0;:8;63626:2;63608:17;:21::i;:::-;63597:32;-1:-1:-1;63647:22:0;:8;63666:2;63647:18;:22::i;:::-;63640:29;-1:-1:-1;63696:21:0;:8;63714:2;63696:17;:21::i;:::-;63680:37;;63738:40;63753:2;63775;63757:8;:15;:20;;;;:::i;:::-;63738:8;;:40;:14;:40::i;:::-;63728:50;;63125:661;;;;;;;:::o;23526:360::-;23602:7;23647:11;:6;23656:2;23647:11;:::i;:::-;23630:6;:13;:28;;23622:62;;;;-1:-1:-1;;;23622:62:0;;48488:2:1;23622:62:0;;;48470:21:1;48527:2;48507:18;;;48500:30;-1:-1:-1;;;48546:18:1;;;48539:51;48607:18;;23622:62:0;48286:345:1;23622:62:0;-1:-1:-1;23776:30:0;23792:4;23776:30;23770:37;-1:-1:-1;;;23766:71:0;;;23526:360::o;24847:311::-;24922:6;24966:10;:6;24975:1;24966:10;:::i;:::-;24949:6;:13;:27;;24941:60;;;;-1:-1:-1;;;24941:60:0;;48838:2:1;24941:60:0;;;48820:21:1;48877:2;48857:18;;;48850:30;-1:-1:-1;;;48896:18:1;;;48889:50;48956:18;;24941:60:0;48636:344:1;24941:60:0;-1:-1:-1;25082:29:0;25098:3;25082:29;25076:36;;24847:311::o;79547:548::-;-1:-1:-1;;;;;79631:21:0;;79623:65;;;;-1:-1:-1;;;79623:65:0;;49187:2:1;79623:65:0;;;49169:21:1;49226:2;49206:18;;;49199:30;49265:33;49245:18;;;49238:61;49316:18;;79623:65:0;48985:355:1;79623:65:0;79779:6;79763:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;79934:18:0;;;;;;:9;:18;;;;;;;;:28;;;;;;79989:37;2326:25:1;;;79989:37:0;;2299:18:1;79989:37:0;;;;;;;79547:548;;:::o;26130:326::-;26206:7;26251:11;:6;26260:2;26251:11;:::i;:::-;26234:6;:13;:28;;26226:62;;;;-1:-1:-1;;;26226:62:0;;49547:2:1;26226:62:0;;;49529:21:1;49586:2;49566:18;;;49559:30;-1:-1:-1;;;49605:18:1;;;49598:51;49666:18;;26226:62:0;49345:345:1;26226:62:0;-1:-1:-1;26376:30:0;26392:4;26376:30;26370:37;;26130:326::o;14:286:1:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:1;;209:43;;199:71;;266:1;263;256:12;497:289;539:3;577:5;571:12;604:6;599:3;592:19;660:6;653:4;646:5;642:16;635:4;630:3;626:14;620:47;712:1;705:4;696:6;691:3;687:16;683:27;676:38;775:4;768:2;764:7;759:2;751:6;747:15;743:29;738:3;734:39;730:50;723:57;;;497:289;;;;:::o;791:220::-;940:2;929:9;922:21;903:4;960:45;1001:2;990:9;986:18;978:6;960:45;:::i;1016:159::-;1083:20;;1143:6;1132:18;;1122:29;;1112:57;;1165:1;1162;1155:12;1112:57;1016:159;;;:::o;1180:184::-;1238:6;1291:2;1279:9;1270:7;1266:23;1262:32;1259:52;;;1307:1;1304;1297:12;1259:52;1330:28;1348:9;1330:28;:::i;1369:131::-;-1:-1:-1;;;;;1444:31:1;;1434:42;;1424:70;;1490:1;1487;1480:12;1505:367;1573:6;1581;1634:2;1622:9;1613:7;1609:23;1605:32;1602:52;;;1650:1;1647;1640:12;1602:52;1689:9;1676:23;1708:31;1733:5;1708:31;:::i;:::-;1758:5;1836:2;1821:18;;;;1808:32;;-1:-1:-1;;;1505:367:1:o;1877:298::-;1944:6;1952;2005:2;1993:9;1984:7;1980:23;1976:32;1973:52;;;2021:1;2018;2011:12;1973:52;2044:28;2062:9;2044:28;:::i;2362:508::-;2439:6;2447;2455;2508:2;2496:9;2487:7;2483:23;2479:32;2476:52;;;2524:1;2521;2514:12;2476:52;2563:9;2550:23;2582:31;2607:5;2582:31;:::i;:::-;2632:5;-1:-1:-1;2689:2:1;2674:18;;2661:32;2702:33;2661:32;2702:33;:::i;:::-;2362:508;;2754:7;;-1:-1:-1;;;2834:2:1;2819:18;;;;2806:32;;2362:508::o;3083:160::-;3148:20;;3204:13;;3197:21;3187:32;;3177:60;;3233:1;3230;3223:12;3248:180;3304:6;3357:2;3345:9;3336:7;3332:23;3328:32;3325:52;;;3373:1;3370;3363:12;3325:52;3396:26;3412:9;3396:26;:::i;3622:347::-;3673:8;3683:6;3737:3;3730:4;3722:6;3718:17;3714:27;3704:55;;3755:1;3752;3745:12;3704:55;-1:-1:-1;3778:20:1;;-1:-1:-1;;;;;3810:30:1;;3807:50;;;3853:1;3850;3843:12;3807:50;3890:4;3882:6;3878:17;3866:29;;3942:3;3935:4;3926:6;3918;3914:19;3910:30;3907:39;3904:59;;;3959:1;3956;3949:12;3904:59;3622:347;;;;;:::o;3974:785::-;4076:6;4084;4092;4100;4108;4116;4169:3;4157:9;4148:7;4144:23;4140:33;4137:53;;;4186:1;4183;4176:12;4137:53;4209:28;4227:9;4209:28;:::i;:::-;4199:38;-1:-1:-1;4306:2:1;4291:18;;4278:32;;-1:-1:-1;4407:2:1;4392:18;;4379:32;;-1:-1:-1;4456:35:1;4487:2;4472:18;;4456:35;:::i;:::-;4446:45;;4542:3;4531:9;4527:19;4514:33;-1:-1:-1;;;;;4562:6:1;4559:30;4556:50;;;4602:1;4599;4592:12;4556:50;4641:58;4691:7;4682:6;4671:9;4667:22;4641:58;:::i;:::-;3974:785;;;;-1:-1:-1;3974:785:1;;-1:-1:-1;3974:785:1;;4718:8;;3974:785;-1:-1:-1;;;3974:785:1:o;5017:226::-;5076:6;5129:2;5117:9;5108:7;5104:23;5100:32;5097:52;;;5145:1;5142;5135:12;5097:52;-1:-1:-1;5190:23:1;;5017:226;-1:-1:-1;5017:226:1:o;5248:481::-;5326:6;5334;5342;5395:2;5383:9;5374:7;5370:23;5366:32;5363:52;;;5411:1;5408;5401:12;5363:52;5434:28;5452:9;5434:28;:::i;:::-;5424:38;;5513:2;5502:9;5498:18;5485:32;-1:-1:-1;;;;;5532:6:1;5529:30;5526:50;;;5572:1;5569;5562:12;5526:50;5611:58;5661:7;5652:6;5641:9;5637:22;5611:58;:::i;:::-;5248:481;;5688:8;;-1:-1:-1;5585:84:1;;-1:-1:-1;;;;5248:481:1:o;5734:127::-;5795:10;5790:3;5786:20;5783:1;5776:31;5826:4;5823:1;5816:15;5850:4;5847:1;5840:15;5866:275;5937:2;5931:9;6002:2;5983:13;;-1:-1:-1;;5979:27:1;5967:40;;-1:-1:-1;;;;;6022:34:1;;6058:22;;;6019:62;6016:88;;;6084:18;;:::i;:::-;6120:2;6113:22;5866:275;;-1:-1:-1;5866:275:1:o;6146:186::-;6194:4;-1:-1:-1;;;;;6219:6:1;6216:30;6213:56;;;6249:18;;:::i;:::-;-1:-1:-1;6315:2:1;6294:15;-1:-1:-1;;6290:29:1;6321:4;6286:40;;6146:186::o;6337:171::-;6404:20;;-1:-1:-1;;;;;6453:30:1;;6443:41;;6433:69;;6498:1;6495;6488:12;6513:839;6597:6;6605;6613;6666:2;6654:9;6645:7;6641:23;6637:32;6634:52;;;6682:1;6679;6672:12;6634:52;6705:28;6723:9;6705:28;:::i;:::-;6695:38;;6784:2;6773:9;6769:18;6756:32;-1:-1:-1;;;;;6803:6:1;6800:30;6797:50;;;6843:1;6840;6833:12;6797:50;6866:22;;6919:4;6911:13;;6907:27;-1:-1:-1;6897:55:1;;6948:1;6945;6938:12;6897:55;6988:2;6975:16;7013:52;7029:35;7057:6;7029:35;:::i;:::-;7013:52;:::i;:::-;7088:6;7081:5;7074:21;7136:7;7131:2;7122:6;7118:2;7114:15;7110:24;7107:37;7104:57;;;7157:1;7154;7147:12;7104:57;7212:6;7207:2;7203;7199:11;7194:2;7187:5;7183:14;7170:49;7264:1;7259:2;7250:6;7243:5;7239:18;7235:27;7228:38;7285:5;7275:15;;;;;7309:37;7342:2;7331:9;7327:18;7309:37;:::i;:::-;7299:47;;6513:839;;;;;:::o;7539:857::-;7645:6;7653;7661;7669;7677;7685;7738:3;7726:9;7717:7;7713:23;7709:33;7706:53;;;7755:1;7752;7745:12;7706:53;7778:28;7796:9;7778:28;:::i;:::-;7768:38;;7857:2;7846:9;7842:18;7829:32;-1:-1:-1;;;;;7876:6:1;7873:30;7870:50;;;7916:1;7913;7906:12;7870:50;7955:58;8005:7;7996:6;7985:9;7981:22;7955:58;:::i;:::-;8032:8;;-1:-1:-1;7929:84:1;-1:-1:-1;8086:37:1;;-1:-1:-1;8119:2:1;8104:18;;8086:37;:::i;:::-;8076:47;;8176:2;8165:9;8161:18;8148:32;-1:-1:-1;;;;;8195:8:1;8192:32;8189:52;;;8237:1;8234;8227:12;8401:160;8466:5;8511:2;8502:6;8497:3;8493:16;8489:25;8486:45;;;8527:1;8524;8517:12;8486:45;-1:-1:-1;8549:6:1;8401:160;-1:-1:-1;8401:160:1:o;8566:813::-;8690:6;8698;8706;8714;8722;8775:3;8763:9;8754:7;8750:23;8746:33;8743:53;;;8792:1;8789;8782:12;8743:53;8831:9;8818:23;8850:31;8875:5;8850:31;:::i;:::-;8900:5;-1:-1:-1;8924:37:1;8957:2;8942:18;;8924:37;:::i;:::-;8914:47;-1:-1:-1;9034:2:1;9019:18;;9006:32;;-1:-1:-1;9137:2:1;9122:18;;9109:32;;-1:-1:-1;9218:3:1;9203:19;;9190:33;-1:-1:-1;;;;;9235:30:1;;9232:50;;;9278:1;9275;9268:12;9232:50;9301:72;9365:7;9356:6;9345:9;9341:22;9301:72;:::i;:::-;9291:82;;;8566:813;;;;;;;;:::o;9384:247::-;9443:6;9496:2;9484:9;9475:7;9471:23;9467:32;9464:52;;;9512:1;9509;9502:12;9464:52;9551:9;9538:23;9570:31;9595:5;9570:31;:::i;9859:1190::-;10011:6;10019;10027;10035;10043;10051;10059;10067;10120:3;10108:9;10099:7;10095:23;10091:33;10088:53;;;10137:1;10134;10127:12;10088:53;10176:9;10163:23;10195:31;10220:5;10195:31;:::i;:::-;10245:5;-1:-1:-1;10269:37:1;10302:2;10287:18;;10269:37;:::i;:::-;10259:47;-1:-1:-1;10379:2:1;10364:18;;10351:32;;-1:-1:-1;10482:2:1;10467:18;;10454:32;;-1:-1:-1;10563:3:1;10548:19;;10535:33;-1:-1:-1;;;;;10580:30:1;;10577:50;;;10623:1;10620;10613:12;10577:50;10662:58;10712:7;10703:6;10692:9;10688:22;10662:58;:::i;:::-;10739:8;;-1:-1:-1;10636:84:1;-1:-1:-1;10793:38:1;;-1:-1:-1;10826:3:1;10811:19;;10793:38;:::i;:::-;10783:48;;10884:3;10873:9;10869:19;10856:33;-1:-1:-1;;;;;10904:8:1;10901:32;10898:52;;;10946:1;10943;10936:12;10898:52;10969:74;11035:7;11024:8;11013:9;11009:24;10969:74;:::i;:::-;10959:84;;;9859:1190;;;;;;;;;;;:::o;11054:256::-;11120:6;11128;11181:2;11169:9;11160:7;11156:23;11152:32;11149:52;;;11197:1;11194;11187:12;11149:52;11220:28;11238:9;11220:28;:::i;:::-;11210:38;;11267:37;11300:2;11289:9;11285:18;11267:37;:::i;:::-;11257:47;;11054:256;;;;;:::o;11315:1356::-;11457:6;11465;11473;11481;11489;11497;11505;11513;11521;11529;11582:3;11570:9;11561:7;11557:23;11553:33;11550:53;;;11599:1;11596;11589:12;11550:53;11622:28;11640:9;11622:28;:::i;:::-;11612:38;;11701:2;11690:9;11686:18;11673:32;-1:-1:-1;;;;;11720:6:1;11717:30;11714:50;;;11760:1;11757;11750:12;11714:50;11799:58;11849:7;11840:6;11829:9;11825:22;11799:58;:::i;:::-;11876:8;;-1:-1:-1;11773:84:1;-1:-1:-1;11930:37:1;;-1:-1:-1;11963:2:1;11948:18;;11930:37;:::i;:::-;11920:47;-1:-1:-1;12036:2:1;12021:18;;12008:32;;-1:-1:-1;12116:3:1;12101:19;;12088:33;12130;12088;12130;:::i;:::-;12182:7;-1:-1:-1;12262:3:1;12247:19;;12234:33;;-1:-1:-1;12346:3:1;12331:19;;12318:33;-1:-1:-1;;;;;12363:32:1;;12360:52;;;12408:1;12405;12398:12;12360:52;12447:60;12499:7;12488:8;12477:9;12473:24;12447:60;:::i;:::-;11315:1356;;;;-1:-1:-1;11315:1356:1;;;;;;;;;;;;;12634:3;12619:19;;;12606:33;;11315:1356;-1:-1:-1;;;;11315:1356:1:o;12676:1162::-;12806:6;12814;12822;12830;12838;12846;12854;12862;12870;12923:3;12911:9;12902:7;12898:23;12894:33;12891:53;;;12940:1;12937;12930:12;12891:53;12963:28;12981:9;12963:28;:::i;:::-;12953:38;-1:-1:-1;13060:2:1;13045:18;;13032:32;;-1:-1:-1;13161:2:1;13146:18;;13133:32;;-1:-1:-1;13242:2:1;13227:18;;13214:32;-1:-1:-1;;;;;13258:30:1;;13255:50;;;13301:1;13298;13291:12;13255:50;13340:58;13390:7;13381:6;13370:9;13366:22;13340:58;:::i;:::-;13417:8;;-1:-1:-1;13314:84:1;-1:-1:-1;13471:38:1;;-1:-1:-1;13504:3:1;13489:19;;13471:38;:::i;:::-;13461:48;;13528:36;13559:3;13548:9;13544:19;13528:36;:::i;:::-;13518:46;;13617:3;13606:9;13602:19;13589:33;-1:-1:-1;;;;;13637:8:1;13634:32;13631:52;;;13679:1;13676;13669:12;13631:52;13718:60;13770:7;13759:8;13748:9;13744:24;13718:60;:::i;:::-;13692:86;;13797:8;13787:18;;;13824:8;13814:18;;;12676:1162;;;;;;;;;;;:::o;14075:315::-;14140:6;14148;14201:2;14189:9;14180:7;14176:23;14172:32;14169:52;;;14217:1;14214;14207:12;14169:52;14256:9;14243:23;14275:31;14300:5;14275:31;:::i;:::-;14325:5;-1:-1:-1;14349:35:1;14380:2;14365:18;;14349:35;:::i;14395:668::-;14490:6;14498;14506;14514;14522;14575:3;14563:9;14554:7;14550:23;14546:33;14543:53;;;14592:1;14589;14582:12;14543:53;14615:28;14633:9;14615:28;:::i;:::-;14605:38;;14662:37;14695:2;14684:9;14680:18;14662:37;:::i;:::-;14652:47;-1:-1:-1;14768:2:1;14753:18;;14740:32;;-1:-1:-1;14847:2:1;14832:18;;14819:32;-1:-1:-1;;;;;14863:30:1;;14860:50;;;14906:1;14903;14896:12;14860:50;14945:58;14995:7;14986:6;14975:9;14971:22;14945:58;:::i;:::-;14395:668;;;;-1:-1:-1;14395:668:1;;-1:-1:-1;15022:8:1;;14919:84;14395:668;-1:-1:-1;;;14395:668:1:o;15068:388::-;15136:6;15144;15197:2;15185:9;15176:7;15172:23;15168:32;15165:52;;;15213:1;15210;15203:12;15165:52;15252:9;15239:23;15271:31;15296:5;15271:31;:::i;:::-;15321:5;-1:-1:-1;15378:2:1;15363:18;;15350:32;15391:33;15350:32;15391:33;:::i;:::-;15443:7;15433:17;;;15068:388;;;;;:::o;15461:370::-;15536:6;15544;15552;15605:2;15593:9;15584:7;15580:23;15576:32;15573:52;;;15621:1;15618;15611:12;15573:52;15644:28;15662:9;15644:28;:::i;:::-;15634:38;;15691:37;15724:2;15713:9;15709:18;15691:37;:::i;15836:346::-;15904:6;15912;15965:2;15953:9;15944:7;15940:23;15936:32;15933:52;;;15981:1;15978;15971:12;15933:52;-1:-1:-1;;16026:23:1;;;16146:2;16131:18;;;16118:32;;-1:-1:-1;15836:346:1:o;16187:512::-;16271:6;16279;16287;16295;16348:3;16336:9;16327:7;16323:23;16319:33;16316:53;;;16365:1;16362;16355:12;16316:53;16388:28;16406:9;16388:28;:::i;:::-;16378:38;;16435:37;16468:2;16457:9;16453:18;16435:37;:::i;:::-;16425:47;;16522:2;16511:9;16507:18;16494:32;16535:31;16560:5;16535:31;:::i;:::-;16187:512;;;;-1:-1:-1;16585:5:1;;16663:2;16648:18;16635:32;;-1:-1:-1;;16187:512:1:o;16704:380::-;16783:1;16779:12;;;;16826;;;16847:61;;16901:4;16893:6;16889:17;16879:27;;16847:61;16954:2;16946:6;16943:14;16923:18;16920:38;16917:161;;17000:10;16995:3;16991:20;16988:1;16981:31;17035:4;17032:1;17025:15;17063:4;17060:1;17053:15;17282:127;17343:10;17338:3;17334:20;17331:1;17324:31;17374:4;17371:1;17364:15;17398:4;17395:1;17388:15;17414:125;17479:9;;;17500:10;;;17497:36;;;17513:18;;:::i;17891:271::-;18074:6;18066;18061:3;18048:33;18030:3;18100:16;;18125:13;;;18100:16;17891:271;-1:-1:-1;17891:271:1:o;18167:266::-;18255:6;18250:3;18243:19;18307:6;18300:5;18293:4;18288:3;18284:14;18271:43;-1:-1:-1;18359:1:1;18334:16;;;18352:4;18330:27;;;18323:38;;;;18415:2;18394:15;;;-1:-1:-1;;18390:29:1;18381:39;;;18377:50;;18167:266::o;18438:326::-;18633:6;18625;18621:19;18610:9;18603:38;18677:2;18672;18661:9;18657:18;18650:30;18584:4;18697:61;18754:2;18743:9;18739:18;18731:6;18723;18697:61;:::i;19847:521::-;19924:4;19930:6;19990:11;19977:25;20084:2;20080:7;20069:8;20053:14;20049:29;20045:43;20025:18;20021:68;20011:96;;20103:1;20100;20093:12;20011:96;20130:33;;20182:20;;;-1:-1:-1;;;;;;20214:30:1;;20211:50;;;20257:1;20254;20247:12;20211:50;20290:4;20278:17;;-1:-1:-1;20321:14:1;20317:27;;;20307:38;;20304:58;;;20358:1;20355;20348:12;20779:753;21112:6;21104;21100:19;21089:9;21082:38;21156:3;21151:2;21140:9;21136:18;21129:31;21063:4;21183:62;21240:3;21229:9;21225:19;21217:6;21209;21183:62;:::i;:::-;-1:-1:-1;;;;;21285:6:1;21281:31;21276:2;21265:9;21261:18;21254:59;21349:6;21344:2;21333:9;21329:18;21322:34;21393:6;21387:3;21376:9;21372:19;21365:35;21449:9;21441:6;21437:22;21431:3;21420:9;21416:19;21409:51;21477:49;21519:6;21511;21503;21477:49;:::i;:::-;21469:57;20779:753;-1:-1:-1;;;;;;;;;;;20779:753:1:o;21941:128::-;22008:9;;;22029:11;;;22026:37;;;22043:18;;:::i;22480:360::-;22691:6;22683;22678:3;22665:33;22761:2;22757:15;;;;-1:-1:-1;;22753:53:1;22717:16;;22742:65;;;22831:2;22823:11;;22480:360;-1:-1:-1;22480:360:1:o;22970:517::-;23071:2;23066:3;23063:11;23060:421;;;23107:5;23104:1;23097:16;23151:4;23148:1;23138:18;23221:2;23209:10;23205:19;23202:1;23198:27;23192:4;23188:38;23257:4;23245:10;23242:20;23239:47;;;-1:-1:-1;23280:4:1;23239:47;23335:2;23330:3;23326:12;23323:1;23319:20;23313:4;23309:31;23299:41;;23390:81;23408:2;23401:5;23398:13;23390:81;;;23467:1;23453:16;;23434:1;23423:13;23390:81;;23663:1295;23787:3;23781:10;-1:-1:-1;;;;;23806:6:1;23803:30;23800:56;;;23836:18;;:::i;:::-;23865:96;23954:6;23914:38;23946:4;23940:11;23914:38;:::i;:::-;23908:4;23865:96;:::i;:::-;24010:4;24041:2;24030:14;;24058:1;24053:648;;;;24745:1;24762:6;24759:89;;;-1:-1:-1;24814:19:1;;;24808:26;24759:89;-1:-1:-1;;23620:1:1;23616:11;;;23612:24;23608:29;23598:40;23644:1;23640:11;;;23595:57;24861:81;;24023:929;;24053:648;22917:1;22910:14;;;22954:4;22941:18;;-1:-1:-1;;24089:20:1;;;24206:222;24220:7;24217:1;24214:14;24206:222;;;24302:19;;;24296:26;24281:42;;24409:4;24394:20;;;;24362:1;24350:14;;;;24236:12;24206:222;;;24210:3;24456:6;24447:7;24444:19;24441:201;;;24517:19;;;24511:26;-1:-1:-1;;24600:1:1;24596:14;;;24612:3;24592:24;24588:37;24584:42;24569:58;24554:74;;24441:201;-1:-1:-1;;;;24688:1:1;24672:14;;;24668:22;24655:36;;-1:-1:-1;23663:1295:1:o;25310:481::-;25559:6;25551;25547:19;25536:9;25529:38;25615:6;25607;25603:19;25598:2;25587:9;25583:18;25576:47;25659:6;25654:2;25643:9;25639:18;25632:34;25702:3;25697:2;25686:9;25682:18;25675:31;25510:4;25723:62;25780:3;25769:9;25765:19;25757:6;25749;25723:62;:::i;:::-;25715:70;25310:481;-1:-1:-1;;;;;;;25310:481:1:o;26614:493::-;26863:6;26855;26851:19;26840:9;26833:38;26907:3;26902:2;26891:9;26887:18;26880:31;26814:4;26928:62;26985:3;26974:9;26970:19;26962:6;26954;26928:62;:::i;:::-;-1:-1:-1;;;;;27026:31:1;;;;27021:2;27006:18;;26999:59;-1:-1:-1;27089:2:1;27074:18;27067:34;26920:70;26614:493;-1:-1:-1;;;26614:493:1:o;28231:1194::-;-1:-1:-1;;;;;28348:3:1;28345:27;28342:53;;;28375:18;;:::i;:::-;28404:93;28493:3;28453:38;28485:4;28479:11;28453:38;:::i;:::-;28447:4;28404:93;:::i;:::-;28523:1;28548:2;28543:3;28540:11;28565:1;28560:607;;;;29211:1;29228:3;29225:93;;;-1:-1:-1;29284:19:1;;;29271:33;29225:93;-1:-1:-1;;23620:1:1;23616:11;;;23612:24;23608:29;23598:40;23644:1;23640:11;;;23595:57;29331:78;;28533:886;;28560:607;22917:1;22910:14;;;22954:4;22941:18;;-1:-1:-1;;28596:17:1;;;28710:229;28724:7;28721:1;28718:14;28710:229;;;28813:19;;;28800:33;28785:49;;28920:4;28905:20;;;;28873:1;28861:14;;;;28740:12;28710:229;;;28714:3;28967;28958:7;28955:16;28952:159;;;29091:1;29087:6;29081:3;29075;29072:1;29068:11;29064:21;29060:34;29056:39;29043:9;29038:3;29034:19;29021:33;29017:79;29009:6;29002:95;28952:159;;;29154:1;29148:3;29145:1;29141:11;29137:19;29131:4;29124:33;28533:886;;28231:1194;;;:::o;30281:685::-;30360:6;30413:2;30401:9;30392:7;30388:23;30384:32;30381:52;;;30429:1;30426;30419:12;30381:52;30462:9;30456:16;-1:-1:-1;;;;;30487:6:1;30484:30;30481:50;;;30527:1;30524;30517:12;30481:50;30550:22;;30603:4;30595:13;;30591:27;-1:-1:-1;30581:55:1;;30632:1;30629;30622:12;30581:55;30665:2;30659:9;30690:52;30706:35;30734:6;30706:35;:::i;30690:52::-;30765:6;30758:5;30751:21;30813:7;30808:2;30799:6;30795:2;30791:15;30787:24;30784:37;30781:57;;;30834:1;30831;30824:12;30781:57;30882:6;30877:2;30873;30869:11;30864:2;30857:5;30853:14;30847:42;30934:1;30909:18;;;30929:2;30905:27;30898:38;;;;30913:5;30281:685;-1:-1:-1;;;;30281:685:1:o;33950:168::-;34023:9;;;34054;;34071:15;;;34065:22;;34051:37;34041:71;;34092:18;;:::i;34123:127::-;34184:10;34179:3;34175:20;34172:1;34165:31;34215:4;34212:1;34205:15;34239:4;34236:1;34229:15;34255:120;34295:1;34321;34311:35;;34326:18;;:::i;:::-;-1:-1:-1;34360:9:1;;34255:120::o;34380:135::-;34419:3;34440:17;;;34437:43;;34460:18;;:::i;:::-;-1:-1:-1;34507:1:1;34496:13;;34380:135::o;34520:642::-;34801:6;34789:19;;34771:38;;-1:-1:-1;;;;;34845:32:1;;34840:2;34825:18;;34818:60;34865:3;34909:2;34894:18;;34887:31;;;-1:-1:-1;;34941:46:1;;34967:19;;34959:6;34941:46;:::i;:::-;35037:6;35030:14;35023:22;35018:2;35007:9;35003:18;34996:50;35095:9;35087:6;35083:22;35077:3;35066:9;35062:19;35055:51;35123:33;35149:6;35141;35123:33;:::i;:::-;35115:41;34520:642;-1:-1:-1;;;;;;;;34520:642:1:o;35167:343::-;35246:6;35254;35307:2;35295:9;35286:7;35282:23;35278:32;35275:52;;;35323:1;35320;35313:12;35275:52;-1:-1:-1;;35368:16:1;;35474:2;35459:18;;;35453:25;35368:16;;35453:25;;-1:-1:-1;35167:343:1:o;35515:557::-;35772:6;35764;35760:19;35749:9;35742:38;35816:3;35811:2;35800:9;35796:18;35789:31;35723:4;35843:46;35884:3;35873:9;35869:19;35861:6;35843:46;:::i;:::-;-1:-1:-1;;;;;35929:6:1;35925:31;35920:2;35909:9;35905:18;35898:59;36005:9;35997:6;35993:22;35988:2;35977:9;35973:18;35966:50;36033:33;36059:6;36051;36033:33;:::i;37123:127::-;37184:10;37179:3;37175:20;37172:1;37165:31;37215:4;37212:1;37205:15;37239:4;37236:1;37229:15;37255:251;37325:6;37378:2;37366:9;37357:7;37353:23;37349:32;37346:52;;;37394:1;37391;37384:12;37346:52;37426:9;37420:16;37445:31;37470:5;37445:31;:::i;37511:959::-;37773:4;37821:3;37810:9;37806:19;37852:6;37841:9;37834:25;37895:6;37890:2;37879:9;37875:18;37868:34;37938:3;37933:2;37922:9;37918:18;37911:31;37962:6;37997;37991:13;38028:6;38020;38013:22;38066:3;38055:9;38051:19;38044:26;;38105:2;38097:6;38093:15;38079:29;;38126:1;38136:195;38150:6;38147:1;38144:13;38136:195;;;38215:13;;-1:-1:-1;;;;;38211:39:1;38199:52;;38280:2;38306:15;;;;38271:12;;;;38247:1;38165:9;38136:195;;;-1:-1:-1;;;;;;;38387:32:1;;;;38382:2;38367:18;;38360:60;-1:-1:-1;;38451:3:1;38436:19;38429:35;38348:3;37511:959;-1:-1:-1;;;37511:959:1:o;40795:211::-;40836:3;40874:5;40868:12;40918:6;40911:4;40904:5;40900:16;40895:3;40889:36;40980:1;40944:16;;40969:13;;;-1:-1:-1;40944:16:1;;40795:211;-1:-1:-1;40795:211:1:o;41011:189::-;41140:3;41165:29;41190:3;41182:6;41165:29;:::i;41205:719::-;41508:6;41500;41496:19;41485:9;41478:38;41552:3;41547:2;41536:9;41532:18;41525:31;41459:4;41579:46;41620:3;41609:9;41605:19;41597:6;41579:46;:::i;:::-;-1:-1:-1;;;;;41665:6:1;41661:31;41656:2;41645:9;41641:18;41634:59;41741:9;41733:6;41729:22;41724:2;41713:9;41709:18;41702:50;41775:33;41801:6;41793;41775:33;:::i;:::-;41761:47;;41857:9;41849:6;41845:22;41839:3;41828:9;41824:19;41817:51;41885:33;41911:6;41903;41885:33;:::i;42692:112::-;42724:1;42750;42740:35;;42755:18;;:::i;:::-;-1:-1:-1;42789:9:1;;42692:112::o;43232:836::-;43581:6;43573;43569:19;43558:9;43551:38;43625:3;43620:2;43609:9;43605:18;43598:31;43532:4;43652:46;43693:3;43682:9;43678:19;43670:6;43652:46;:::i;:::-;43746:9;43738:6;43734:22;43729:2;43718:9;43714:18;43707:50;43780:33;43806:6;43798;43780:33;:::i;:::-;-1:-1:-1;;;;;43849:32:1;;;43844:2;43829:18;;43822:60;43919:32;;43913:3;43898:19;;43891:61;43989:22;;;43869:3;43968:19;;43961:51;43766:47;-1:-1:-1;44029:33:1;43766:47;44047:6;44029:33;:::i;:::-;44021:41;43232:836;-1:-1:-1;;;;;;;;;43232:836:1:o;44073:625::-;44395:3;44390;44386:13;44377:6;44372:3;44368:16;44364:36;44359:3;44352:49;44430:6;44426:1;44421:3;44417:11;44410:27;-1:-1:-1;;;;;44493:3:1;44489:28;44480:6;44475:3;44471:16;44467:51;44462:2;44457:3;44453:12;44446:73;44549:6;44544:2;44539:3;44535:12;44528:28;-1:-1:-1;;;;;44612:3:1;44608:28;44599:6;44594:3;44590:16;44586:51;44581:2;44576:3;44572:12;44565:73;44334:3;44654:38;44688:2;44683:3;44679:12;44671:6;44654:38;:::i;45051:871::-;45420:6;45412;45408:19;45397:9;45390:38;45464:3;45459:2;45448:9;45444:18;45437:31;45371:4;45491:46;45532:3;45521:9;45517:19;45509:6;45491:46;:::i;:::-;-1:-1:-1;;;;;45573:31:1;;45568:2;45553:18;;45546:59;45636:2;45621:18;;45614:34;;;-1:-1:-1;;;;;45685:32:1;;45679:3;45664:19;;45657:61;45705:3;45734:19;;45727:35;;;45799:22;;;45793:3;45778:19;;45771:51;45839:33;45803:6;45857;45839:33;:::i;:::-;45831:41;;;45909:6;45903:3;45892:9;45888:19;45881:35;45051:871;;;;;;;;;;;:::o;45927:383::-;46128:2;46117:9;46110:21;46091:4;46148:45;46189:2;46178:9;46174:18;46166:6;46148:45;:::i;:::-;-1:-1:-1;;;;;46229:31:1;;;;46224:2;46209:18;;46202:59;-1:-1:-1;46292:2:1;46277:18;46270:34;46140:53;45927:383;-1:-1:-1;45927:383:1:o
Swarm Source
ipfs://06ef3a41d0e82403b7074052ffa089b3f97c0488184b2e92e46458132c70f325
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.