More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 672,314 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Approve | 57691911 | 1 hr ago | IN | 0 ETH | 0.00000413 | ||||
Approve | 57691377 | 2 hrs ago | IN | 0 ETH | 0.00000422 | ||||
Approve | 57690929 | 2 hrs ago | IN | 0 ETH | 0.00000478 | ||||
Approve | 57687850 | 3 hrs ago | IN | 0 ETH | 0.00000639 | ||||
Approve | 57687534 | 3 hrs ago | IN | 0 ETH | 0.00000639 | ||||
Approve | 57686930 | 3 hrs ago | IN | 0 ETH | 0.00000555 | ||||
Approve | 57679509 | 7 hrs ago | IN | 0 ETH | 0.00000422 | ||||
Approve | 57677089 | 8 hrs ago | IN | 0 ETH | 0.0000042 | ||||
Approve | 57676440 | 8 hrs ago | IN | 0 ETH | 0.00000485 | ||||
Approve | 57675831 | 9 hrs ago | IN | 0 ETH | 0.00000422 | ||||
Approve | 57672387 | 11 hrs ago | IN | 0 ETH | 0.0000064 | ||||
Approve | 57672386 | 11 hrs ago | IN | 0 ETH | 0.0000064 | ||||
Approve | 57672386 | 11 hrs ago | IN | 0 ETH | 0.0000064 | ||||
Approve | 57672386 | 11 hrs ago | IN | 0 ETH | 0.0000064 | ||||
Approve | 57672029 | 11 hrs ago | IN | 0 ETH | 0.0000064 | ||||
Approve | 57672028 | 11 hrs ago | IN | 0 ETH | 0.0000064 | ||||
Approve | 57672028 | 11 hrs ago | IN | 0 ETH | 0.0000064 | ||||
Approve | 57672027 | 11 hrs ago | IN | 0 ETH | 0.0000064 | ||||
Approve | 57671579 | 11 hrs ago | IN | 0 ETH | 0.0000064 | ||||
Approve | 57671262 | 11 hrs ago | IN | 0 ETH | 0.0000064 | ||||
Approve | 57671188 | 11 hrs ago | IN | 0 ETH | 0.0000064 | ||||
Approve | 57671187 | 11 hrs ago | IN | 0 ETH | 0.0000064 | ||||
Approve | 57671186 | 11 hrs ago | IN | 0 ETH | 0.0000064 | ||||
Approve | 57670631 | 11 hrs ago | IN | 0 ETH | 0.00000641 | ||||
Approve | 57670631 | 11 hrs ago | IN | 0 ETH | 0.00000642 |
Latest 12 internal transactions
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
27369548 | 385 days ago | 0.001 ETH | ||||
19599307 | 479 days ago | 0.0001 ETH | ||||
10792693 | 583 days ago | 0.001 ETH | ||||
10177950 | 591 days ago | 0.0001 ETH | ||||
7471720 | 622 days ago | 0.001 ETH | ||||
7277521 | 625 days ago | 10 wei | ||||
4899948 | 653 days ago | 0.01 ETH | ||||
4183913 | 661 days ago | 0.001 ETH | ||||
4183445 | 661 days ago | 0.001 ETH | ||||
2784750 | 680 days ago | 0.02 ETH | ||||
2783748 | 681 days ago | 0.01 ETH | ||||
2783592 | 681 days ago | 0.016 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
SyncSwapClassicPool
Compiler Version
v0.8.15+commit.e14f2714
ZkSolc Version
v1.3.5
Contract Source Code (Solidity)
/** *Submitted for verification at era.zksync.network on 2024-05-04 */ // SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity ^0.8.0; /// @notice The manager contract to control fees. /// Management functions are omitted. interface IFeeManager { function getSwapFee( address pool, address sender, address tokenIn, address tokenOut, bytes calldata data) external view returns (uint24); function getProtocolFee(address pool) external view returns (uint24); function getFeeRecipient() external view returns (address); } interface IForwarderRegistry { function isForwarder(address forwarder) external view returns (bool); } /// @dev The master contract to create pools and manage whitelisted factories. /// Inheriting the fee manager interface to support fee queries. interface IPoolMaster is IFeeManager, IForwarderRegistry { event SetFactoryWhitelisted(address indexed factory, bool whitelisted); event RegisterPool( address indexed factory, address indexed pool, uint16 indexed poolType, bytes data ); event UpdateForwarderRegistry(address indexed newForwarderRegistry); event UpdateFeeManager(address indexed newFeeManager); function vault() external view returns (address); function feeManager() external view returns (address); function pools(uint) external view returns (address); function poolsLength() external view returns (uint); // Forwarder Registry function setForwarderRegistry(address) external; // Fees function setFeeManager(address) external; // Factories function isFactoryWhitelisted(address) external view returns (bool); function setFactoryWhitelisted(address factory, bool whitelisted) external; // Pools function isPool(address) external view returns (bool); function getPool(bytes32) external view returns (address); function createPool(address factory, bytes calldata data) external returns (address pool); function registerPool(address pool, uint16 poolType, bytes calldata data) external; } interface IERC20Base { 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 amount) external returns (bool); function transfer(address to, uint amount) external returns (bool); function transferFrom(address from, address to, uint amount) external returns (bool); event Approval(address indexed owner, address indexed spender, uint amount); event Transfer(address indexed from, address indexed to, uint amount); } interface IERC20 is IERC20Base { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); } interface IPoolFactory { function master() external view returns (address); function getDeployData() external view returns (bytes memory); function createPool(bytes calldata data) external returns (address pool); } interface IBasePoolFactory is IPoolFactory { event PoolCreated( address indexed token0, address indexed token1, address pool ); function getPool(address tokenA, address tokenB) external view returns (address pool); function getSwapFee( address pool, address sender, address tokenIn, address tokenOut, bytes calldata data ) external view returns (uint24 swapFee); } error InvalidTokens(); abstract contract BasePoolFactory is IBasePoolFactory { /// @dev The pool master that control fees and registry. address public immutable master; /// @dev Pools by its two pool tokens. mapping(address => mapping(address => address)) public override getPool; bytes internal cachedDeployData; constructor(address _master) { master = _master; } function getDeployData() external view override returns (bytes memory deployData) { deployData = cachedDeployData; } function getSwapFee( address pool, address sender, address tokenIn, address tokenOut, bytes calldata data ) external view override returns (uint24 swapFee) { swapFee = IPoolMaster(master).getSwapFee(pool, sender, tokenIn, tokenOut, data); } function createPool(bytes calldata data) external override returns (address pool) { (address tokenA, address tokenB) = abi.decode(data, (address, address)); // Perform safety checks. if (tokenA == tokenB) { revert InvalidTokens(); } // Sort tokens. if (tokenB < tokenA) { (tokenA, tokenB) = (tokenB, tokenA); } if (tokenA == address(0)) { revert InvalidTokens(); } // Underlying implementation to deploy the pools and register them. pool = _createPool(tokenA, tokenB); // Populate mapping in both directions. // Not necessary as existence of the master, but keep them for better compatibility. getPool[tokenA][tokenB] = pool; getPool[tokenB][tokenA] = pool; emit PoolCreated(tokenA, tokenB, pool); } function _createPool(address tokenA, address tokenB) internal virtual returns (address) { } } /// @dev Math functions. /// @dev Modified from Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/utils/FixedPointMathLib.sol) library Math { /// @notice Compares a and b and returns 'true' if the difference between a and b /// is less than 1 or equal to each other. /// @param a uint256 to compare with. /// @param b uint256 to compare with. function within1(uint256 a, uint256 b) internal pure returns (bool) { unchecked { if (a > b) { return a - b <= 1; } return b - a <= 1; } } /// @dev Returns the square root of `x`. function sqrt(uint256 x) internal pure returns (uint256 z) { /// @solidity memory-safe-assembly assembly { // `floor(sqrt(2**15)) = 181`. `sqrt(2**15) - 181 = 2.84`. z := 181 // The "correct" value is 1, but this saves a multiplication later. // This segment is to get a reasonable initial estimate for the Babylonian method. With a bad // start, the correct # of bits increases ~linearly each iteration instead of ~quadratically. // Let `y = x / 2**r`. // We check `y >= 2**(k + 8)` but shift right by `k` bits // each branch to ensure that if `x >= 256`, then `y >= 256`. let r := shl(7, lt(0xffffffffffffffffffffffffffffffffff, x)) r := or(r, shl(6, lt(0xffffffffffffffffff, shr(r, x)))) r := or(r, shl(5, lt(0xffffffffff, shr(r, x)))) r := or(r, shl(4, lt(0xffffff, shr(r, x)))) z := shl(shr(1, r), z) // Goal was to get `z*z*y` within a small factor of `x`. More iterations could // get y in a tighter range. Currently, we will have y in `[256, 256*(2**16))`. // We ensured `y >= 256` so that the relative difference between `y` and `y+1` is small. // That's not possible if `x < 256` but we can just verify those cases exhaustively. // Now, `z*z*y <= x < z*z*(y+1)`, and `y <= 2**(16+8)`, and either `y >= 256`, or `x < 256`. // Correctness can be checked exhaustively for `x < 256`, so we assume `y >= 256`. // Then `z*sqrt(y)` is within `sqrt(257)/sqrt(256)` of `sqrt(x)`, or about 20bps. // For `s` in the range `[1/256, 256]`, the estimate `f(s) = (181/1024) * (s+1)` // is in the range `(1/2.84 * sqrt(s), 2.84 * sqrt(s))`, // with largest error when `s = 1` and when `s = 256` or `1/256`. // Since `y` is in `[256, 256*(2**16))`, let `a = y/65536`, so that `a` is in `[1/256, 256)`. // Then we can estimate `sqrt(y)` using // `sqrt(65536) * 181/1024 * (a + 1) = 181/4 * (y + 65536)/65536 = 181 * (y + 65536)/2**18`. // There is no overflow risk here since `y < 2**136` after the first branch above. z := shr(18, mul(z, add(shr(r, x), 65536))) // A `mul()` is saved from starting `z` at 181. // Given the worst case multiplicative error of 2.84 above, 7 iterations should be enough. z := shr(1, add(z, div(x, z))) z := shr(1, add(z, div(x, z))) z := shr(1, add(z, div(x, z))) z := shr(1, add(z, div(x, z))) z := shr(1, add(z, div(x, z))) z := shr(1, add(z, div(x, z))) z := shr(1, add(z, div(x, z))) // If `x+1` is a perfect square, the Babylonian method cycles between // `floor(sqrt(x))` and `ceil(sqrt(x))`. This statement ensures we return floor. // See: https://en.wikipedia.org/wiki/Integer_square_root#Using_only_integer_division // Since the ceil is rare, we save gas on the assignment and repeat division in the rare case. // If you don't care whether the floor or ceil square root is returned, you can remove this statement. z := sub(z, lt(div(x, z), z)) } } // Mul Div /// @dev Rounded down. function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 z) { assembly { // Store x * y in z for now. z := mul(x, y) // Equivalent to require(denominator != 0 && (x == 0 || (x * y) / x == y)) if iszero(and(iszero(iszero(denominator)), or(iszero(x), eq(div(z, x), y)))) { revert(0, 0) } // Divide z by the denominator. z := div(z, denominator) } } /// @dev Rounded down. /// This function assumes that `x` is not zero, and must be checked externally. function mulDivUnsafeFirst( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 z) { assembly { // Store x * y in z for now. z := mul(x, y) // Equivalent to require(denominator != 0 && (x * y) / x == y) if iszero(and(iszero(iszero(denominator)), eq(div(z, x), y))) { revert(0, 0) } // Divide z by the denominator. z := div(z, denominator) } } /// @dev Rounded down. /// This function assumes that `denominator` is not zero, and must be checked externally. function mulDivUnsafeLast( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 z) { assembly { // Store x * y in z for now. z := mul(x, y) // Equivalent to require(x == 0 || (x * y) / x == y) if iszero(or(iszero(x), eq(div(z, x), y))) { revert(0, 0) } // Divide z by the denominator. z := div(z, denominator) } } /// @dev Rounded down. /// This function assumes that both `x` and `denominator` are not zero, and must be checked externally. function mulDivUnsafeFirstLast( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 z) { assembly { // Store x * y in z for now. z := mul(x, y) // Equivalent to require((x * y) / x == y) if iszero(eq(div(z, x), y)) { revert(0, 0) } // Divide z by the denominator. z := div(z, denominator) } } // Mul /// @dev Optimized safe multiplication operation for minimal gas cost. /// Equivalent to * function mul( uint256 x, uint256 y ) internal pure returns (uint256 z) { assembly { // Store x * y in z for now. z := mul(x, y) // Equivalent to require(x == 0 || (x * y) / x == y) if iszero(or(iszero(x), eq(div(z, x), y))) { revert(0, 0) } } } /// @dev Optimized unsafe multiplication operation for minimal gas cost. /// This function assumes that `x` is not zero, and must be checked externally. function mulUnsafeFirst( uint256 x, uint256 y ) internal pure returns (uint256 z) { assembly { // Store x * y in z for now. z := mul(x, y) // Equivalent to require((x * y) / x == y) if iszero(eq(div(z, x), y)) { revert(0, 0) } } } // Div /// @dev Optimized safe division operation for minimal gas cost. /// Equivalent to / function div( uint256 x, uint256 y ) internal pure returns (uint256 z) { assembly { // Store x * y in z for now. z := div(x, y) // Equivalent to require(y != 0) if iszero(y) { revert(0, 0) } } } /// @dev Optimized unsafe division operation for minimal gas cost. /// Division by 0 will not reverts and returns 0, and must be checked externally. function divUnsafeLast( uint256 x, uint256 y ) internal pure returns (uint256 z) { assembly { z := div(x, y) } } } interface IERC165 { /// @notice Query if a contract implements an interface /// @param interfaceID The interface identifier, as specified in ERC-165 /// @dev Interface identification is specified in ERC-165. This function /// uses less than 30,000 gas. /// @return `true` if the contract implements `interfaceID` and /// `interfaceID` is not 0xffffffff, `false` otherwise function supportsInterface(bytes4 interfaceID) external view returns (bool); } interface IERC20Permit is IERC20 { function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; function nonces(address owner) external view returns (uint); function DOMAIN_SEPARATOR() external view returns (bytes32); } interface IERC20Permit2 is IERC20Permit { function permit2(address owner, address spender, uint amount, uint deadline, bytes calldata signature) external; } /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. * * Based on OpenZeppelin's ECDSA library. * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/561d1061fc568f04c7a65853538e834a889751e8/contracts/utils/cryptography/ECDSA.sol */ library ECDSA { /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { // Check the signature length if (signature.length != 65) { return address(0); } // Divide the signature in r, s and v variables bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly // solhint-disable-next-line no-inline-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return address(0); } return ecrecover(hash, v, r, s); } } /** * @dev Signature verification helper that can be used instead of `ECDSA.recover` to seamlessly support both ECDSA * signatures from externally owned accounts (EOAs) as well as ERC1271 signatures from smart contract wallets like * Argent and Gnosis Safe. * * Based on OpenZeppelin's SignatureChecker library. * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/561d1061fc568f04c7a65853538e834a889751e8/contracts/utils/cryptography/SignatureChecker.sol */ library SignatureChecker { bytes4 constant internal MAGICVALUE = 0x1626ba7e; // bytes4(keccak256("isValidSignature(bytes32,bytes)") /** * @dev Checks if a signature is valid for a given signer and data hash. If the signer is a smart contract, the * signature is validated against that smart contract using ERC1271, otherwise it's validated using `ECDSA.recover`. * * NOTE: Unlike ECDSA signatures, contract signatures are revocable, and the outcome of this function can thus * change through time. It could return true at block N and false at block N+1 (or the opposite). */ function isValidSignatureNow( address signer, bytes32 hash, bytes memory signature ) internal view returns (bool) { (address recovered) = ECDSA.recover(hash, signature); if (recovered == signer) { if (recovered != address(0)) { return true; } } (bool success, bytes memory result) = signer.staticcall( abi.encodeWithSelector(MAGICVALUE, hash, signature) ); return ( success && result.length == 32 && abi.decode(result, (bytes32)) == bytes32(MAGICVALUE) ); } } error Expired(); error InvalidSignature(); /** * @dev A simple ERC20 implementation for pool's liquidity token, supports permit by both ECDSA signatures from * externally owned accounts (EOAs) as well as ERC1271 signatures from smart contract wallets like Argent. * * Based on Solmate's ERC20. * https://github.com/transmissions11/solmate/blob/bff24e835192470ed38bf15dbed6084c2d723ace/src/tokens/ERC20.sol */ contract ERC20Permit2 is IERC165, IERC20Permit2 { uint8 public immutable override decimals = 18; uint public override totalSupply; mapping(address => uint) public override balanceOf; mapping(address => mapping(address => uint)) public override allowance; bytes32 private constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)") mapping(address => uint) public override nonces; // These members are actually immutable as // `_initialize` will only indent to be called once. string public override name; string public override symbol; uint private INITIAL_CHAIN_ID; bytes32 private INITIAL_DOMAIN_SEPARATOR; function _initialize(string memory _name, string memory _symbol) internal { name = _name; symbol = _symbol; INITIAL_CHAIN_ID = block.chainid; INITIAL_DOMAIN_SEPARATOR = _computeDomainSeparator(); } function supportsInterface(bytes4 interfaceID) external pure override returns (bool) { return interfaceID == this.supportsInterface.selector || // ERC-165 interfaceID == this.permit.selector || // ERC-2612 interfaceID == this.permit2.selector; // Permit2 } function DOMAIN_SEPARATOR() public view override returns (bytes32) { return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : _computeDomainSeparator(); } function _computeDomainSeparator() private view returns (bytes32) { return keccak256( abi.encode( // keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)") 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f, keccak256(bytes(name)), // keccak256(bytes("1")) 0xc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6, block.chainid, address(this) ) ); } function _approve(address _owner, address _spender, uint _amount) private { allowance[_owner][_spender] = _amount; emit Approval(_owner, _spender, _amount); } function approve(address _spender, uint _amount) public override returns (bool) { _approve(msg.sender, _spender, _amount); return true; } function transfer(address _to, uint _amount) public override returns (bool) { balanceOf[msg.sender] -= _amount; // Cannot overflow because the sum of all user balances can't exceed the max uint256 value. unchecked { balanceOf[_to] += _amount; } emit Transfer(msg.sender, _to, _amount); return true; } function transferFrom(address _from, address _to, uint _amount) public override returns (bool) { uint256 _allowed = allowance[_from][msg.sender]; // Saves gas for limited approvals. if (_allowed != type(uint).max) { allowance[_from][msg.sender] = _allowed - _amount; } balanceOf[_from] -= _amount; // Cannot overflow because the sum of all user balances can't exceed the max uint256 value. unchecked { balanceOf[_to] += _amount; } emit Transfer(_from, _to, _amount); return true; } function _mint(address _to, uint _amount) internal { totalSupply += _amount; // Cannot overflow because the sum of all user balances can't exceed the max uint256 value. unchecked { balanceOf[_to] += _amount; } emit Transfer(address(0), _to, _amount); } function _burn(address _from, uint _amount) internal { balanceOf[_from] -= _amount; // Cannot underflow because a user's balance will never be larger than the total supply. unchecked { totalSupply -= _amount; } emit Transfer(_from, address(0), _amount); } modifier ensures(uint _deadline) { // solhint-disable-next-line not-rely-on-time if (block.timestamp > _deadline) { revert Expired(); } _; } function _permitHash( address _owner, address _spender, uint _amount, uint _deadline ) private returns (bytes32) { return keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR(), keccak256(abi.encode(PERMIT_TYPEHASH, _owner, _spender, _amount, nonces[_owner]++, _deadline)) ) ); } function permit( address _owner, address _spender, uint _amount, uint _deadline, uint8 _v, bytes32 _r, bytes32 _s ) public override ensures(_deadline) { bytes32 _hash = _permitHash(_owner, _spender, _amount, _deadline); address _recoveredAddress = ecrecover(_hash, _v, _r, _s); if (_recoveredAddress != _owner) { revert InvalidSignature(); } if (_recoveredAddress == address(0)) { revert InvalidSignature(); } _approve(_owner, _spender, _amount); } function permit2( address _owner, address _spender, uint _amount, uint _deadline, bytes calldata _signature ) public override ensures(_deadline) { bytes32 _hash = _permitHash(_owner, _spender, _amount, _deadline); if (!SignatureChecker.isValidSignatureNow(_owner, _hash, _signature)) { revert InvalidSignature(); } _approve(_owner, _spender, _amount); } } library MetadataHelper { /** * @dev Returns symbol of the token. * * @param token The address of a ERC20 token. * * Return boolean indicating the status and the symbol as string; * * NOTE: Symbol is not the standard interface and some tokens may not support it. * Calling against these tokens will not success, with an empty result. */ function getSymbol(address token) internal view returns (bool, string memory) { // bytes4(keccak256(bytes("symbol()"))) (bool success, bytes memory returndata) = token.staticcall(abi.encodeWithSelector(0x95d89b41)); if (success) { return (true, abi.decode(returndata, (string))); } else { return (false, ""); } } } // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } } /// @dev The callback interface for SyncSwap base pool operations. /// Note additional checks will be required for some callbacks, see below for more information. /// Visit the documentation https://syncswap.gitbook.io/api-documentation/ for more details. interface ICallback { struct BaseMintCallbackParams { address sender; address to; uint reserve0; uint reserve1; uint balance0; uint balance1; uint amount0; uint amount1; uint fee0; uint fee1; uint newInvariant; uint oldInvariant; uint totalSupply; uint liquidity; uint24 swapFee; bytes callbackData; } function syncSwapBaseMintCallback(BaseMintCallbackParams calldata params) external; struct BaseBurnCallbackParams { address sender; address to; uint balance0; uint balance1; uint liquidity; uint totalSupply; uint amount0; uint amount1; uint8 withdrawMode; bytes callbackData; } function syncSwapBaseBurnCallback(BaseBurnCallbackParams calldata params) external; struct BaseBurnSingleCallbackParams { address sender; address to; address tokenIn; address tokenOut; uint balance0; uint balance1; uint liquidity; uint totalSupply; uint amount0; uint amount1; uint amountOut; uint amountSwapped; uint feeIn; uint24 swapFee; uint8 withdrawMode; bytes callbackData; } /// @dev Note the `tokenOut` parameter can be decided by the caller, and the correctness is not guaranteed. /// Additional checks MUST be performed in callback to ensure the `tokenOut` is one of the pools tokens if the sender /// is not a trusted source to avoid potential issues. function syncSwapBaseBurnSingleCallback(BaseBurnSingleCallbackParams calldata params) external; struct BaseSwapCallbackParams { address sender; address to; address tokenIn; address tokenOut; uint reserve0; uint reserve1; uint balance0; uint balance1; uint amountIn; uint amountOut; uint feeIn; uint24 swapFee; uint8 withdrawMode; bytes callbackData; } /// @dev Note the `tokenIn` parameter can be decided by the caller, and the correctness is not guaranteed. /// Additional checks MUST be performed in callback to ensure the `tokenIn` is one of the pools tokens if the sender /// is not a trusted source to avoid potential issues. function syncSwapBaseSwapCallback(BaseSwapCallbackParams calldata params) external; } // Inspired by Aave Protocol's IFlashLoanReceiver. interface IFlashLoanRecipient { /** * @dev When `flashLoan` is called on the Vault, it invokes the `receiveFlashLoan` hook on the recipient. * * At the time of the call, the Vault will have transferred `amounts` for `tokens` to the recipient. Before this * call returns, the recipient must have transferred `amounts` plus `feeAmounts` for each token back to the * Vault, or else the entire flash loan will revert. * * `userData` is the same value passed in the `IVault.flashLoan` call. */ function receiveFlashLoan( address[] memory tokens, uint[] memory amounts, uint[] memory feeAmounts, bytes memory userData ) external; } interface IERC3156FlashBorrower { /** * @dev Receive a flash loan. * @param initiator The initiator of the loan. * @param token The loan currency. * @param amount The amount of tokens lent. * @param fee The additional amount of tokens to repay. * @param data Arbitrary data structure, intended to contain user-defined parameters. * @return The keccak256 hash of "ERC3156FlashBorrower.onFlashLoan" */ function onFlashLoan( address initiator, address token, uint256 amount, uint256 fee, bytes calldata data ) external returns (bytes32); } interface IERC3156FlashLender { /** * @dev The amount of currency available to be lent. * @param token The loan currency. * @return The amount of `token` that can be borrowed. */ function maxFlashLoan( address token ) external view returns (uint256); /** * @dev The fee to be charged for a given loan. * @param token The loan currency. * @param amount The amount of tokens lent. * @return The amount of `token` to be charged for the loan, on top of the returned principal. */ function flashFee( address token, uint256 amount ) external view returns (uint256); /** * @dev Initiate a flash loan. * @param receiver The receiver of the tokens in the loan, and the receiver of the callback. * @param token The loan currency. * @param amount The amount of tokens lent. * @param data Arbitrary data structure, intended to contain user-defined parameters. */ function flashLoan( IERC3156FlashBorrower receiver, address token, uint256 amount, bytes calldata data ) external returns (bool); } interface IFlashLoan is IERC3156FlashLender { function flashLoanFeePercentage() external view returns (uint); /** * @dev Performs a 'flash loan', sending tokens to `recipient`, executing the `receiveFlashLoan` hook on it, * and then reverting unless the tokens plus a proportional protocol fee have been returned. * * The `tokens` and `amounts` arrays must have the same length, and each entry in these indicates the loan amount * for each token contract. `tokens` must be sorted in ascending order. * * The 'userData' field is ignored by the Vault, and forwarded as-is to `recipient` as part of the * `receiveFlashLoan` call. * * Emits `FlashLoan` events. */ function flashLoanMultiple( IFlashLoanRecipient recipient, address[] memory tokens, uint[] memory amounts, bytes memory userData ) external; /** * @dev Emitted for each individual flash loan performed by `flashLoan`. */ event FlashLoan(address indexed recipient, address indexed token, uint amount, uint feeAmount); } interface IVault is IFlashLoan { function wETH() external view returns (address); function reserves(address token) external view returns (uint reserve); function balanceOf(address token, address owner) external view returns (uint balance); function deposit(address token, address to) external payable returns (uint amount); function depositETH(address to) external payable returns (uint amount); function transferAndDeposit(address token, address to, uint amount) external payable returns (uint); function transfer(address token, address to, uint amount) external; function withdraw(address token, address to, uint amount) external; function withdrawAlternative(address token, address to, uint amount, uint8 mode) external; function withdrawETH(address to, uint amount) external; } interface IPool { struct TokenAmount { address token; uint amount; } /// @dev Returns the address of pool master. function master() external view returns (address); /// @dev Returns the vault. function vault() external view returns (address); /// @dev Returns the pool type. function poolType() external view returns (uint16); /// @dev Returns the assets of the pool. function getAssets() external view returns (address[] memory assets); /// @dev Returns the swap fee of the pool. function getSwapFee(address sender, address tokenIn, address tokenOut, bytes calldata data) external view returns (uint24 swapFee); /// @dev Returns the protocol fee of the pool. function getProtocolFee() external view returns (uint24 protocolFee); /// @dev Mints liquidity. function mint( bytes calldata data, address sender, address callback, bytes calldata callbackData ) external returns (uint liquidity); /// @dev Burns liquidity. function burn( bytes calldata data, address sender, address callback, bytes calldata callbackData ) external returns (TokenAmount[] memory tokenAmounts); /// @dev Burns liquidity with single output token. function burnSingle( bytes calldata data, address sender, address callback, bytes calldata callbackData ) external returns (TokenAmount memory tokenAmount); /// @dev Swaps between tokens. function swap( bytes calldata data, address sender, address callback, bytes calldata callbackData ) external returns (TokenAmount memory tokenAmount); } interface IBasePool is IPool, IERC20Permit2 { function token0() external view returns (address); function token1() external view returns (address); function reserve0() external view returns (uint); function reserve1() external view returns (uint); function invariantLast() external view returns (uint); function getReserves() external view returns (uint, uint); function getAmountOut(address tokenIn, uint amountIn, address sender) external view returns (uint amountOut); function getAmountIn(address tokenOut, uint amountOut, address sender) external view returns (uint amountIn); event Mint( address indexed sender, uint amount0, uint amount1, uint liquidity, address indexed to ); event Burn( address indexed sender, uint amount0, uint amount1, uint liquidity, address indexed to ); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync( uint reserve0, uint reserve1 ); } interface IClassicPool is IBasePool { } interface IFeeRecipient { /// @dev Notifies the fee recipient after sent fees. function notifyFees( uint16 feeType, address token, uint amount, uint feeRate, bytes calldata data ) external; } error Overflow(); error InsufficientLiquidityMinted(); contract SyncSwapClassicPool is IClassicPool, ERC20Permit2, ReentrancyGuard { using Math for uint; uint private constant MINIMUM_LIQUIDITY = 1000; uint private constant MAX_FEE = 1e5; /// @dev 100%. /// @dev Pool type `1` for classic pools. uint16 public constant override poolType = 1; address public immutable override master; address public immutable override vault; address public immutable override token0; address public immutable override token1; /// @dev Pool reserve of each pool token as of immediately after the most recent balance event. /// The value is used to measure growth in invariant on mints and input tokens on swaps. uint public override reserve0; uint public override reserve1; /// @dev Invariant of the pool as of immediately after the most recent liquidity event. /// The value is used to measure growth in invariant when protocol fee is enabled, /// and will be reset to zero if protocol fee is disabled. uint public override invariantLast; /// @dev Factory must ensures that the parameters are valid. constructor() { (bytes memory _deployData) = IPoolFactory(msg.sender).getDeployData(); (address _token0, address _token1) = abi.decode(_deployData, (address, address)); address _master = IPoolFactory(msg.sender).master(); master = _master; vault = IPoolMaster(_master).vault(); (token0, token1) = (_token0, _token1); // try to set symbols for the LP token (bool _success0, string memory _symbol0) = MetadataHelper.getSymbol(_token0); (bool _success1, string memory _symbol1) = MetadataHelper.getSymbol(_token1); if (_success0 && _success1) { _initialize( string(abi.encodePacked("SyncSwap ", _symbol0, "/", _symbol1, " Classic LP")), string(abi.encodePacked(_symbol0, "/", _symbol1, " cSLP")) ); } else { _initialize( "SyncSwap Classic LP", "cSLP" ); } } function getAssets() external view override returns (address[] memory assets) { assets = new address[](2); assets[0] = token0; assets[1] = token1; } /// @dev Returns the verified sender address otherwise `address(0)`. function _getVerifiedSender(address _sender) private view returns (address) { if (_sender != address(0)) { if (_sender != msg.sender) { if (!IPoolMaster(master).isForwarder(msg.sender)) { // The sender from non-forwarder is invalid. return address(0); } } } return _sender; } /// @dev Mints LP tokens - should be called via the router after transferring pool tokens. /// The router should ensure that sufficient LP tokens are minted. function mint( bytes calldata _data, address _sender, address _callback, bytes calldata _callbackData ) external override nonReentrant returns (uint) { ICallback.BaseMintCallbackParams memory params; params.to = abi.decode(_data, (address)); (params.reserve0, params.reserve1) = (reserve0, reserve1); (params.balance0, params.balance1) = _balances(); params.newInvariant = _computeInvariant(params.balance0, params.balance1); params.amount0 = params.balance0 - params.reserve0; params.amount1 = params.balance1 - params.reserve1; //require(_amount0 != 0 && _amount1 != 0); // Gets swap fee for the sender. _sender = _getVerifiedSender(_sender); uint _amount1Optimal = params.reserve0 == 0 ? 0 : (params.amount0 * params.reserve1) / params.reserve0; bool _swap0For1 = params.amount1 < _amount1Optimal; if (_swap0For1) { params.swapFee = _getSwapFee(_sender, token0, token1); } else { params.swapFee = _getSwapFee(_sender, token1, token0); } // Adds mint fee to reserves (applies to invariant increase) if unbalanced. (params.fee0, params.fee1) = _unbalancedMintFee(params.swapFee, params.amount0, params.amount1, _amount1Optimal, params.reserve0, params.reserve1); params.reserve0 += params.fee0; params.reserve1 += params.fee1; // Calculates old invariant (where unbalanced fee added to) and, mint protocol fee if any. params.oldInvariant = _computeInvariant(params.reserve0, params.reserve1); bool _feeOn; (_feeOn, params.totalSupply) = _mintProtocolFee(0, 0, params.oldInvariant); if (params.totalSupply == 0) { params.liquidity = params.newInvariant - MINIMUM_LIQUIDITY; _mint(address(0), MINIMUM_LIQUIDITY); // permanently lock on first mint. } else { // Calculates liquidity proportional to invariant growth. params.liquidity = ((params.newInvariant - params.oldInvariant) * params.totalSupply) / params.oldInvariant; } // Mints liquidity for recipient. if (params.liquidity == 0) { revert InsufficientLiquidityMinted(); } _mint(params.to, params.liquidity); // Calls callback with data. if (_callback != address(0)) { // Fills additional values for callback params. params.sender = _sender; params.callbackData = _callbackData; ICallback(_callback).syncSwapBaseMintCallback(params); } // Updates reserves and last invariant with new balances. _updateReserves(params.balance0, params.balance1); if (_feeOn) { invariantLast = params.newInvariant; } emit Mint(msg.sender, params.amount0, params.amount1, params.liquidity, params.to); return params.liquidity; } /// @dev Burns LP tokens sent to this contract. /// The router should ensure that sufficient pool tokens are received. function burn( bytes calldata _data, address _sender, address _callback, bytes calldata _callbackData ) external override nonReentrant returns (TokenAmount[] memory _amounts) { ICallback.BaseBurnCallbackParams memory params; (params.to, params.withdrawMode) = abi.decode(_data, (address, uint8)); (params.balance0, params.balance1) = _balances(); params.liquidity = balanceOf[address(this)]; // Mints protocol fee if any. // Note `_mintProtocolFee` here will checks overflow. bool _feeOn; (_feeOn, params.totalSupply) = _mintProtocolFee(params.balance0, params.balance1, 0); // Calculates amounts of pool tokens proportional to balances. params.amount0 = params.liquidity * params.balance0 / params.totalSupply; params.amount1 = params.liquidity * params.balance1 / params.totalSupply; //require(_amount0 != 0 || _amount1 != 0); // Burns liquidity and transfers pool tokens. _burn(address(this), params.liquidity); _transferTokens(token0, params.to, params.amount0, params.withdrawMode); _transferTokens(token1, params.to, params.amount1, params.withdrawMode); // Updates balances. /// @dev Cannot underflow because amounts are lesser figures derived from balances. unchecked { params.balance0 -= params.amount0; params.balance1 -= params.amount1; } // Calls callback with data. // Note reserves are not updated at this point to allow read the old values. if (_callback != address(0)) { // Fills additional values for callback params. params.sender = _getVerifiedSender(_sender); params.callbackData = _callbackData; ICallback(_callback).syncSwapBaseBurnCallback(params); } // Updates reserves and last invariant with up-to-date balances (after transfers). _updateReserves(params.balance0, params.balance1); if (_feeOn) { invariantLast = _computeInvariant(params.balance0, params.balance1); } _amounts = new TokenAmount[](2); _amounts[0] = TokenAmount(token0, params.amount0); _amounts[1] = TokenAmount(token1, params.amount1); emit Burn(msg.sender, params.amount0, params.amount1, params.liquidity, params.to); } /// @dev Burns LP tokens sent to this contract and swaps one of the output tokens for another /// - i.e., the user gets a single token out by burning LP tokens. /// The router should ensure that sufficient pool tokens are received. function burnSingle( bytes calldata _data, address _sender, address _callback, bytes calldata _callbackData ) external override nonReentrant returns (TokenAmount memory _tokenAmount) { ICallback.BaseBurnSingleCallbackParams memory params; (params.tokenOut, params.to, params.withdrawMode) = abi.decode(_data, (address, address, uint8)); (params.balance0, params.balance1) = _balances(); params.liquidity = balanceOf[address(this)]; // Mints protocol fee if any. // Note `_mintProtocolFee` here will checks overflow. bool _feeOn; (_feeOn, params.totalSupply) = _mintProtocolFee(params.balance0, params.balance1, 0); // Calculates amounts of pool tokens proportional to balances. params.amount0 = params.liquidity * params.balance0 / params.totalSupply; params.amount1 = params.liquidity * params.balance1 / params.totalSupply; // Burns liquidity. _burn(address(this), params.liquidity); // Gets swap fee for the sender. _sender = _getVerifiedSender(_sender); // Swaps one token for another, transfers desired tokens, and update context values. /// @dev Calculate `amountOut` as if the user first withdrew balanced liquidity and then swapped from one token for another. if (params.tokenOut == token1) { // Swaps `token0` for `token1`. params.swapFee = _getSwapFee(_sender, token0, token1); params.tokenIn = token0; (params.amountSwapped, params.feeIn) = _getAmountOut( params.swapFee, params.amount0, params.balance0 - params.amount0, params.balance1 - params.amount1, true ); params.amount1 += params.amountSwapped; _transferTokens(token1, params.to, params.amount1, params.withdrawMode); params.amountOut = params.amount1; params.amount0 = 0; params.balance1 -= params.amount1; } else { // Swaps `token1` for `token0`. //require(_tokenOut == token0); params.swapFee = _getSwapFee(_sender, token1, token0); params.tokenIn = token1; (params.amountSwapped, params.feeIn) = _getAmountOut( params.swapFee, params.amount1, params.balance0 - params.amount0, params.balance1 - params.amount1, false ); params.amount0 += params.amountSwapped; _transferTokens(token0, params.to, params.amount0, params.withdrawMode); params.amountOut = params.amount0; params.amount1 = 0; params.balance0 -= params.amount0; } // Calls callback with data. // Note reserves are not updated at this point to allow read the old values. if (_callback != address(0)) { // Fills additional values for callback params. params.sender = _sender; params.callbackData = _callbackData; /// @dev Note the `tokenOut` parameter can be decided by the caller, and the correctness is not guaranteed. /// Additional checks MUST be performed in callback to ensure the `tokenOut` is one of the pools tokens if the sender /// is not a trusted source to avoid potential issues. ICallback(_callback).syncSwapBaseBurnSingleCallback(params); } // Update reserves and last invariant with up-to-date balances (updated above). _updateReserves(params.balance0, params.balance1); if (_feeOn) { invariantLast = _computeInvariant(params.balance0, params.balance1); } _tokenAmount = TokenAmount(params.tokenOut, params.amountOut); emit Burn(msg.sender, params.amount0, params.amount1, params.liquidity, params.to); } /// @dev Swaps one token for another - should be called via the router after transferring input tokens. /// The router should ensure that sufficient output tokens are received. function swap( bytes calldata _data, address _sender, address _callback, bytes calldata _callbackData ) external override nonReentrant returns (TokenAmount memory _tokenAmount) { ICallback.BaseSwapCallbackParams memory params; (params.tokenIn, params.to, params.withdrawMode) = abi.decode(_data, (address, address, uint8)); (params.reserve0, params.reserve1) = (reserve0, reserve1); (params.balance0, params.balance1) = _balances(); // Gets swap fee for the sender. _sender = _getVerifiedSender(_sender); // Calculates output amount, update context values and emit event. if (params.tokenIn == token0) { params.swapFee = _getSwapFee(_sender, token0, token1); params.tokenOut = token1; params.amountIn = params.balance0 - params.reserve0; (params.amountOut, params.feeIn) = _getAmountOut(params.swapFee, params.amountIn, params.reserve0, params.reserve1, true); params.balance1 -= params.amountOut; emit Swap(msg.sender, params.amountIn, 0, 0, params.amountOut, params.to); } else { //require(params.tokenIn == token1); params.swapFee = _getSwapFee(_sender, token1, token0); params.tokenOut = token0; params.amountIn = params.balance1 - params.reserve1; (params.amountOut, params.feeIn) = _getAmountOut(params.swapFee, params.amountIn, params.reserve0, params.reserve1, false); params.balance0 -= params.amountOut; emit Swap(msg.sender, 0, params.amountIn, params.amountOut, 0, params.to); } // Checks overflow. if (params.balance0 > type(uint128).max) { revert Overflow(); } if (params.balance1 > type(uint128).max) { revert Overflow(); } // Transfers output tokens. _transferTokens(params.tokenOut, params.to, params.amountOut, params.withdrawMode); // Calls callback with data. if (_callback != address(0)) { // Fills additional values for callback params. params.sender = _sender; params.callbackData = _callbackData; /// @dev Note the `tokenIn` parameter can be decided by the caller, and the correctness is not guaranteed. /// Additional checks MUST be performed in callback to ensure the `tokenIn` is one of the pools tokens if the sender /// is not a trusted source to avoid potential issues. ICallback(_callback).syncSwapBaseSwapCallback(params); } // Updates reserves with up-to-date balances (updated above). _updateReserves(params.balance0, params.balance1); _tokenAmount.token = params.tokenOut; _tokenAmount.amount = params.amountOut; } function _getSwapFee(address _sender, address _tokenIn, address _tokenOut) private view returns (uint24 _swapFee) { _swapFee = getSwapFee(_sender, _tokenIn, _tokenOut, ""); } /// @dev This function doesn't check the forwarder. function getSwapFee(address _sender, address _tokenIn, address _tokenOut, bytes memory data) public view override returns (uint24 _swapFee) { _swapFee = IPoolMaster(master).getSwapFee(address(this), _sender, _tokenIn, _tokenOut, data); } function getProtocolFee() public view override returns (uint24 _protocolFee) { _protocolFee = IPoolMaster(master).getProtocolFee(address(this)); } function _updateReserves(uint _balance0, uint _balance1) private { (reserve0, reserve1) = (_balance0, _balance1); emit Sync(_balance0, _balance1); } function _transferTokens(address token, address to, uint amount, uint8 withdrawMode) private { if (withdrawMode == 0) { IVault(vault).transfer(token, to, amount); } else { IVault(vault).withdrawAlternative(token, to, amount, withdrawMode); } } function _balances() private view returns (uint balance0, uint balance1) { balance0 = IVault(vault).balanceOf(token0, address(this)); balance1 = IVault(vault).balanceOf(token1, address(this)); } /// @dev This fee is charged to cover for the swap fee when users adding unbalanced liquidity. function _unbalancedMintFee( uint _swapFee, uint _amount0, uint _amount1, uint _amount1Optimal, uint _reserve0, uint _reserve1 ) private pure returns (uint _token0Fee, uint _token1Fee) { if (_reserve0 == 0) { return (0, 0); } if (_amount1 >= _amount1Optimal) { _token1Fee = (_swapFee * (_amount1 - _amount1Optimal)) / (2 * MAX_FEE); } else { uint _amount0Optimal = (_amount1 * _reserve0) / _reserve1; _token0Fee = (_swapFee * (_amount0 - _amount0Optimal)) / (2 * MAX_FEE); } } function _mintProtocolFee(uint _reserve0, uint _reserve1, uint _invariant) private returns (bool _feeOn, uint _totalSupply) { _totalSupply = totalSupply; address _feeRecipient = IPoolMaster(master).getFeeRecipient(); _feeOn = (_feeRecipient != address(0)); uint _invariantLast = invariantLast; if (_invariantLast != 0) { if (_feeOn) { if (_invariant == 0) { _invariant = _computeInvariant(_reserve0, _reserve1); } if (_invariant > _invariantLast) { /// @dev Mints `protocolFee` % of growth in liquidity (invariant). uint _protocolFee = getProtocolFee(); uint _numerator = _totalSupply * (_invariant - _invariantLast) * _protocolFee; uint _denominator = (MAX_FEE - _protocolFee) * _invariant + _protocolFee * _invariantLast; uint _liquidity = _numerator / _denominator; if (_liquidity != 0) { _mint(_feeRecipient, _liquidity); // Notifies the fee recipient. IFeeRecipient(_feeRecipient).notifyFees(1, address(this), _liquidity, _protocolFee, ""); _totalSupply += _liquidity; // update cached value. } } } else { /// @dev Resets last invariant to clear measured growth if protocol fee is not enabled. invariantLast = 0; } } } function getReserves() external view override returns (uint _reserve0, uint _reserve1) { (_reserve0, _reserve1) = (reserve0, reserve1); } function getAmountOut(address _tokenIn, uint _amountIn, address _sender) external view override returns (uint _amountOut) { (uint _reserve0, uint _reserve1) = (reserve0, reserve1); bool _swap0For1 = _tokenIn == token0; address _tokenOut = _swap0For1 ? token1 : token0; (_amountOut,) = _getAmountOut(_getSwapFee(_sender, _tokenIn, _tokenOut), _amountIn, _reserve0, _reserve1, _swap0For1); } function getAmountIn(address _tokenOut, uint _amountOut, address _sender) external view override returns (uint _amountIn) { (uint _reserve0, uint _reserve1) = (reserve0, reserve1); bool _swap1For0 = _tokenOut == token0; address _tokenIn = _swap1For0 ? token1 : token0; _amountIn = _getAmountIn(_getSwapFee(_sender, _tokenIn, _tokenOut), _amountOut, _reserve0, _reserve1, _swap1For0); } function _getAmountOut( uint _swapFee, uint _amountIn, uint _reserve0, uint _reserve1, bool _token0In ) private pure returns (uint _dy, uint _feeIn) { if (_amountIn == 0) { _dy = 0; } else { uint _amountInWithFee = _amountIn * (MAX_FEE - _swapFee); _feeIn = _amountIn * _swapFee / MAX_FEE; if (_token0In) { _dy = (_amountInWithFee * _reserve1) / (_reserve0 * MAX_FEE + _amountInWithFee); } else { _dy = (_amountInWithFee * _reserve0) / (_reserve1 * MAX_FEE + _amountInWithFee); } } } function _getAmountIn( uint _swapFee, uint _amountOut, uint _reserve0, uint _reserve1, bool _token0Out ) private pure returns (uint _dx) { if (_amountOut == 0) { _dx = 0; } else { if (_token0Out) { _dx = (_reserve1 * _amountOut * MAX_FEE) / ((_reserve0 - _amountOut) * (MAX_FEE - _swapFee)) + 1; } else { _dx = (_reserve0 * _amountOut * MAX_FEE) / ((_reserve1 - _amountOut) * (MAX_FEE - _swapFee)) + 1; } } } function _computeInvariant(uint _reserve0, uint _reserve1) private pure returns (uint _invariant) { if (_reserve0 > type(uint128).max) { revert Overflow(); } if (_reserve1 > type(uint128).max) { revert Overflow(); } _invariant = (_reserve0 * _reserve1).sqrt(); } } contract SyncSwapClassicPoolFactory is BasePoolFactory { constructor(address _master) BasePoolFactory(_master) { } function _createPool(address token0, address token1) internal override returns (address pool) { // Perform sanity checks. IERC20(token0).balanceOf(address(this)); IERC20(token1).balanceOf(address(this)); bytes memory deployData = abi.encode(token0, token1); cachedDeployData = deployData; // The salt is same with deployment data. bytes32 salt = keccak256(deployData); pool = address(new SyncSwapClassicPool{salt: salt}()); // this will prevent duplicated pools. // Register the pool. The config is same with deployment data. IPoolMaster(master).registerPool(pool, 1, deployData); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"Expired","type":"error"},{"inputs":[],"name":"InsufficientLiquidityMinted","type":"error"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[],"name":"Overflow","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"reserve0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reserve1","type":"uint256"}],"name":"Sync","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"address","name":"_sender","type":"address"},{"internalType":"address","name":"_callback","type":"address"},{"internalType":"bytes","name":"_callbackData","type":"bytes"}],"name":"burn","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPool.TokenAmount[]","name":"_amounts","type":"tuple[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"address","name":"_sender","type":"address"},{"internalType":"address","name":"_callback","type":"address"},{"internalType":"bytes","name":"_callbackData","type":"bytes"}],"name":"burnSingle","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPool.TokenAmount","name":"_tokenAmount","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenOut","type":"address"},{"internalType":"uint256","name":"_amountOut","type":"uint256"},{"internalType":"address","name":"_sender","type":"address"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"_amountIn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenIn","type":"address"},{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"address","name":"_sender","type":"address"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"_amountOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAssets","outputs":[{"internalType":"address[]","name":"assets","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getProtocolFee","outputs":[{"internalType":"uint24","name":"_protocolFee","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserves","outputs":[{"internalType":"uint256","name":"_reserve0","type":"uint256"},{"internalType":"uint256","name":"_reserve1","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"address","name":"_tokenIn","type":"address"},{"internalType":"address","name":"_tokenOut","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"getSwapFee","outputs":[{"internalType":"uint24","name":"_swapFee","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"invariantLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"master","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"address","name":"_sender","type":"address"},{"internalType":"address","name":"_callback","type":"address"},{"internalType":"bytes","name":"_callbackData","type":"bytes"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"permit2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"poolType","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserve0","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserve1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"address","name":"_sender","type":"address"},{"internalType":"address","name":"_callback","type":"address"},{"internalType":"bytes","name":"_callbackData","type":"bytes"}],"name":"swap","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPool.TokenAmount","name":"_tokenAmount","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
13b8683f000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000005aea5775959fbc2557cc8789bc1bf90a239d9a910000000000000000000000003355df6d4c9c3035724fd0e3914de96a5a83aaf4
Deployed Bytecode
0x0004000000000002000400000000000200000000030100190000006003300270000007ae0430019700030000004103550002000000010355000007ae0030019d000100000000001f00000001012001900000000c0000c13d1eb102560000040f0000012001000039000000400010043f0000000001000416000000000110004c000000aa0000c13d0000001201000039000000800010043f00000001010000390000000802000039000000000012041b000007af01000041000001200010043f00000000010004140000000009000411000000040290008c000000460000613d00000004040000390000012003000039000000000209001900000000050300190000000006000019000400000009001d1eb101e30000040f0000000409000029000000000110004c000000460000c13d0000000302000367000000400100043d00000001040000310000001f0340018f0000000504400272000000350000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b0000002d0000413d000000000530004c000000440000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f000000000024043500000001020000311eb1024d0000040f000000030200036700000001010000310000001f0310018f0000000504100272000000540000613d00000000050000190000000506500210000000000762034f000000000707043b000001200660003900000000007604350000000105500039000000000645004b0000004c0000413d000000000530004c000000630000613d0000000504400210000000000242034f00000003033002100000012004400039000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f00000000002404350000013f02100039000000200800008a000000000282016f000007b003200041000007b10330009c000000700000213d000007bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191eb1024d0000040f000007b203000041000000200410008c00000000040000190000000004034019000007b205100197000000000650004c000000000300a019000007b20550009c000000000304c019000000400020043f000000000230004c000000aa0000c13d000001200400043d000007b30240009c000000aa0000213d00000120031000390000013f01400039000007b202000041000000000531004b00000000050000190000000005024019000007b206300197000007b201100197000000000761004b000000000200a019000000000161013f000007b20110009c00000000010500190000000001026019000000000110004c000000aa0000613d000001200140003900000000020104330000014001400039000300000008001d000400000009001d1eb116dd0000040f00000004020000290000000005010433000007b203000041000000400450008c00000000040000190000000004034019000007b206500197000000000560004c000000000300a019000007b20560009c000000000304c019000000000330004c000000aa0000c13d00000020031000390000000005030433000007b40350009c000000aa0000213d00000040011000390000000006010433000007b40160009c000000ad0000a13d000000000100001900000000020000191eb1024d0000040f000000400300043d000007b50100004100000000001304350000000001000414000000040420008c000000bf0000613d0000000404000039000200000006001d0000002006000039000400000005001d0000000005030019000100000003001d1eb101e30000040f000000010300002900000002060000290000000405000029000000000110004c000000260000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600420018f0000000002340019000000000442004b00000000070000190000000107004039000007b30420009c000000690000213d0000000104700190000000690000c13d000000400020043f000000200110008c000000aa0000413d0000000002030433000007b40120009c000000aa0000213d000000a00020043f000007b601000041000000400300043d00000000001304350000000001000414000000040420008c000000e60000613d0000000404000039000200000006001d0000002006000039000400000005001d0000000005030019000100000003001d1eb101e30000040f000000010300002900000002060000290000000405000029000000000110004c000000260000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600420018f0000000002340019000000000442004b00000000070000190000000107004039000007b30420009c000000690000213d0000000104700190000000690000c13d000000400020043f000000200110008c000000aa0000413d0000000001030433000007b40210009c000000aa0000213d000000c00010043f000001000060043f000000e00050043f0000000001050019000200000006001d1eb118330000040f000400000001001d000100000002001d00000002010000291eb118330000040f0000000403000029000000000330004c0000011a0000613d000000000110004c0000011a0000613d000000400100043d0000002003100039000007b704000041000000000043043500000029051000390000000103000029000000200430003900000000030304330000000006000019000000000736004b0000012f0000813d00000000075600190000000008460019000000000808043300000000008704350000002006600039000001120000013d000000400100043d000007bb0210009c000000690000213d0000004002100039000000400020043f0000002002100039000007bc03000041000000000032043500000013020000390000000000210435000000400300043d000007bb0230009c000000690000213d0000004002300039000000400020043f0000002002300039000007bd04000041000000000042043500000004020000390000000000230435000001900000013d000000000636004b000001330000a13d0000000005530019000000000005043500000000031300190000002905300039000007b806000041000000000065043500000020052000390000002a0730003900000000060204330000000008000019000000000968004b000001430000813d0000000009780019000000000a580019000000000a0a04330000000000a9043500000020088000390000013b0000013d000000000868004b000001470000a13d0000000007760019000000000007043500000000033600190000002a06300039000007b907000041000000000076043500000000031300490000001506300039000000000061043500000054033000390000000306000029000000000663016f0000000003160019000000000663004b00000000060000190000000106004039000007b30730009c000000690000213d0000000106600190000000690000c13d000000400030043f0000002007300039000000010600002900000000060604330000000008000019000000000968004b000001660000813d0000000009780019000000000a480019000000000a0a04330000000000a9043500000020088000390000015e0000013d000000000468004b0000016a0000a13d0000000004760019000000000004043500000000043600190000002006400039000007b8070000410000000000760435000000210640003900000000020204330000000007000019000000000827004b000001790000813d00000000086700190000000009570019000000000909043300000000009804350000002007700039000001710000013d000000000527004b0000017d0000a13d0000000005620019000000000005043500000000024200190000002104200039000007ba05000041000000000054043500000000023200490000000604200039000000000043043500000045022000390000000304000029000000000442016f0000000002340019000000000442004b00000000040000190000000104004039000007b30520009c000000690000213d0000000104400190000000690000c13d000000400020043f00000000020300191eb1171c0000040f000000800100043d00000140000004430000016000100443000000a00100043d00000020020000390000018000200443000001a0001004430000004001000039000000c00300043d000001c000100443000001e0003004430000006001000039000000e00300043d000002000010044300000220003004430000008001000039000001000300043d0000024000100443000002600030044300000100002004430000000501000039000001200010044300000100010000390000018002000039000007be030000411eb102430000040f0002000000000002000200000006001d000100000005001d000007ae05000041000007ae0630009c00000000030580190000004003300210000007ae0640009c00000000040580190000006004400210000000000334019f000007ae0410009c0000000001058019000000c001100210000000000113019f1eb11ea70000040f000000010900002900000000030100190000006003300270000007ae033001970000000205000029000000000453004b00000000050340190000001f0450018f0000000505500272000001cf0000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000001c70000413d000000010220018f000000000640004c000001df0000613d0000000505500210000000000651034f00000000055900190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000100000003001f00030000000103550000000001020019000000000001042d0002000000000002000200000006001d000100000005001d000007ae05000041000007ae0630009c00000000030580190000004003300210000007ae0640009c00000000040580190000006004400210000000000334019f000007ae0410009c0000000001058019000000c001100210000000000113019f1eb11eac0000040f000000010900002900000000030100190000006003300270000007ae033001970000000205000029000000000453004b00000000050340190000001f0450018f0000000505500272000002060000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000001fe0000413d000000010220018f000000000640004c000002160000613d0000000505500210000000000651034f00000000055900190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000100000003001f00030000000103550000000001020019000000000001042d000007ae03000041000007ae0410009c00000000010380190000004001100210000007ae0420009c00000000020380190000006002200210000000000112019f0000000002000414000007ae0420009c0000000002038019000000c002200210000000000112019f000007c0011001c700008010020000391eb11eac0000040f00000001022001900000022e0000613d000000000101043b000000000001042d000000000100001900000000020000191eb1024d0000040f0000000003010019000007ae010000410000000004000414000007ae0540009c0000000001044019000000c00110021000000060022002100000000001120019000007c10110004100000000020300191eb11eac0000040f0000000102200190000002400000613d000000000101043b000000000001042d000000000100001900000000020000191eb1024d0000040f000007ae04000041000007ae0510009c000000000104801900000040011002100000000001310019000007ae0320009c00000000020480190000006002200210000000000121001900001eb20001042e000007ae03000041000007ae0420009c0000000002038019000007ae0410009c000000000103801900000040011002100000006002200210000000000112019f00001eb30001043000220000000000020000008006000039000000400060043f0000000001000031000000040110008c00000a2f0000413d002200000000001d0000000201000367000000000101043b000000e001100270000007c20210009c000005240000613d000007c30210009c00000000050004120000000003000410000005490000613d000007c40210009c000005de0000613d000007c50210009c0000080a0000613d000007c60210009c000008220000613d000007c70210009c000002de0000613d000007c80210009c000008680000613d000007c90210009c000003760000613d000007ca0210009c0000038d0000613d000007cb0210009c0000083e0000613d000007cc0210009c000007d30000613d000007cd0210009c000006110000613d000007ce0210009c000006310000613d000007cf0210009c000008500000613d000007d00210009c000006490000613d000007d10210009c000006610000613d000007d20210009c000002fc0000613d000007d30210009c000004050000613d000007d40210009c0000031b0000613d000007d50210009c000006a50000613d000007d60210009c000004280000613d000007d70210009c0000033a0000613d000007d80210009c000006e90000613d000007d90210009c0000045c0000613d000007da0210009c000007010000613d000007db0210009c000007180000613d000007dc0210009c000007380000613d000007dd0210009c000007a80000613d000007de0210009c000004a60000613d000007df0210009c000004c80000613d000007e00210009c000005030000613d000007e10110009c00000a2f0000c13d0000000001000416000000000110004c00000a2f0000c13d001b00000006001d0000000001000031001c00000005001d1eb1199b0000040f001a00000001001d001900000002001d001800000003001d0000000a01000039000000000101041a001600000001001d0000000901000039000000000101041a001700000001001d000007e20100004100000000001004390000001c01000029000000040010044300000060010000390000002400100443000080050100003900000044020000391eb102310000040f00000000030100190000001a01000029000000000131013f000007b401100198001500000001001d000002cb0000c13d000007e20100004100000000001004390000001c0100002900000004001004430000001b010000290000002400100443000080050100003900000044020000391eb102310000040f0000000003010019000000400400043d000007e30140009c000008490000213d0000002001400039000000400010043f000000000004043500000018010000290000001a020000291eb11bd40000040f0000002202000029000007e4011001970000001903000029000000000330004c000009210000c13d000000400100043d0000000000210435000000200200003900000000030000191eb102430000040f0000000001000416000000000110004c00000a2f0000c13d000000040100008a0000000001100031000007b202000041000000400310008c00000000030000190000000003024019000007b201100197000000000410004c000000000200a019000007b20110009c00000000010300190000000001026019000000000110004c00000a2f0000c13d1eb118d10000040f00000024020000390000000202200367000000000302043b000000000201001900000000010004111eb11a1a0000040f0000000102000039000000400100043d0000000000210435000000200200003900000000030000191eb102430000040f0000000001000416000000000110004c00000a2f0000c13d000000040100008a0000000001100031000007b202000041000000200310008c00000000030000190000000003024019000007b201100197000000000410004c000000000200a019000007b20110009c00000000010300190000000001026019000000000110004c00000a2f0000c13d1eb118d10000040f000007b40110019700000000001004350000000101000039000000200010043f000000400200003900000000010000191eb1021a0000040f000000000201041a000000400100043d0000000000210435000000200200003900000000030000191eb102430000040f0000000001000416000000000110004c00000a2f0000c13d000000040100008a0000000001100031000007b202000041000000200310008c00000000030000190000000003024019000007b201100197000000000410004c000000000200a019000007b20110009c00000000010300190000000001026019000000000110004c00000a2f0000c13d1eb118d10000040f000007b40110019700000000001004350000000301000039000000200010043f000000400200003900000000010000191eb1021a0000040f000000000201041a000000400100043d0000000000210435000000200200003900000000030000191eb102430000040f0000000001000416000000000110004c00000a2f0000c13d001b00000006001d0000000001000031001c00000005001d1eb1199b0000040f001a00000001001d001900000002001d001800000003001d0000000a01000039000000000101041a001600000001001d0000000901000039000000000101041a001700000001001d000007e20100004100000000001004390000001c01000029000000040010044300000060010000390000002400100443000080050100003900000044020000391eb102310000040f00000000020100190000001a01000029000000000121013f000007b401100198001500000001001d000003630000c13d000007e20100004100000000001004390000001c0100002900000004001004430000001b010000290000002400100443000080050100003900000044020000391eb102310000040f0000000002010019000000400400043d000007e30140009c000008490000213d0000002001400039000000400010043f000000000004043500000018010000290000001a030000291eb11bd40000040f0000002202000029000007e4031001970000001901000029000000000110004c0000092a0000c13d000000400100043d0000000000210435000000200200003900000000030000191eb102430000040f0000000001000416000000000110004c00000a2f0000c13d000000040100008a0000000001100031000007b202000041000000000310004c00000000030000190000000003024019000007b201100197000000000410004c000000000200a019000007b20110009c00000000010300190000000001026019000000000110004c00000a2f0000c13d000000400100043d000000000200041a0000000000210435000000200200003900000000030000191eb102430000040f0000000001000416000000000110004c00000a2f0000c13d000000040100008a0000000001100031000007b202000041000000600310008c00000000030000190000000003024019000007b201100197000000000410004c000000000200a019000007b20110009c00000000010300190000000001026019000000000110004c00000a2f0000c13d00000002010003670000000402100370000000000202043b001c00000002001d000007b40220009c00000a2f0000213d0000002402100370000000000202043b001a00000002001d000007b40220009c00000a2f0000213d0000004401100370000000000101043b001b00000001001d0000001c0100002900000000001004350000000201000039001800000001001d000000200010043f0000004002000039001900000002001d00000000010000191eb1021a0000040f0000000002000411001700000002001d0000000000200435000000200010043f000000000100001900000019020000291eb1021a0000040f000000000201041a000000010100008a000000000112004b000003d60000613d0000001b01000029001900000002001d000000000112004b000010830000413d0000001c0100002900000000001004350000001801000029000000200010043f0000004002000039001800000002001d00000000010000191eb1021a0000040f00000017020000290000000000200435000000200010043f000000000100001900000018020000291eb1021a0000040f0000001b0200002900000019030000290000000002230049000000000021041b0000001c0100002900000000001004350000000101000039001900000001001d000000200010043f000000400200003900000000010000191eb1021a0000040f000000000201041a0000001b03000029000000000332004b000010830000413d0000001b030000290000000002320049000000000021041b0000001a0100002900000000001004350000001901000029000000200010043f000000400200003900000000010000191eb1021a0000040f000000000201041a0000001b030000290000000002320019000000000021041b000000400100043d0000000000310435000007ae020000410000000003000414000007ae0430009c0000000003028019000007ae0410009c00000000010280190000004001100210000000c002300210000000000112019f000007f3011001c70000800d020000390000000303000039000007f4040000410000001c050000290000001a060000291eb11ea70000040f000000010120019000000a2f0000613d000007120000013d0000000001000416000000000110004c00000a2f0000c13d001c00000005001d0000000001000031001b00000006001d1eb118e30000040f002100000004001d002000000005001d001f00000006001d000000400400043d001e00000004001d000007bb0540009c000008490000213d001800000002001d001900000001001d001a00000003001d0000004002400039000000400020043f00000000000404350000002001400039000000220200002900000000002104351eb11b010000040f000000400100043d001d00000001001d000007f60210009c0000094f0000413d0000002201000029000007bf0200004100000000002104350000004102000039000000040020043f00000024020000391eb1024d0000040f0000000001000416000000000110004c00000a2f0000c13d000000040100008a0000000001100031000007b202000041000000000310004c00000000030000190000000003024019000007b201100197000000000410004c000000000200a019000007b20110009c00000000010300190000000001026019000000000110004c00000a2f0000c13d0000000501000039001a00000001001d000000000101041a001b00000001001d000000400200043d001c00000002001d1eb1191a0000040f0000001b030000290000001c070000290000000000170435000000010230019000000a090000c13d000001000200008a000000000223016f00000020057000390000000000250435000000000110004c000000200200003900000000020060190000000001250019000000000271004900000000010700191eb1192c0000040f0000002001000039000000400200043d001b00000002001d000000000012043500000020022000390000001c010000291eb119400000040f0000001b030000290000000002310049000000000103001900000000030000191eb102430000040f0000000001000416000000000110004c00000a2f0000c13d000000040100008a0000000001100031000007b202000041000000400310008c00000000030000190000000003024019000007b201100197000000000410004c000000000200a019000007b20110009c00000000010300190000000001026019000000000110004c00000a2f0000c13d00000002010003670000000402100370000000000202043b001c00000002001d000007b40220009c00000a2f0000213d0000002401100370000000000101043b001b00000001001d0000000001000411001a00000001001d00000000001004350000000101000039001900000001001d000000200010043f000000400200003900000000010000191eb1021a0000040f000000000201041a0000001b030000290000000004030019000000000332004b000010830000413d0000000002420049000000000021041b0000001c0100002900000000001004350000001901000029000000200010043f000000400200003900000000010000191eb1021a0000040f000000000201041a0000001b030000290000000002230019000000000021041b000000400100043d0000000000310435000007ae020000410000000003000414000007ae0430009c0000000003028019000007ae0410009c00000000010280190000004001100210000000c002300210000000000112019f000007f3011001c70000800d020000390000000303000039000007f4040000410000001a050000290000001c060000291eb11ea70000040f0000000101200190000007120000c13d00000a2f0000013d0000000001000416000000000110004c00000a2f0000c13d000000040100008a0000000001100031000007b202000041000000000310004c00000000030000190000000003024019000007b201100197000000000410004c000000000200a019000007b20110009c00000000010300190000000001026019000000000110004c00000a2f0000c13d000000400100043d001b00000001001d000007e201000041000000000010043900000004005004430000002001000039001c00000001001d0000002400100443000080050100003900000044020000391eb102310000040f000007b4021001970000001b0100002900000000002104350000001c0200002900000000030000191eb102430000040f001a00000003001d0000000001000416000000000110004c00000a2f0000c13d001c00000005001d0000000001000031001b00000006001d1eb118e30000040f001800000001001d001900000002001d001400000003001d001700000004001d001600000005001d001500000006001d1eb11b010000040f000000400a00043d000007e901a0009c000008490000213d000007b2010000410000001903000029000000400230008c00000000020000190000000002014019000007b203300197000000000430004c000000000100a019000007b20330009c000000000102c0190000014002a00039000000400020043f00000000000a04350000004008a00039000000220200002900000000002804350000002004a0003900000000002404350000008003a00039000000220200002900000000002304350000006009a000390000000000290435000000c005a0003900000022020000290000000000250435000000a00da0003900000000002d0435000001200ba000390000006007000039000000220200002900000000007b0435000000e006a00039000001000ca0003900000000002c04350000000000260435000000000110004c00000a170000613d000000220100002900000000020100191eb1024d0000040f0000000001000416000000000110004c00000a2f0000c13d000000040100008a0000000001100031000007b202000041000000000310004c00000000030000190000000003024019000007b201100197000000000410004c000000000200a019000007b20110009c00000000010300190000000001026019000000000110004c00000a2f0000c13d000000400100043d001b00000001001d000007e2010000410000000000100439000000040050044300000040010000390000002400100443000080050100003900000044020000391eb102310000040f000007b4021001970000001b010000290000000000210435000000200200003900000000030000191eb102430000040f0000000001000416000000000110004c00000a2f0000c13d000000040100008a0000000001100031000007b202000041000000200310008c00000000030000190000000003024019000007b201100197000000000410004c000000000200a019000007b20110009c00000000010300190000000001026019000000000110004c00000a2f0000c13d00000004010000390000000201100367000000000101043b0000080702100197000000000221004b00000a2f0000c13d0000000102000039000008080310009c000005430000613d000008090310009c000005430000613d0000080a0110009c00000000020000190000000102006039000000010120018f000000800010043f0000008001000039000000200200003900000000030000191eb102430000040f001a00000003001d0000000001000416000000000110004c00000a2f0000c13d0000000001000031001c00000005001d001b00000006001d1eb118e30000040f001700000001001d001600000003001d001500000004001d001400000005001d001300000006001d000007b201000041000000200320008c00000000030000190000000003014019000007b202200197000000000420004c000000000100a019000007b20220009c000000000103c019001900000001001d1eb11b010000040f1eb11a9f0000040f001800000001001d0000001901000029000000000110004c00000a2f0000c13d00000017010000290000000201100367000000000101043b000007b40210009c00000a2f0000213d00000018030000290000002002300039000f00000002001d00000000001204350000000a01000039000000000101041a0000000902000039000000000202041a0000004004300039001900000004001d00000000002404350000006002300039001200000002001d00000000001204351eb11d440000040f0000001804000029000000a003400039001100000003001d00000000002304350000008003400039001700000003001d00000000001304351eb11e450000040f00000018020000290000014002200039001000000002001d00000000001204350000001901000029000000000101043300000017020000290000000002020433000000000312004b000010830000413d00000000011200490000001802000029000000c002200039000e00000002001d00000000001204350000001201000029000000000101043300000011020000290000000002020433000000000312004b000010830000413d00000000011200490000001802000029000000e002200039000d00000002001d000000000012043500000016010000291eb11b160000040f0000002202000029001600000001001d00000019010000290000000001010433000000000310004c0000000004020019000005b10000613d000000120300002900000000030304330000000e040000290000000004040433000000000540004c000005af0000613d000000010500008a00000000654500d9000000000535004b000010830000413d00000000434300a900000000141300d9000000400500043d0000000d010000290000000001010433000000000141004b000000200150003900000bc90000813d000007e30350009c0000001b03000029000008490000213d000a00000004001d000000400010043f0000000000250435000007e201000041000c00000001001d00000000001004390000001c010000290000000400100443000000600100003900000024001004430000800501000039000800000001001d0000004402000039000900000002001d000b00000005001d1eb102310000040f0000000c0200002900000000002004390000001c0200002900000004002004430000001b020000290000002400200443001b00000001001d000000080100002900000009020000291eb102310000040f000000000301001900000016010000290000001b020000290000000b040000291eb11bd40000040f0000001802000029000001c005200039000007e401100197000000000015043500000bf00000013d0000000001000416000000000110004c00000a2f0000c13d000000040100008a0000000001100031000007b202000041000000000310004c00000000030000190000000003024019000007b201100197000000000410004c000000000200a019000007b20110009c00000000010300190000000001026019000000000110004c00000a2f0000c13d0000000401000039001a00000001001d000000000101041a001b00000001001d000000400200043d001c00000002001d1eb1191a0000040f0000001b030000290000001c070000290000000000170435000000010230019000000a320000c13d000001000200008a000000000223016f00000020037000390000000000230435000000000110004c00000020020000390000000002006019000000200220003900000000010700191eb1192c0000040f0000002001000039000000400200043d001b00000002001d000000000012043500000020022000390000001c010000291eb119400000040f0000001b030000290000000002310049000000000103001900000000030000191eb102430000040f0000000001000416000000000110004c00000a2f0000c13d000000040100008a0000000001100031000007b202000041000000000310004c00000000030000190000000003024019000007b201100197000000000410004c000000000200a019000007b20110009c00000000010300190000000001026019000000000110004c00000a2f0000c13d000000400100043d001b00000001001d000007e201000041000000000010043900000004005004430000002400000443000080050100003900000044020000391eb102310000040f000000ff0210018f0000001b010000290000000000210435000000200200003900000000030000191eb102430000040f0000000001000416000000000110004c00000a2f0000c13d000000040100008a0000000001100031000007b202000041000000000310004c00000000030000190000000003024019000007b201100197000000000410004c000000000200a019000007b20110009c00000000010300190000000001026019000000000110004c00000a2f0000c13d1eb119b70000040f000000400300043d00000000001304350000002002000039000000000103001900000000030000191eb102430000040f0000000001000416000000000110004c00000a2f0000c13d000000040100008a0000000001100031000007b202000041000000000310004c00000000030000190000000003024019000007b201100197000000000410004c000000000200a019000007b20110009c00000000010300190000000001026019000000000110004c00000a2f0000c13d0000000a01000039000000000201041a000000400100043d0000000000210435000000200200003900000000030000191eb102430000040f0000000001000416000000000110004c00000a2f0000c13d000000040100008a0000000001100031000007b202000041000000000310004c00000000030000190000000003024019000007b201100197000000000410004c000000000200a019000007b20110009c00000000010300190000000001026019000000000110004c00000a2f0000c13d001c00000005001d000000400700043d000007ef0170009c000008490000213d0000006001700039000000400010043f00000002010000390000000000170435000000200570003900000000010000310000000201100367000000000200001900000005032002100000000004350019000000000331034f000000000303043b00000000003404350000000102200039000000020320008c0000067e0000413d0000000001070433000000000110004c0000001c020000290000069e0000613d000007e201000041000000000010043900000004002004430000006001000039000000240010044300008005010000390000004402000039001b00000006001d001a00000005001d001900000007001d1eb102310000040f00000019050000290000001b030000290000001c02000029000007b4011001970000001a0400002900000000001404350000000001050433000000020110008c00000add0000813d000007bf0100004100000000001004350000003201000039000000040010043f000000240200003900000000010000191eb1024d0000040f0000000001000416000000000110004c00000a2f0000c13d0000000003000031000000040130008a000007b202000041000000800410008c00000000040000190000000004024019000007b201100197000000000510004c000000000200a019000007b20110009c00000000010400190000000001026019000000000110004c00000a2f0000c13d00000002010003670000000402100370000000000202043b001c00000002001d000007b40220009c00000a2f0000213d0000002402100370000000000202043b001b00000002001d000007b40220009c00000a2f0000213d0000004402100370000000000202043b001a00000002001d000007b40220009c00000a2f0000213d0000006402100370000000000402043b000007b30240009c00000a2f0000213d0000002302400039000007b205000041000000000632004b00000000060000190000000006058019000007b207300197000007b202200197000000000872004b0000000005008019000000000272013f000007b20220009c00000000020600190000000002056019000000000220004c00000a2f0000c13d0000000402400039000000000121034f000000000201043b00000024014000391eb1195d0000040f00000000040100190000001c010000290000001b020000290000001a030000291eb11bd40000040f000007e402100197000000400100043d0000000000210435000000200200003900000000030000191eb102430000040f0000000001000416000000000110004c00000a2f0000c13d000000040100008a0000000001100031000007b202000041000000000310004c00000000030000190000000003024019000007b201100197000000000410004c000000000200a019000007b20110009c00000000010300190000000001026019000000000110004c00000a2f0000c13d1eb11c460000040f000007e402100197000000400100043d0000000000210435000000200200003900000000030000191eb102430000040f0000000001000416000000000110004c00000a2f0000c13d000000040100008a0000000001100031000007b202000041000000000310004c00000000030000190000000003024019000007b201100197000000000410004c000000000200a019000007b20110009c00000000010300190000000001026019000000000110004c00000a2f0000c13d000000400100043d00000001020000390000000000210435000000200200003900000000030000191eb102430000040f0000000001000416000000000110004c00000a2f0000c13d000000040100008a0000000001100031000007b202000041000000000310004c00000000030000190000000003024019000007b201100197000000000410004c000000000200a019000007b20110009c00000000010300190000000001026019000000000110004c00000a2f0000c13d000000400100043d001a00000001001d000007e201000041000000000010043900000004005004430000002400600443000080050100003900000044020000391eb102310000040f000007b4021001970000001a010000290000000000210435000000200200003900000000030000191eb102430000040f0000000001000416000000000110004c00000a2f0000c13d000000040100008a0000000001100031000007b202000041000000e00310008c00000000030000190000000003024019000007b201100197000000000410004c000000000200a019000007b20110009c00000000010300190000000001026019000000000110004c00000a2f0000c13d00000002010003670000000402100370000000000202043b001c00000002001d000007b40220009c00000a2f0000213d0000002402100370000000000202043b001b00000002001d000007b40220009c00000a2f0000213d0000006402100370000000000202043b001a00000002001d0000004402100370000000000202043b001900000002001d0000008401100370000000000101043b001800000001001d000000ff0110008c00000a2f0000213d000007f20100004100000000001004390000800b0100003900000004020000391eb102310000040f0000001a04000029000000000141004b000008050000213d0000001c010000290000001b0200002900000019030000291eb11a480000040f0000000202000367000000a403200370000000000403043b000000c402200370000000000202043b000000400300043d00000060053000390000000000250435000000400230003900000000004204350000002002300039000000180400002900000000004204350000000000130435000000220500002900000000005504350000000001000414000000010200003900000080040000390000002006000039001a00000005001d1eb101e30000040f000000000110004c00000c2a0000c13d00000001040000310000001a0100002900000000030100190000000001140019000000000141004b00000a2f0000213d000000400100043d0000001f0240018f00000003033003670000000504400272000007970000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b0000078f0000413d000000000520004c000007a60000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f000000000024043500000001020000311eb1024d0000040f0000000001000416000000000110004c00000a2f0000c13d000000040100008a0000000001100031000007b202000041000000400310008c00000000030000190000000003024019000007b201100197000000000410004c000000000200a019000007b20110009c00000000010300190000000001026019000000000110004c00000a2f0000c13d1eb118d10000040f001c00000001001d1eb118da0000040f0000001c02000029000007b40220019700000000002004350000000202000039000000200020043f001b00000001001d0000004002000039001c00000002001d00000000010000191eb1021a0000040f0000001b02000029000007b4022001970000000000200435000000200010043f00000000010000190000001c020000291eb1021a0000040f000000000201041a000000400100043d0000000000210435000000200200003900000000030000191eb102430000040f0000000001000416000000000110004c00000a2f0000c13d0000000002000031000000040120008a000007b203000041000000a00410008c00000000040000190000000004034019000007b201100197000000000510004c000000000300a019000007b20110009c00000000010400190000000001036019000000000110004c00000a2f0000c13d00000002010003670000000403100370000000000303043b001c00000003001d000007b40330009c00000a2f0000213d0000002403100370000000000303043b001b00000003001d000007b40330009c00000a2f0000213d0000006403100370000000000303043b001a00000003001d0000004403100370000000000303043b001900000003001d0000008401100370000000000101043b000007b30310009c00000a2f0000213d00000004011000391eb118b50000040f000007f2030000410000000000300439001800000001001d001700000002001d0000800b0100003900000004020000391eb102310000040f0000001a04000029000000000141004b00000b7e0000a13d000000400100043d000007ff02000041000000000021043500000004020000391eb1024d0000040f0000000001000416000000000110004c00000a2f0000c13d000000040100008a0000000001100031000007b202000041000000000310004c00000000030000190000000003024019000007b201100197000000000410004c000000000200a019000007b20110009c00000000010300190000000001026019000000000110004c00000a2f0000c13d0000000b01000039000000000201041a000000400100043d0000000000210435000000200200003900000000030000191eb102430000040f0000000001000416000000000110004c00000a2f0000c13d000000040100008a0000000001100031000007b202000041000000000310004c00000000030000190000000003024019000007b201100197000000000410004c000000000200a019000007b20110009c00000000010300190000000001026019000000000110004c00000a2f0000c13d0000000901000039000000000201041a0000000a01000039000000000301041a000000400100043d000000200410003900000000003404350000000000210435000000400200003900000000030000191eb102430000040f001a00000003001d0000000001000416000000000110004c00000a2f0000c13d001c00000005001d0000000001000031001b00000006001d1eb118e30000040f000000400700043d000007bb0870009c000008890000a13d000007bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191eb1024d0000040f0000000001000416000000000110004c00000a2f0000c13d000000040100008a0000000001100031000007b202000041000000000310004c00000000030000190000000003024019000007b201100197000000000410004c000000000200a019000007b20110009c00000000010300190000000001026019000000000110004c00000a2f0000c13d0000000901000039000000000201041a000000400100043d0000000000210435000000200200003900000000030000191eb102430000040f0000000001000416000000000110004c00000a2f0000c13d000000040100008a0000000001100031000007b202000041000000000310004c00000000030000190000000003024019000007b201100197000000000410004c000000000200a019000007b20110009c00000000010300190000000001026019000000000110004c00000a2f0000c13d000000400100043d001b00000001001d000007e2010000410000000000100439000000040050044300000060010000390000002400100443000080050100003900000044020000391eb102310000040f000007b4021001970000001b010000290000000000210435000000200200003900000000030000191eb102430000040f000f00000003001d000c00000004001d000a00000006001d000b00000005001d0000004003700039000000400030043f0000000000070435000000200370003900000022040000290000000000430435001800000001001d001900000002001d1eb11b010000040f1eb11a9f0000040f000000180300002900000019020000290000000002230019001900000001001d00000000010300191eb11bb30000040f0000001905000029000001c004500039000000ff0330018f000d00000004001d00000000003404350000006003500039000007b401100197001000000003001d0000000000130435000007b4012001970000002002500039000e00000002001d00000000001204351eb11d440000040f0000001903000029000000a004300039001600000004001d00000000002404350000008002300039001700000002001d000000000012043500000022010000290000001a0200002900000000002104350000000102000039000900000002001d000000200020043f00000040020000391eb1021a0000040f000000000101041a0000001902000029000000c002200039001300000002001d00000000001204350000002201000029000000000101041a001400000001001d000007ea0100004100000017020000290000000002020433001200000002001d00000016020000290000000002020433001100000002001d000000400200043d001800000002001d0000000000120435000007e2010000410000000002000414001500000002001d00000000001004390000001c0100002900000004001004430000002001000039000800000001001d0000002400100443000080050100003900000044020000391eb102310000040f000007b402100197000000040120008c000009070000613d000000040400003900000020060000390000001501000029000000180300002900000000050300191eb101e30000040f000000000110004c000009070000c13d000000220300002900000001040000310000000001340019000000000141004b00000a2f0000213d000000400100043d0000001f0240018f00000003033003670000000504400272000008f60000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000008ee0000413d000000000520004c000009050000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f000000000024043500000001020000311eb1024d0000040f00000022050000290000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600320018f00000018060000290000000002630019000000000332004b00000000030000190000000103004039000007b30420009c0000000004060019000008490000213d0000000103300190000008490000c13d000000400020043f000000200110008c0000091e0000413d0000000003040433000007b40130009c00000b590000a13d000000000105001900000000020500191eb1024d0000040f000007e50310009c00000a3f0000413d000007bf0100004100000000001204350000001101000039000000040010043f000000220100002900000024020000391eb1024d0000040f0000001501000029000000000110004c00000a530000c13d0000001601000029000000000110004c000009360000613d000000010100008a000000160400002900000000414100d90000001904000029000000000141004b000010830000413d0000001901000029000000160400002900000000411400a9000007e80410009c000010830000213d00000019040000290000001705000029000000000445004b000010830000413d000007e60430009c00000a670000213d000000190500002900000017060000290000000002560049000007e6040000410000000003340049000000000456004b0000094c0000613d000000010400008a00000000542400d9000000000434004b000010830000413d00000000322300aa0000108e0000613d00000c260000013d000001c002100039000000400020043f0000002003100039001600000003001d0000002202000029000000000023043500000000002104350000006002100039000000220300002900000000003204350000004002100039001700000002001d0000000000320435000000a003100039001400000003001d000000220200002900000000002304350000008003100039001200000003001d0000000000230435000000e003100039001500000003001d00000022020000290000000000230435000000c003100039001300000003001d00000000002304350000012002100039000000220300002900000000003204350000010002100039000000000032043500000160021000390000002203000029000000000032043500000140021000390000000000320435000001a0021000390000006004000039001100000004001d000000220300002900000000004204350000018001100039001000000001001d00000000003104350000001901000029000000180200002900000000021200191eb11bb30000040f000000ff0330018f00000010040000290000000000340435000007b40220019700000016030000290000000000230435000007b401100197000000170200002900000000001204350000000a01000039000000000101041a0000000902000039000000000202041a00000012030000290000000000230435000000140200002900000000001204351eb11d440000040f00000015030000290000000000230435000000130200002900000000001204350000001a010000291eb11b160000040f00000017020000290000000002020433001a00000002001d000007e20200004100000000002004390000001c02000029000000040020044300000011020000290000002400200443001900000001001d000080050100003900000044020000391eb102310000040f000007b4031001970000001a02000029000007b402200197000000000232004b001800000001001d00000a6e0000c13d000007e20100004100000000001004390000001c0100002900000004001004430000001b010000290000002400100443000080050100003900000044020000391eb102310000040f0000000003010019000000400400043d000007e30140009c000008490000213d0000002001400039000000400010043f000000220100002900000000001404350000001d01000029001a00000001001d00000019010000290000001802000029001c00000003001d1eb11bd40000040f0000001c02000029000007b4022001970000001a0400002900000060034000390000000000230435000007e4021001970000016001400039000000000021043500000080034000390000000002030433000000c004400039001c00000004001d0000000004040433000000000524004b000010830000413d00000000022400490000001a050000290000010004500039001b00000004001d0000000000240435000000a004500039000000000404043300000000030304330000000001010433000007e4011001971eb11e150000040f0000001a040000290000014003400039000000000023043500000120024000390000000000120435000000e0034000390000000004030433000000000514004b000010830000413d000000000114004900000000001304350000001a010000290000002001100039000000000101043300000000020204330000001b030000290000000003030433000000400400043d00000000003404350000006003400039000000220500002900000000002304350000004002400039000000000052043500000020024000390000000000520435000007ae020000410000000003000414000007ae0530009c0000000003028019000007ae0540009c00000000020440190000004002200210000000c003300210000000000223019f000007b406100197000007f7012001c70000800d020000390000000303000039000007f80400004100000000050004111eb11ea70000040f000000010120019000000ace0000c13d00000a2f0000013d00000022030000290000001a020000290000000000230435000007f50400004100000020020000390000000005370019000000000613004b0000044c0000813d0000002005500039000000000604041a00000000006504350000002003300039000000010440003900000a0e0000013d000f0000000d001d00100000000c001d000a0000000b001d000b0000000a001d001300000009001d001900000008001d000c00000007001d000d00000006001d000e00000005001d001100000004001d001200000003001d00000002020003670000001801000029000000000112034f000000000101043b000007b40310009c0000001c0400002900000a2f0000213d00000018030000290000002003300039000000000232034f000000000202043b000000ff0320008c00000afa0000a13d000000000100001900000000020000191eb1024d0000040f00000022020000290000001a03000029000000000032043500000801030000410000002004700039000000000512004b000006020000813d0000000005240019000000000603041a00000000006504350000002002200039000000010330003900000a370000013d000000010200008a000000190300002900000000343200d9000007e6030000410000000003130049000000000534004b000010830000413d000000000114004b000010830000413d000000190100002900000000311300a90000001503000029000000000330004c00000c390000c13d000000000310004c00000c6b0000c13d0000001703000029000007e80330009c000010830000213d00000c720000013d0000001701000029000000000110004c00000a5c0000613d000000010100008a000000170400002900000000414100d90000001904000029000000000141004b000010830000413d0000001901000029000000170400002900000000411400a9000007e80410009c000010830000213d00000019040000290000001605000029000000000445004b000010830000413d000007e50430009c00000c190000413d000007bf0100004100000000001204350000001101000039000000040010043f000000220100002900000024020000391eb1024d0000040f000000400400043d000007e30140009c0000001b02000029000008490000213d0000002001400039000000400010043f000000220100002900000000001404350000001d01000029001a00000001001d000007e20100004100000000001004390000001c010000290000000400100443000000240020044300008005010000390000004402000039001c00000003001d001b00000004001d1eb102310000040f0000000002010019000000190100002900000018030000290000001b040000291eb11bd40000040f0000001a0400002900000060024000390000001c030000290000000000320435000007e40210019700000160014000390000000000210435000000e003400039000000a00440003900000000020404330000000003030433000000000523004b000010830000413d00000000022300490000001a050000290000010003500039001b00000003001d00000000002304350000008003500039000000000303043300000000040404330000000001010433000007e4011001971eb11de50000040f0000001a040000290000014003400039000000000023043500000120024000390000000000120435000000c003400039001c00000003001d0000000003030433000000000413004b000010830000413d00000000011300490000001c0300002900000000001304350000001a01000029000000200110003900000000010104330000001b0300002900000000030304330000000002020433000000400400043d000000400540003900000022060000290000000000250435000000200240003900000000003204350000000000640435000000600240003900000022030000290000000000320435000007ae020000410000000003000414000007ae0530009c0000000003028019000007ae0540009c00000000020440190000004002200210000000c003300210000000000223019f000007b406100197000007f7012001c70000800d020000390000000303000039000007f80400004100000000050004111eb11ea70000040f000000010120019000000a2f0000613d0000001c010000290000000001010433000007f90110009c00000ad80000213d0000001a01000029000000e001100039001b00000001001d0000000001010433000007f90110009c00000d0c0000a13d000000400100043d000007fb02000041000000000021043500000004020000391eb1024d0000040f000007e201000041000000000010043900000004002004430000002400300443000080050100003900000044020000391eb102310000040f0000001a06000029000007b4011001970000001903000029000000400230003900000000001204350000002002000039000000400100043d000000000021043500000000020304330000002003100039000000000023043500000040031000390000002204000029000000000524004b00000b560000813d0000000005060433000007b405500197000000000053043500000001044000390000002006600039000000200330003900000af10000013d00000010030000290000000000230435000000110200002900000000001204351eb11d440000040f000000130300002900000000002304350000001902000029000000000012043500000022010000290000001a0200002900000000002104350000000102000039000400000002001d000000200020043f00000040020000391eb1021a0000040f000000000101041a0000001202000029000000000012043500000013010000290000000001010433000700000001001d00000019010000290000000001010433000600000001001d0000002201000029000000000101041a000800000001001d000007ea01000041000000400200043d001800000002001d0000000000120435000007e2010000410000000002000414000900000002001d00000000001004390000001c0100002900000004001004430000002001000039000500000001001d0000002400100443000080050100003900000044020000391eb102310000040f000007b402100197000000040120008c00000b640000613d000000040400003900000020060000390000000901000029000000180300002900000000050300191eb101e30000040f000000000110004c00000b640000c13d000000220300002900000001040000310000000001340019000000000141004b00000a2f0000213d000000400100043d0000001f0240018f0000000303300367000000050440027200000b450000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00000b3d0000413d000000000520004c00000b540000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f000000000024043500000001020000311eb1024d0000040f000000000213004900000000030000191eb102430000040f0000000b01000039001500000001001d000000000201041a000000000120004c00000e6a0000613d000700000002001d000000000130004c00000c3f0000c13d0000001501000029000000000051041b00000e6a0000013d00000022010000290000000105000031000000200250008c000000200200003900000000020540190000001f02200039000000600320018f00000018060000290000000002630019000000000332004b00000000030000190000000103004039000007b30420009c0000000004060019000008490000213d0000000103300190000008490000c13d000000400020043f000000200250008c00000b7c0000413d0000000002040433001800000002001d000007b40220009c00000cfe0000a13d00000000020100191eb1024d0000040f0000001c010000290000001b0200002900000019030000291eb11a480000040f001a00000001001d0000000003000031000000180100002900000017020000291eb1195d0000040f00000000030100190000000001030433000000410110008c000000000100001900000d3c0000c13d00000040013000390000000002010433000007fc0120009c000000000100001900000d3c0000213d00000060013000390000000001010433001800000003001d00000020033000390000000004030433000000400300043d0000006005300039000000000025043500000040023000390000000000420435000000f801100270000000200230003900000000001204350000001a0100002900000000001304350000000000000435000000000100041400000001020000390000008004000039000000200600003900000000050000191eb101e30000040f000000000110004c00000d390000c13d0000000302000367000000400100043d00000001040000310000001f0340018f000000050440027200000bb80000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b00000bb00000413d000000000530004c00000bc70000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f000000000024043500000001020000311eb1024d0000040f000008020350009c0000001b03000029000008490000813d000a00000004001d0000001804000029000001c004400039000c00000004001d000000400010043f0000000000250435000007e201000041000900000001001d00000000001004390000001c01000029000000040010044300000024003004430000800501000039000800000001001d0000004402000039001b00000002001d000b00000005001d1eb102310000040f000000090200002900000000002004390000001c02000029000000040020044300000060020000390000002400200443000900000001001d00000008010000290000001b020000291eb102310000040f0000000003010019000000160100002900000009020000290000000b040000291eb11bd40000040f0000000c05000029000007e4011001970000000000150435000000120100002900000000030104330000000d0100002900000000040104330000000e010000290000000002010433000c00000005001d0000000001050433000007e40110019700000019050000290000000005050433000000000650004c0000000006000019000000000700001900000c980000613d0000000a07000029000000000674004b00000c8e0000813d000000000640004c00000c080000613d000000010600008a00000000764600d9000000000656004b000010830000413d000000000630004c0000108e0000613d00000000544500a900000000433400d9000000000432004b000010830000413d0000000002320049000000000310004c00000c150000613d000000010300008a00000000431300d9000000000323004b000010830000413d00000000211200a9000008031610012a000000000700001900000c980000013d000000190500002900000016060000290000000002560049000007e6040000410000000003340049000000000456004b00000c240000613d000000010400008a00000000542400d9000000000434004b000010830000413d00000000322300aa0000108e0000613d000007e6311000d100000000212100d90000000102100039000003710000013d0000001a010000290000000001010433000007b4031001970000001c01000029000000000213004b00000d820000c13d000000000230004c00000d820000613d0000001b0200002900000019030000291eb11a1a0000040f000000400100043d0000001a0200002900000000030000191eb102430000040f000000000310004c00000c7c0000c13d0000001603000029000007e80330009c000010830000213d00000c830000013d00000012010000290000001102000029001800000003001d001100000005001d1eb11e450000040f00000018030000290000000702000029000000000421004b00000e6a0000a13d000500000001001d0000000001210049000600000001001d1eb11c460000040f000007e401100197001200000001001d0000001401000029000000000110004c00000c570000613d000000010100008a000000140200002900000000212100d90000000602000029000000000121004b000010830000413d0000001401000029000000060200002900000000211200aa00000c600000613d000000010200008a00000000321200d90000001203000029000000000232004b000010830000413d0000001202000029000007e50220009c00000e440000413d000007bf01000041000000110200002900000000001204350000001101000039000000040010043f000000220100002900000024020000391eb1024d0000040f00000000431200d90000001604000029000000000343004b000010830000413d0000001703000029000007e70330009c000010830000813d000000000321013f0000001702000029000007e6422000d1000000000332004b000010830000213d000000000212001a0000001603000029001700000003001d0000108e0000613d00000c8a0000013d00000000431200d90000001704000029000000000343004b000010830000413d0000001603000029000007e70330009c000010830000813d000000000321013f0000001602000029000007e6422000d1000000000332004b000010830000213d000000000212001a0000108e0000613d000000170300002900000000311300a900000000122100d9000002d90000013d0000000002740049000000000310004c00000c950000613d000000010300008a00000000431300d9000000000323004b000010830000413d00000000211200a9000008031710012a000000000600001900000018010000290000012002100039000b00000002001d00000000007204350000010001100039000a00000001001d0000000000610435000000010100008a001b00000001001d000000000216013f00000019010000290000000001010433000000000221004b000010830000213d0000000001610019000000190200002900000000001204350000000b0100002900000000010104330000001b02000029000000000321013f00000012020000290000000002020433000000000332004b000010830000213d000000000221001900000012010000290000000000210435000000190100002900000000010104331eb11e450000040f00000018020000290000016002200039000600000002001d000500000001001d00000000001204350000002201000029000000000101041a000700000001001d000007ea01000041000000400200043d000900000002001d0000000000120435000007e2010000410000000002000414000800000002001d00000000001004390000001c0100002900000004001004430000002001000039000400000001001d0000002400100443000080050100003900000044020000391eb102310000040f000007b402100197000000040120008c00000d870000613d000000040400003900000020060000390000000801000029000000090300002900000000050300191eb101e30000040f000000000110004c00000d870000c13d000000220300002900000001040000310000000001340019000000000141004b00000a2f0000213d000000400100043d0000001f0240018f0000000303300367000000050440027200000ced0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00000ce50000413d000000000520004c00000cfc0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f000000000024043500000001020000311eb1024d0000040f000300000001001d0000000b01000039000200000001001d000000000101041a000900000001001d000000000110004c000010640000613d0000001801000029000000000110004c00000f9d0000c13d00000002010000290000000302000029000000000021041b000010640000013d0000001a010000290000006005100039000000200610003900000180021000390000012001100039001700000001001d0000000003010433001500000002001d0000000004020433001400000006001d0000000002060433001600000005001d0000000001050433000007b401100197000007b402200197000000ff0440018f1eb11cc10000040f000007b4010000410000002101100180001800000001001d00000dd20000c13d0000001b0100002900000000020104330000001c0100002900000000010104331eb11ca50000040f00000016010000290000000001010433000007b4021001970000001e010000290000000000210435000000170200002900000000020204330000002003100039000000000023043500000001020000390000000803000039000000000023041b000000400200043d001c00000002001d1eb119550000040f00000040020000390000001c0100002900000000030000191eb102430000040f0000000001000433000007b40110019700000018030000290000001c02000029000000000221004b00000d490000c13d000000000110004c00000d490000613d0000001c010000290000001b0200002900000019030000291eb11a1a0000040f0000002202000029000000400100043d00000000030000191eb102430000040f000000400400043d001800000004001d0000004401400039000000400200003900000000002104350000002002400039000007fd01000041001700000002001d000000000012043500000024014000390000001a020000290000000000210435000000640240003900000000010300191eb119400000040f00000018030000290000000001310049000000200210008a00000000002304350000001f01100039000000200200008a001a00000002001d000000000221016f00000000040300190000000001320019000000000221004b00000000020000190000000102004039000007b30310009c000008490000213d0000000102200190000008490000c13d000000400010043f000000010100003900000000020004140000001c03000029000000040330008c00000d760000613d000000000404043300000000010200190000001c020000290000001703000029000000000500001900000000060000191eb101e30000040f0000006002000039000000010300003200000da30000c13d000000000110004c00000d820000613d0000000001020433000000200110008c00000d820000c13d00000020012000390000000001010433000007fd0110009c00000d410000613d000000400100043d000007fe02000041000000000021043500000004020000391eb1024d0000040f0000002201000029001c00000001001d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600320018f00000009020000290000000002230019000000000332004b00000000030000190000000103004039000007b30420009c000008490000213d0000000103300190000008490000c13d000000400020043f000000200110008c00000da00000413d00000009010000290000000001010433000900000001001d000007b40110009c00000fc90000a13d0000001c0100002900000000020100191eb1024d0000040f000007b30230009c000008490000213d0000003f023000390000001a04000029000000000442016f000000400200043d0000000004420019000000000524004b00000000050000190000000105004039000007b30640009c000008490000213d0000000105500190000008490000c13d000000400040043f00000000003204350000002003200039000000030400036700000001060000310000001f0560018f000000050660027200000dc20000613d000000000700001900000005087002100000000009830019000000000884034f000000000808043b00000000008904350000000107700039000000000867004b00000dba0000413d000000000750004c00000d790000613d0000000506600210000000000464034f00000000036300190000000305500210000000000603043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f000000000043043500000d790000013d0000001901000029000007b4011001970000001a02000029001a00000002001d000000000012043500000000030000310000001f0200002900000020010000291eb1195d0000040f0000001a02000029000001a002200039001300000002001d0000000000120435000007eb01000041000000000010043900000018010000290000000400100443000080020100003900000024020000391eb102310000040f000000000110004c000005000000613d000000400400043d000007fa0100004100000000001404350000000401400039000000200200003900000000002104350000001a030000290000000001030433000007b4011001970000002402400039000000000012043500000014010000290000000001010433000007b4011001970000004402400039000000000012043500000040013000390000000001010433000007b4011001970000006402400039000000000012043500000016010000290000000001010433000007b4011001970000008402400039000000000012043500000080013000390000000001010433000000a4024000390000000000120435000000a0013000390000000001010433000000c40240003900000000001204350000001c010000290000000001010433000000e40240003900000000001204350000001b0100002900000000010104330000010402400039000000000012043500000100013000390000000001010433000001240240003900000000001204350000001701000029000000000101043300000144024000390000000000120435000001400130003900000000010104330000016402400039000000000012043500000160013000390000000001010433000007e4011001970000018402400039000000000012043500000015010000290000000001010433000000ff0110018f000001a402400039000000000012043500000013010000290000000001010433000001c402400039000001c00300003900000000003204350000000002000414001500000002001d0000002202000029001a00000002001d001900000004001d000001e4024000391eb119400000040f0000001802000029000000040220008c000010390000613d000000190200002900000000042100490000001a01000029000000000110004c00000fd60000c13d000000150100002900000018020000290000001903000029000000000503001900000000060000191eb101ac0000040f0000000002010019000010120000013d000007e6030000410000001202000029000007e60220009c000000000200001900000e550000613d00000012020000290000000002230049000000010300008a00000000432300d90000000504000029000000000343004b000010830000413d000000050300002900000000322300a90000001203000029000000000330004c00000e5b0000613d000000010300008a000000120400002900000000434300d90000000704000029000000000343004b000010830000413d0000001203000029000000070400002900000000433400a9000000010400008a000700000004001d000000000443013f000000000442004b000010830000213d000000000223001a0000108e0000613d000000120300002900000000313100a9000000000312004b0000001803000029000012840000a13d001800000003001d0000001901000029000000e0021000390000001401000029001200000002001d00000000001204350000001701000029000000000101043300000013020000290000000002020433000000000320004c00000e7a0000613d000000010300008a00000000432300d9000000000313004b000010830000413d0000001404000029000000000340004c0000108e0000613d00000000212100a900000000214100d900000019020000290000010002200039001400000002001d00000000001204350000001601000029000000000101043300000013020000290000000002020433000000000320004c00000e8d0000613d000000010300008a00000000432300d9000000000313004b000010830000413d00000012030000290000000003030433000000000430004c0000108e0000613d00000000212100a900000000213100d900000019020000290000012002200039000600000002001d0000000000120435000000130100002900000000020104330000001a010000291eb11b810000040f0000000f010000291eb11b160000040f00000010020000290000000002020433001a00000002001d000007e202000041001100000002001d00000000002004390000001c0200002900000004002004430000001b020000290000002400200443000700000001001d0000800501000039001b00000001001d0000004402000039000f00000002001d1eb102310000040f000000110200002900000000002004390000001c02000029000000040020044300000060020000390000002400200443001c00000001001d0000001b010000290000000f020000291eb102310000040f000000400400043d001b00000001001d0000001c01000029000007b4021001970000001a01000029000007b401100197000f00000002001d000000000121004b00000019020000290000004001200039001100000001001d0000014001200039000300000001001d0000016001200039000400000001001d0000018001200039000500000001001d000001a001200039001a00000001001d000000200140003900000f0f0000c13d000007e30240009c000008490000213d000000400010043f0000002201000029000000000014043500000007010000290000001b020000290000001c030000291eb11bd40000040f0000001b02000029000007b40220019700000011030000290000000000230435000007e4011001970000001a0200002900000000001204350000001702000029000000000302043300000014020000290000000002020433000000000423004b000010830000413d0000000604000029000000000404043300000016050000290000000005050433000000000645004b000010830000413d000000000445004900000000032300491eb11e150000040f0000000503000029000000000023043500000004020000290000000000120435000000010200008a000000000321013f00000006020000290000000002020433000000000332004b000010830000213d0000000003120019000000060100002900000000003104350000000d0100002900000000010104330000000e020000290000000002020433000007b402200197000000ff0410018f0000001c010000291eb11cc10000040f000000060100002900000000010104330000000302000029000000000012043500000022020000290000001403000029000000000023043500000016020000290000000002020433000000000312004b000010830000413d00000000011200490000001602000029000000000012043500000f500000013d000007e30240009c000008490000213d000000400010043f0000002201000029000000000014043500000007010000290000001c020000290000001b030000291eb11bd40000040f00000011020000290000000f030000290000000000320435000007e4011001970000001a0200002900000000001204350000001402000029000000000302043300000017020000290000000004020433000000000234004b000010830000413d0000000602000029000000000202043300000016050000290000000005050433000000000625004b000010830000413d000000000334004900000000042500491eb11de50000040f0000000503000029000000000023043500000004020000290000000000120435000000010200008a000000000321013f00000014020000290000000002020433000000000332004b000010830000213d0000000003120019000000140100002900000000003104350000000d0100002900000000010104330000000e020000290000000002020433000007b402200197000000ff0410018f0000001b010000291eb11cc10000040f000000140100002900000000010104330000000302000029000000000012043500000022020000290000000603000029000000000023043500000017020000290000000002020433000000000312004b000010830000413d0000000001120049000000170200002900000000001204350000000c01000029000007b401100198001c00000001001d0000120b0000c13d00000016010000290000000002010433000000170100002900000000010104331eb11ca50000040f0000001801000029000000000110004c00000f630000613d00000016010000290000000002010433000000170100002900000000010104331eb11e450000040f0000001502000029000000000012041b000000400100043d001c00000001001d000007bb0110009c000008490000213d00000010010000290000000001010433000000030200002900000000020204330000001c040000290000004003400039000000400030043f00000020034000390000000000230435000007b40110019700000000001404350000000e010000290000000002010433000000140100002900000000010104330000000603000029000000000303043300000013040000290000000004040433000000400500043d00000040065000390000000000460435000000200450003900000000003404350000000000150435000007ae010000410000000003000414000007ae0430009c0000000003018019000007ae0450009c00000000010540190000004001100210000000c003300210000000000113019f000007f0011001c7000007b4062001970000800d020000390000000303000039000007f10400004100000000050004111eb11ea70000040f000000010120019000000a2f0000613d00000008010000390000000902000029000000000021041b000000400200043d001b00000002001d0000001c010000291eb119550000040f00000040020000390000001b0100002900000000030000191eb102430000040f000000060100002900000007020000291eb11e450000040f00000000020100190000000901000029000700000002001d000000000112004b000010640000a13d000000090100002900000007020000290000000001120049000100000001001d1eb11c460000040f000007e401100197000600000001001d0000000801000029000000000110004c00000fb50000613d000000010100008a000000080200002900000000212100d90000000102000029000000000121004b000010830000413d0000000801000029000000010200002900000000211200aa00000fbe0000613d000000010200008a00000000321200d90000000603000029000000000232004b000010830000413d0000000602000029000007e50220009c0000103f0000413d000007bf01000041000000030200002900000000001204350000001101000039000000040010043f000000220100002900000024020000391eb1024d0000040f0000000b01000039000300000001001d000000000101041a000800000001001d000000000110004c000014530000613d0000000901000029000000000110004c0000115d0000c13d0000001c010000290000000302000029000000000012041b000014530000013d000007ae010000410000001903000029000007ae0230009c000000000201001900000000020340190000004002200210000007ae0340009c000000000301001900000000030440190000006003300210000000000223019f0000001504000029000007ae0340009c0000000001044019000000c001100210000000000112019f000007c0011001c700008009020000390000001a03000029000000180400002900000000050000191eb11ea70000040f000000190900002900000000030100190000006003300270000007ae033001970000001a05000029000000000453004b00000000050340190000001f0450018f000000050550027200000fff0000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000ff70000413d000000000640004c0000100f0000613d0000000505500210000000000651034f000000190700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c000010390000c13d00000001040000310000001a010000290000000001140019000000000141004b00000a2f0000213d000000400100043d0000001f0240018f0000001a0300002900000003033003670000000504400272000010280000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000010200000413d000000000520004c000010370000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f000000000024043500000001020000311eb1024d0000040f0000001901000029000007b30110009c000008490000213d0000001901000029000000400010043f00000d210000013d000007e6030000410000000602000029000007e60220009c0000000002000019000010500000613d00000006020000290000000002230049000000010300008a00000000432300d90000000704000029000000000343004b000010830000413d000000070300002900000000322300a90000000603000029000000000330004c000010560000613d000000010300008a000000060400002900000000434300d90000000904000029000000000343004b000010830000413d0000000603000029000000090400002900000000433400a9000000010400008a000900000004001d000000000443013f000000000442004b000010830000213d000000000223001a0000108e0000613d000000060300002900000000313100a9000000000312004b000013980000a13d0000000f01000029000000080200002900000000002104350000001901000029000000000101043300000012020000290000000002020433000000000320004c000010710000613d000000010300008a00000000432300d9000000000313004b000010830000413d0000000803000029000000000330004c0000108e0000613d00000000212100a9000000080200002900000000212100d90000000e0200002900000000001204350000001301000029000000000101043300000012020000290000000002020433000000000320004c0000108a0000613d000000010300008a00000000432300d9000000000313004b0000108a0000813d000007bf0100004100000000001004350000001101000039000000040010043f000000240200003900000000010000191eb1024d0000040f0000000f030000290000000003030433000000000430004c000010950000c13d000007bf0100004100000000001004350000001201000039000000040010043f000000240200003900000000010000191eb1024d0000040f00000000212100a900000000213100d90000000d020000290000000000120435000000120100002900000000020104330000001a010000291eb11b810000040f000007e202000041001a00000002001d0000000e010000290000000001010433000700000001001d00000011010000290000000001010433000600000001001d00000000002004390000001c0100002900000004001004430000000c0100002900000024001004430000800501000039000900000001001d0000004402000039000800000002001d1eb102310000040f000000100200002900000000030204330000000602000029000007b402200197000000ff0430018f00000007030000291eb11cc10000040f00000011010000290000000001010433000600000001001d0000000d010000290000000001010433000700000001001d0000001a0100002900000000001004390000001c0100002900000004001004430000001b010000290000002400100443000000090100002900000008020000291eb102310000040f000000100200002900000000030204330000000602000029000007b402200197000000ff0430018f00000007030000291eb11cc10000040f0000000e01000029000000000101043300000019030000290000000002030433000000000112004900000000001304350000000d01000029000000000101043300000013030000290000000002030433000000000212004900000000002304350000001701000029000007b401100198001a00000001001d000011000000c13d000000190100002900000000010104331eb11ca50000040f0000001801000029000000000110004c000010e90000613d00000013010000290000000002010433000000190100002900000000010104331eb11e450000040f0000000202000029000000000012041b000000400500043d000007ef0150009c000008490000213d0000006001500039000000400010043f0000000201000039000000000015043500000022010000290000000002010019000000400600043d0000003f0320008c00000040036000390000002007600039000011880000213d000007bb0460009c000008490000213d000000400030043f00000000001704350000000000160435000000200220003900000000035200190000000000630435000010f20000013d00000014010000291eb11b160000040f000007b4011001970000000b0200002900000000001204350000000003000031000000160100002900000015020000291eb1195d0000040f0000000a020000290000000000120435000007eb0100004100000000001004390000001a010000290000000400100443000080020100003900000024020000391eb102310000040f0000000a0a0000290000000b09000029000000000110004c000000120300002900000011040000290000000e050000290000000d0600002900000019070000290000001308000029000000100b0000290000000f0c000029000005000000613d000000400d00043d000007ee0100004100000000001d04350000000401d00039000000050200002900000000002104350000000001090433000007b4011001970000002402d0003900000000001204350000000001040433000007b4011001970000004402d00039000000000012043500000000010704330000006402d00039000000000012043500000000010804330000008402d0003900000000001204350000000001030433000000a402d00039000000000012043500000000010c0433000000c402d0003900000000001204350000000001050433000000e402d00039000000000012043500000000010604330000010402d00039000000000012043500000000010b0433000000ff0110018f0000012402d00039000000000012043500000000010a04330000014402d00039000001400300003900000000003204350000000002000414001500000002001d0000002202000029001600000002001d00170000000d001d0000016402d000391eb119400000040f0000001a02000029000000040220008c0000131b0000613d000000170200002900000000042100490000001601000029000000000110004c000012b80000c13d00000015010000290000001a020000290000001703000029000000000503001900000000060000191eb101ac0000040f0000000002010019000012f40000013d0000000502000029000000000120004c0000001c0100002900000000020160190000000801000029000500000002001d000000000112004b000014530000a13d000000080100002900000005020000290000000001120049000100000001001d1eb11c460000040f000007e401100197000200000001001d0000000701000029000000000110004c000011750000613d0000001b01000029000000070200002900000000212100d90000000102000029000000000121004b000010830000413d0000000701000029000000010200002900000000211200aa0000117e0000613d0000001b0200002900000000321200d90000000203000029000000000232004b000010830000413d0000000202000029000007e50220009c000013230000413d000007bf020000410000001c0100002900000000002104350000001102000039000000040020043f00000024020000391eb1024d0000040f000007bb0160009c000008490000213d0000000e010000290000000001010433001900000001001d000000400030043f000007e20100004100000000001004390000001c0100002900000004001004430000000c01000029000000240010044300008005010000390000004402000039001a00000005001d001800000006001d001700000007001d1eb102310000040f0000001b02000029000000190300002900000017040000290000000000340435000007b4011001970000001803000029000000000403001900000000001304350000001a010000290000000001010433000000000110004c0000069e0000613d0000001a03000029000000200130003900000000004104350000000001030433000000000110004c0000069e0000613d000000400100043d001900000001001d000007bb0110009c0000001a03000029000008490000213d0000000d010000290000000001010433001800000001001d00000019010000290000004001100039000000400010043f000007e20100004100000000001004390000001c0100002900000004001004430000002400200443000080050100003900000044020000391eb102310000040f0000001903000029000000200230003900000018040000290000000000420435000007b40110019700000000001304350000001a010000290000000001010433000000020110008c0000069e0000413d0000001a020000290000004001200039000000190300002900000000003104350000000001020433000000020110008c0000069e0000413d000000110100002900000000020104330000000e0100002900000000010104330000000d03000029000000000303043300000012040000290000000004040433000000400500043d00000040065000390000000000460435000000200450003900000000003404350000000000150435000007ae010000410000000003000414000007ae0430009c0000000003018019000007ae0450009c00000000010540190000004001100210000000c003300210000000000113019f000007f0011001c7000007b4062001970000800d020000390000000303000039000007f10400004100000000050004111eb11ea70000040f000000010120019000000a2f0000613d00000008010000390000000402000029000000000021041b000000400100043d000000050200002900000000002104350000001a08000029000000000208043300000020031000390000000000230435000000220300002900000000040100190000004005400039000000000623004b0000166e0000813d000000200880003900000000060804330000000007060433000007b4077001970000000000750435000000600440003900000020066000390000000006060433000000000064043500000001033000390000000004050019000011fc0000013d0000000701000029000007b4011001970000001902000029000000000012043500000000030000310000000b010000290000000a020000291eb1195d0000040f0000001902000029000001e002200039000f00000002001d0000000000120435000007eb0100004100000000001004390000001c010000290000000400100443000080020100003900000024020000391eb102310000040f000000000110004c000005000000613d000000400400043d0000080001000041000000000014043500000004014000390000000802000029000000000021043500000019010000290000000001010433000007b401100197000000240240003900000000001204350000000e010000290000000001010433000007b4011001970000004402400039000000000012043500000011010000290000000001010433000007b4011001970000006402400039000000000012043500000010010000290000000001010433000007b4011001970000008402400039000000000012043500000017010000290000000001010433000000a402400039000000000012043500000016010000290000000001010433000000c402400039000000000012043500000013010000290000000001010433000000e40240003900000000001204350000001201000029000000000101043300000104024000390000000000120435000000140100002900000000010104330000012402400039000000000012043500000006010000290000000001010433000001440240003900000000001204350000000301000029000000000101043300000164024000390000000000120435000000040100002900000000010104330000018402400039000000000012043500000005010000290000000001010433000001a40240003900000000001204350000001a010000290000000001010433000007e401100197000001c40240003900000000001204350000000d010000290000000001010433000000ff0110018f000001e40240003900000000001204350000000f0100002900000000010104330000020402400039000002000300003900000000003204350000000002000414001900000002001d0000002202000029001a00000002001d001b00000004001d00000224024000391eb119400000040f0000001c02000029000000040220008c000013920000613d0000001b0200002900000000042100490000001a01000029000000000110004c0000132f0000c13d00000019010000290000001c020000290000001b03000029000000000503001900000000060000191eb101ac0000040f00000000020100190000136b0000013d00000000122100d90000000001030019000600000002001d1eb11acc0000040f000007eb01000041000000000010043900000018010000290000000400100443000080020100003900000024020000391eb102310000040f00000011050000290000001803000029000000000110004c0000091e0000613d000000400400043d0000008401400039000000a002000039000000000021043500000064014000390000001202000029000000000021043500000044014000390000000602000029000000000021043500000024014000390000001a020000290000000000210435000007ec010000410000000000140435000000040140003900000009020000290000000000210435001100000004001d000000a4014000390000002202000029001200000002001d00000000002104350000000001000414000000040230008c000014290000613d0000001202000029000000000220004c000013cc0000c13d000000c40400003900000018020000290000001103000029000000000503001900000000060000191eb101ac0000040f0000000002010019000014020000013d000007ae010000410000001703000029000007ae0230009c000000000201001900000000020340190000004002200210000007ae0340009c000000000301001900000000030440190000006003300210000000000223019f0000001504000029000007ae0340009c0000000001044019000000c001100210000000000112019f000007c0011001c7000080090200003900000016030000290000001a0400002900000000050000191eb11ea70000040f000000170900002900000000030100190000006003300270000007ae033001970000001605000029000000000453004b00000000050340190000001f0450018f0000000505500272000012e10000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000012d90000413d000000000640004c000012f10000613d0000000505500210000000000651034f000000170700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c0000131b0000c13d000000010400003100000016010000290000000001140019000000000141004b00000a2f0000213d000000400100043d0000001f0240018f0000001603000029000000030330036700000005044002720000130a0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000013020000413d000000000520004c000013190000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f000000000024043500000001020000311eb1024d0000040f0000001701000029000007b30110009c000008490000213d0000001701000029000000400010043f00000013010000290000000002010433000010dc0000013d000007e6030000410000000202000029000007e60220009c00000000020000190000143a0000c13d0000001b03000029000000020400002900000000434300d90000000804000029000000000343004b000010830000413d000014460000013d000007ae010000410000001b03000029000007ae0230009c000000000201001900000000020340190000004002200210000007ae0340009c000000000301001900000000030440190000006003300210000000000223019f0000001904000029000007ae0340009c0000000001044019000000c001100210000000000112019f000007c0011001c700008009020000390000001a030000290000001c0400002900000000050000191eb11ea70000040f0000001b0900002900000000030100190000006003300270000007ae033001970000001a05000029000000000453004b00000000050340190000001f0450018f0000000505500272000013580000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000013500000413d000000000640004c000013680000613d0000000505500210000000000651034f0000001b0700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c000013920000c13d00000001040000310000001a010000290000000001140019000000000141004b00000a2f0000213d000000400100043d0000001f0240018f0000001a0300002900000003033003670000000504400272000013810000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000013790000413d000000000520004c000013900000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f000000000024043500000001020000311eb1024d0000040f0000001b01000029000007b30110009c000008490000213d0000001b01000029000000400010043f00000f540000013d00000000122100d90000001801000029000700000002001d1eb11acc0000040f000007eb01000041000000000010043900000018010000290000000400100443000080020100003900000024020000391eb102310000040f000000000110004c000000030100002900000b7c0000613d000000400300043d0000008401300039000000a002000039000000000021043500000064013000390000000602000029000000000021043500000044013000390000000702000029000000000021043500000024013000390000001a020000290000000000210435000007ec010000410000000000130435000000040130003900000004020000290000000000210435000300000003001d000000a4013000390000002202000029000600000002001d000000000021043500000000010004140000001802000029000000040220008c0000162b0000613d0000000602000029000000000220004c000015ce0000c13d000000c40400003900000018020000290000000303000029000000000503001900000000060000191eb101ac0000040f0000000002010019000016040000013d000007ae020000410000001104000029000007ae0340009c00000000030200190000000003044019000007ae0410009c0000000001028019000000c0011002100000004002300210000000000112019f000007ed011001c700008009020000390000001203000029000000180400002900000000050000191eb11ea70000040f000000110900002900000000030100190000006003300270000007ae033001970000001205000029000000000453004b00000000050340190000001f0450018f0000000505500272000013ef0000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000013e70000413d000000000640004c000013ff0000613d0000000505500210000000000651034f000000110700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c000014290000c13d000000010400003100000012010000290000000001140019000000000141004b00000a2f0000213d000000400100043d0000001f0240018f000000120300002900000003033003670000000504400272000014180000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000014100000413d000000000520004c000014270000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f000000000024043500000001020000311eb1024d0000040f0000001101000029000007b30110009c000008490000213d0000001101000029000000400010043f00000007010000290000000602000029000000000112013f0000001402000029000000000112004b000010830000213d000000140100002900000006020000290000000001120019001400000001001d000000180300002900000e6a0000013d000000020200002900000000022300490000001b0300002900000000432300d90000000504000029000000000343004b000010830000413d000000050300002900000000323200a90000000203000029000000000330004c000013280000c13d0000000203000029000000080400002900000000434300a90000001b04000029000000000443013f000000000442004b000010830000213d000000000232001a0000108e0000613d000000020300002900000000311300a9000000000312004b0000163b0000a13d000000180100002900000180011000390000000703000029001a00000001001d000000000031043500000010010000290000000002010433000000000130004c0000146f0000c13d000003e70120008c000014680000a13d000003e80120008a0000001802000029000001a002200039001b00000002001d00000000001204350000001c01000029000000000101041a000003e90200008a000000000221004b000014850000a13d000007bf020000410000001c0100002900000000002104350000001102000039000000040020043f00000024020000391eb1024d0000040f00000006010000290000000001010433000000000312004b000010830000413d0000000003120049000000000212004b0000147b0000613d0000001b0200002900000000423200d90000000704000029000000000242004b000010830000413d000000000210004c0000108e0000613d0000001802000029000001a004200039000000070200002900000000322300a900000000121200d9001b00000004001d0000000000240435000014a80000013d000003e8021000390000001c01000029001c00000001001d000000000021041b00000000001104350000000102000039000000200020043f00000040020000391eb1021a0000040f000000000201041a000003e802200039000000000021041b000003e801000039000000400200043d0000000000120435000007ae010000410000000003000414000007ae0430009c0000000003018019000007ae0420009c00000000010240190000004001100210000000c002300210000000000112019f000007f3011001c70000800d020000390000000303000039000007f4040000410000001c0500002900000000060500191eb11ea70000040f000000010120019000000a2f0000613d0000001b010000290000000002010433000000000120004c000014af0000c13d000000400100043d0000080602000041000000000021043500000004020000391eb1024d0000040f0000000f010000290000000001010433000007b4011001971eb11acc0000040f0000001501000029000007b401100198001500000001001d000014ed0000c13d00000011010000290000000002010433000000170100002900000000010104331eb11ca50000040f0000000901000029000000000110004c000014c30000613d000000100100002900000000010104330000000302000029000000000012041b0000000f0100002900000000020104330000000e0100002900000000010104330000000d0300002900000000030304330000001b040000290000000004040433000000400500043d00000040065000390000000000460435000000200450003900000000003404350000000000150435000007ae010000410000000003000414000007ae0430009c0000000003018019000007ae0450009c00000000010540190000004001100210000000c003300210000000000113019f000007f0011001c7000007b4062001970000800d020000390000000303000039000008050400004100000000050004111eb11ea70000040f000000010120019000000a2f0000613d0000001b01000029000000000201043300000001010000390000000803000039000000000013041b000000400100043d0000000000210435000000200200003900000000030000191eb102430000040f0000001601000029000007b401100197000000180200002900000000001204350000000003000031000000140100002900000013020000291eb1195d0000040f0000001802000029000001e002200039001400000002001d0000000000120435000007eb01000041000000000010043900000015010000290000000400100443000080020100003900000024020000391eb102310000040f000000000110004c000015050000c13d0000001c0100002900000000020100191eb1024d0000040f000000400400043d0000080401000041000000000014043500000004014000390000000402000029000000000021043500000018010000290000000001010433000007b401100197000000240240003900000000001204350000000f010000290000000001010433000007b401100197000000440240003900000000001204350000001901000029000000000101043300000064024000390000000000120435000000120100002900000000010104330000008402400039000000000012043500000017010000290000000001010433000000a402400039000000000012043500000011010000290000000001010433000000c40240003900000000001204350000000e010000290000000001010433000000e40240003900000000001204350000000d010000290000000001010433000001040240003900000000001204350000000a010000290000000001010433000001240240003900000000001204350000000b01000029000000000101043300000144024000390000000000120435000000100100002900000000010104330000016402400039000000000012043500000006010000290000000001010433000001840240003900000000001204350000001a010000290000000001010433000001a40240003900000000001204350000001b010000290000000001010433000001c40240003900000000001204350000000c010000290000000001010433000007e401100197000001e4024000390000000000120435000000140100002900000000010104330000020402400039000002000300003900000000003204350000000002000414001a00000002001d001600000004001d00000224024000391eb119400000040f0000001502000029000000040220008c000015c80000613d000000160200002900000000042100490000001c01000029000000000110004c000015640000c13d0000001a0100002900000015020000290000001603000029000000000503001900000000060000191eb101ac0000040f0000000002010019000015a10000013d000007ae010000410000001603000029000007ae0230009c000000000201001900000000020340190000004002200210000007ae0340009c000000000301001900000000030440190000006003300210000000000223019f0000001a04000029000007ae0340009c0000000001044019000000c001100210000000000112019f000007c0011001c700008009020000390000001c03000029001c00000003001d000000150400002900000000050000191eb11ea70000040f000000160900002900000000030100190000006003300270000007ae033001970000001c05000029000000000453004b00000000050340190000001f0450018f00000005055002720000158e0000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000015860000413d000000000640004c0000159e0000613d0000000505500210000000000651034f000000160700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c000015c80000c13d00000001040000310000001c010000290000000001140019000000000141004b00000a2f0000213d000000400100043d0000001f0240018f0000001c0300002900000003033003670000000504400272000015b70000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000015af0000413d000000000520004c000015c60000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f000000000024043500000001020000311eb1024d0000040f0000001601000029000007b30110009c000008490000213d0000001601000029000000400010043f000014b70000013d000007ae020000410000000304000029000007ae0340009c00000000030200190000000003044019000007ae0410009c0000000001028019000000c0011002100000004002300210000000000112019f000007ed011001c700008009020000390000000603000029000000180400002900000000050000191eb11ea70000040f000000030900002900000000030100190000006003300270000007ae033001970000000605000029000000000453004b00000000050340190000001f0450018f0000000505500272000015f10000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000015e90000413d000000000640004c000016010000613d0000000505500210000000000651034f000000030700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c0000162b0000c13d000000010400003100000006010000290000000001140019000000000141004b00000a2f0000213d000000400100043d0000001f0240018f0000000603000029000000030330036700000005044002720000161a0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000016120000413d000000000520004c000016290000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f000000000024043500000001020000311eb1024d0000040f0000000301000029000007b30110009c000008490000213d0000000301000029000000400010043f00000009010000290000000702000029000000000112013f0000000802000029000000000112004b000010830000213d000000080100002900000007020000290000000001120019000800000001001d000010640000013d00000000122100d90000000901000029000800000002001d1eb11acc0000040f000007eb01000041000000000010043900000009010000290000000400100443000080020100003900000024020000391eb102310000040f000000000110004c00000da00000613d000000400300043d0000008401300039000000a002000039000000000021043500000064013000390000000202000029000000000021043500000044013000390000000802000029000000000021043500000024013000390000001a020000290000000000210435000007ec010000410000000000130435000000040130003900000001020000390000000000210435000500000003001d000000a4013000390000002202000029001c00000002001d000000000021043500000000010004140000000902000029000000040220008c000016cd0000613d0000001c02000029000000000220004c000016710000c13d000000c40400003900000009020000290000000503000029000000000503001900000000060000191eb101ac0000040f0000000002010019000016a60000013d000000000215004900000000030000191eb102430000040f000007ae02000041000007ae0310009c00000000010280190000000504000029000007ae0340009c00000000020440190000004002200210000000c001100210000000000121019f000007ed011001c700008009020000390000001c03000029000000090400002900000000050000191eb11ea70000040f000000050900002900000000030100190000006003300270000007ae033001970000001c05000029000000000453004b00000000050340190000001f0450018f0000000505500272000016930000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b0000168b0000413d000000000640004c000016a30000613d0000000505500210000000000651034f000000050700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c000016cd0000c13d00000001040000310000001c010000290000000001140019000000000141004b00000a2f0000213d000000400100043d0000001f0240018f0000001c0300002900000003033003670000000504400272000016bc0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000016b40000413d000000000520004c000016cb0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f000000000024043500000001020000311eb1024d0000040f0000000501000029000007b30110009c000008490000213d0000000501000029000000400010043f0000001b010000290000000802000029000000000112013f0000000702000029000000000112004b000010830000213d000000070100002900000008020000290000000001120019000700000001001d000014530000013d00000000040100190000080b0120009c000017000000813d0000003f01200039000000200500008a000000000551016f000000400100043d0000000005510019000000000615004b00000000060000190000000106004039000007b30750009c000017000000213d0000000106600190000017000000c13d000000400050043f00000000002104350000000005420019000000000335004b000017070000213d00000020031000390000000005000019000000000625004b000016fb0000813d00000000063500190000000007450019000000000707043300000000007604350000002005500039000016f30000013d000000000425004b000016ff0000a13d00000000022300190000000000020435000000000001042d000007bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191eb1024d0000040f000000000100001900000000020000191eb1024d0000040f000000010210019000000001011002700000007f0310018f00000000010360190000001f0310008c00000000030000190000000103002039000000010330018f000000000232004b000017150000c13d000000000001042d000007bf0100004100000000001004350000002201000039000000040010043f000000240200003900000000010000191eb1024d0000040f0005000000000002000300000002001d000200000001001d0000000001010433000400000001001d0000080b0110009c0000182c0000813d0000000401000039000500000001001d000000000101041a1eb1170a0000040f0000000002010019000000200120008c0000000406000029000017410000413d00000005010000290000000000100435000100000002001d000000200200003900000000010000191eb1021a0000040f00000004060000290000001f026000390000000502200270000000200360008c0000000003020019000000000300401900000001020000290000001f02200039000000050220027000000000022100190000000001310019000000000321004b000017410000813d000000000001041b00000001011000390000173c0000013d0000001f0160008c000017590000a13d000000050100002900000000001004350000002002000039000100000002001d00000000010000191eb1021a0000040f00000001080000290000000406000029000000200200008a000000000226016f000000000300001900000003050000290000000207000029000000000423004b0000000004780019000017680000813d0000000004040433000000000041041b000000200330003900000020088000390000000101100039000017500000013d000000000160004c0000000001000019000000050400002900000003050000290000000202000029000017610000613d000000200120003900000000010104330000000302600210000000010300008a000000000223022f000000000232013f000000000221016f0000000101600210000017750000013d000000000262004b000017720000813d0000000302600210000000f80220018f000000010300008a000000000223022f000000000232013f0000000003040433000000000223016f000000000021041b000000010100003900000001026002100000000504000029000000000112019f000000000014041b0000000001050433000400000001001d000007b30110009c0000182c0000213d0000000501000039000200000001001d000000000101041a1eb1170a0000040f0000000002010019000000200120008c0000000405000029000017990000413d00000002010000290000000000100435000100000002001d000000200200003900000000010000191eb1021a0000040f00000004050000290000001f025000390000000502200270000000200350008c0000000003020019000000000300401900000001020000290000001f02200039000000050220027000000000022100190000000001310019000000000321004b000017990000813d000000000001041b0000000101100039000017940000013d0000001f0150008c000017b00000a13d000000020100002900000000001004350000002002000039000100000002001d00000000010000191eb1021a0000040f00000001070000290000000406000029000000200200008a000000000226016f00000000030000190000000305000029000000000423004b0000000004570019000017be0000813d0000000004040433000000000041041b000000200330003900000020077000390000000101100039000017a70000013d000000000150004c000000000100001900000005020000290000000303000029000017b70000613d000000200130003900000000010104330000000304500210000000010300008a000000000443022f000000000334013f000000000331016f0000000101500210000017cb0000013d000000000262004b000017c80000813d0000000302600210000000f80220018f000000010300008a000000000223022f000000000232013f0000000003040433000000000223016f000000000021041b000000010100003900000001036002100000000502000029000000000113019f0000000203000029000000000013041b0000080c0100004100000000001004390000800b010000391eb102310000040f0000000602000039000000000012041b0000000501000029000000000101041a000300000001001d000000400200043d000400000002001d1eb1170a0000040f000000030200002900000004050000290000000003010019000000000035043500000020065000390000000101200190000018190000c13d000001000100008a000000000112016f0000000000160435000000000130004c000000200200003900000000020060190000003f01200039000000200200008a000000000221016f0000000001520019000000000221004b00000000020000190000000102004039000007b30310009c0000182c0000213d00000001022001900000182c0000c13d000000400010043f000000000205043300000000010600191eb1021a0000040f000000400300043d000500000003001d0000004002300039000000000012043500000060013000390000080d02000041000000000021043500000020023000390000080e01000041000400000002001d00000000001204350000080c0100004100000000001004390000800b0100003900000004020000391eb102310000040f0000000504000029000000a00240003900000000030004100000000000320435000000800240003900000000001204350000000002040019000000a00100003900000000001204350000080f0120009c0000182c0000213d000000c001200039000000400010043f000000000202043300000004010000291eb1021a0000040f0000000702000039000000000012041b000000000001042d0000000501000029000000000010043500000020020000390000000001000019000500000006001d000300000003001d1eb1021a0000040f0000000307000029000000050600002900000004050000290000000002000019000000000372004b000017e70000813d0000000003260019000000000401041a000000000043043500000020022000390000000101100039000018240000013d000007bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191eb1024d0000040f0000000002010019000000400400043d00000004010000390000000000140435000000200340003900000810010000410000000000130435000007bb0140009c000018ab0000213d0000004001400039000000400010043f00000001010000390000000005000414000000040620008c000018470000613d00000000040404330000000001050019000000000500001900000000060000191eb101e30000040f00000060020000390000000103000032000018780000613d000007b30230009c000018ab0000213d0000003f02300039000000200400008a000000000442016f000000400200043d0000000004420019000000000524004b00000000050000190000000105004039000007b30640009c000018ab0000213d0000000105500190000018ab0000c13d000000400040043f00000000003204350000002003200039000000030400036700000001060000310000001f0560018f0000000506600272000018690000613d000000000700001900000005087002100000000009830019000000000884034f000000000808043b00000000008904350000000107700039000000000867004b000018610000413d000000000750004c000018780000613d0000000506600210000000000464034f00000000036300190000000305500210000000000603043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f0000000000430435000000000110004c000018a20000613d0000000001020433000007b2030000410000001f0410008c00000000040000190000000004032019000007b205100197000000000650004c0000000003008019000007b20550009c000000000304c019000000000330004c000018b20000613d00000020032000390000000004030433000007b30540009c000018b20000213d000000000313001900000000012400190000003f02100039000007b204000041000000000532004b00000000050000190000000005048019000007b202200197000007b206300197000000000762004b0000000004008019000000000262013f000007b20220009c00000000020500190000000002046019000000000220004c000018b20000c13d0000002002100039000000000202043300000040011000391eb116dd0000040f00000001030000390000000002010019000018a90000013d000000400200043d000007e30120009c000018ab0000213d0000002001200039000000400010043f000000000002043500000000030000190000000001030019000000000001042d000007bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191eb1024d0000040f000000000100001900000000020000191eb1024d0000040f0000001f03100039000007b204000041000000000523004b00000000050000190000000005044019000007b206200197000007b203300197000000000763004b000000000400a019000000000363013f000007b20330009c00000000030500190000000003046019000000000330004c000018ce0000613d0000000203100367000000000303043b000007b30430009c000018ce0000213d00000020011000390000000004310019000000000224004b000018ce0000213d0000000002030019000000000001042d000000000100001900000000020000191eb1024d0000040f00000004010000390000000201100367000000000101043b000008110210009c000018d70000813d000000000001042d000000000100001900000000020000191eb1024d0000040f00000024010000390000000201100367000000000101043b000008110210009c000018e00000813d000000000001042d000000000100001900000000020000191eb1024d0000040f00050000000000020000000005010019000000040150008a000007b2020000410000007f0310008c00000000030000190000000003022019000007b201100197000000000410004c0000000002008019000007b20110009c00000000010300190000000001026019000000000110004c000019170000613d00000004010000390000000201100367000000000101043b000007b30210009c000019170000213d00000004011000390000000002050019000500000005001d1eb118b50000040f0000000503000029000400000001001d000300000002001d00000002010003670000002402100370000000000202043b000200000002001d000007b40220009c000019170000213d0000004402100370000000000202043b000100000002001d000007b40220009c000019170000213d0000006401100370000000000101043b000007b30210009c000019170000213d000000040110003900000000020300191eb118b50000040f000000000501001900000000060200190000000401000029000000030200002900000002030000290000000104000029000000000001042d000000000100001900000000020000191eb1024d0000040f000000010210019000000001011002700000007f0310018f00000000010360190000001f0310008c00000000030000190000000103002039000000010330018f000000000232004b000019250000c13d000000000001042d000007bf0100004100000000001004350000002201000039000000040010043f000000240200003900000000010000191eb1024d0000040f0000001f02200039000000200300008a000000000232016f0000000001120019000000000221004b00000000020000190000000102004039000007b30310009c000019390000213d0000000102200190000019390000c13d000000400010043f000000000001042d000007bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191eb1024d0000040f0000000003010433000000000032043500000020022000390000000004000019000000000534004b0000194c0000813d00000000054200190000002004400039000000000614001900000000060604330000000000650435000019440000013d000000000134004b000019500000a13d000000000132001900000000000104350000001f01300039000000200300008a000000000131016f0000000001120019000000000001042d0000000003010433000007b40330019700000000003204350000002002200039000000200110003900000000010104330000000000120435000000000001042d00000000040100190000080b0120009c000019910000813d0000003f01200039000000200500008a000000000551016f000000400100043d0000000005510019000000000615004b00000000060000190000000106004039000007b30750009c000019910000213d0000000106600190000019910000c13d000000400050043f00000000002104350000000005420019000000000335004b000019980000213d0000001f0520018f0000000204400367000000200310003900000005062002720000197f0000613d000000000700001900000005087002100000000009830019000000000884034f000000000808043b00000000008904350000000107700039000000000867004b000019770000413d000000000750004c0000198e0000613d0000000506600210000000000464034f00000000066300190000000305500210000000000706043300000000075701cf000000000757022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000474019f000000000046043500000000022300190000000000020435000000000001042d000007bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191eb1024d0000040f000000000100001900000000020000191eb1024d0000040f000000040110008a000007b2020000410000005f0310008c00000000030000190000000003022019000007b201100197000000000410004c0000000002008019000007b20110009c00000000010300190000000001026019000000000110004c000019b40000613d00000002020003670000000401200370000000000101043b000007b40310009c000019b40000213d0000004403200370000000000303043b000007b40430009c000019b40000213d0000002402200370000000000202043b000000000001042d000000000100001900000000020000191eb1024d0000040f00030000000000020000080c0100004100000000001004390000800b010000390000000402000039000300000002001d1eb102310000040f0000000602000039000000000202041a000000000121004b000019c50000c13d0000000701000039000000000101041a00001a060000013d0000000301000029000000000101041a000100000001001d000000400200043d000200000002001d1eb1191a0000040f00000001040000290000000207000029000000000201001900000000002704350000002001700039000000010340019000001a070000c13d000001000300008a000000000334016f0000000000310435000000000220004c000000200300003900000000030060190000003f02300039000000200300008a000000000332016f0000000002730019000000000332004b00000000030000190000000103004039000007b30420009c00001a130000213d000000010330019000001a130000c13d000000400020043f00000000020704331eb1021a0000040f000000400300043d000300000003001d0000004002300039000000000012043500000060013000390000080d02000041000000000021043500000020023000390000080e01000041000200000002001d00000000001204350000080c0100004100000000001004390000800b0100003900000004020000391eb102310000040f0000000304000029000000a00240003900000000030004100000000000320435000000800240003900000000001204350000000002040019000000a00100003900000000001204350000080f0120009c00001a130000213d000000c001200039000000400010043f000000000202043300000002010000291eb1021a0000040f000000000001042d0000000303000029000000000030043500000801040000410000000003000019000000000523004b000019d80000813d0000000005310019000000000604041a00000000006504350000002003300039000000010440003900001a0b0000013d000007bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191eb1024d0000040f0004000000000002000200000003001d000300000002001d000007b401100197000400000001001d00000000001004350000000201000039000000200010043f0000004002000039000100000002001d00000000010000191eb1021a0000040f0000000302000029000007b402200197000300000002001d0000000000200435000000200010043f000000000100001900000001020000291eb1021a0000040f0000000202000029000000000021041b000000400100043d0000000000210435000007ae020000410000000003000414000007ae0430009c0000000003028019000007ae0410009c00000000010280190000004001100210000000c002300210000000000112019f000007f3011001c70000800d0200003900000003030000390000081204000041000000040500002900000003060000291eb11ea70000040f000000010120019000001a450000613d000000000001042d000000000100001900000000020000191eb1024d0000040f0005000000000002000200000004001d000300000003001d000400000002001d000500000001001d1eb119b70000040f0000000502000029000007b402200197000500000002001d00000000002004350000000302000039000000200020043f000100000001001d000000400200003900000000010000191eb1021a0000040f000000000201041a000000010300008a000000000332004b00001a980000613d0000000103200039000000000031041b000000400300043d000000c00130003900000002040000290000000000410435000000a00130003900000000002104350000008001300039000000030200002900000000002104350000000401000029000007b40110019700000060023000390000000000120435000000400130003900000005020000290000000000210435000000c0010000390000000000130435000000200130003900000813020000410000000000210435000008140230009c00001a910000813d000000e002300039000400000002001d000000400020043f0000000002030433000500000003001d1eb1021a0000040f00000005020000290000010003200039000008150200004100000000002304350000000502000029000001020220003900000001040000290000000000420435000000050400002900000122024000390000000000120435000000040200002900000042010000390000000000120435000008160140009c00001a910000213d0000016001400039000000400010043f000000000202043300000000010300191eb1021a0000040f000000000001042d000007bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191eb1024d0000040f000007bf0100004100000000001004350000001101000039000000040010043f000000240200003900000000010000191eb1024d0000040f000000400100043d000008170210009c00001ac50000813d0000020002100039000000400020043f000001e00210003900000060030000390000000000320435000001c0021000390000000000020435000001a00210003900000000000204350000018002100039000000000002043500000160021000390000000000020435000001400210003900000000000204350000012002100039000000000002043500000100021000390000000000020435000000e0021000390000000000020435000000c0021000390000000000020435000000a0021000390000000000020435000000800210003900000000000204350000006002100039000000000002043500000040021000390000000000020435000000200210003900000000000204350000000000010435000000000001042d000007bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191eb1024d0000040f00020000000000020000000004020019000000010200008a000000000324013f000000000200041a000000000332004b00001af70000213d0000000002420019000000000020041b000007b401100197000200000001001d00000000001004350000000101000039000000200010043f00000040020000390000000001000019000100000004001d1eb1021a0000040f000000000201041a00000001030000290000000002320019000000000021041b000000400100043d0000000000310435000007ae020000410000000003000414000007ae0430009c0000000003028019000007ae0410009c00000000010280190000004001100210000000c002300210000000000112019f000007f3011001c70000800d020000390000000303000039000007f404000041000000000500001900000002060000291eb11ea70000040f000000010120019000001afe0000613d000000000001042d000007bf0100004100000000001004350000001101000039000000040010043f000000240200003900000000010000191eb1024d0000040f000000000100001900000000020000191eb1024d0000040f0000000801000039000000000201041a000000020220008c00001b080000613d0000000202000039000000000021041b000000000001042d000000400100043d00000044021000390000081803000041000000000032043500000024021000390000001f0300003900000000003204350000081902000041000000000021043500000004021000390000002003000039000000000032043500000064020000391eb1024d0000040f0003000000000002000007b40210019800001b560000613d0000000003000411000000000232004b00001b560000613d000200000001001d000000400100043d0000081a020000410000000000210435000300000001001d000000040210003900000000003204350000000001000414000100000001001d000007e20100004100000000001004390000000001000412000000040010044300000020010000390000002400100443000080050100003900000044020000391eb102310000040f000007b402100197000000040120008c00001b390000613d000000240400003900000020060000390000000101000029000000030300002900000000050300191eb101e30000040f000000000110004c00001b610000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600320018f00000003050000290000000002530019000000000332004b00000000030000190000000103004039000007b30420009c000000000405001900001b5a0000213d000000010330019000001b5a0000c13d000000400020043f000000200110008c00001b570000413d0000000001040433000000000210004c0000000002000019000000010200c039000000000221004b00001b570000c13d000000000110004c000000020100002900001b560000c13d0000000001000019000000000001042d000000000100001900000000020000191eb1024d0000040f000007bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191eb1024d0000040f0000000302000367000000400100043d00000001040000310000001f0340018f000000050440027200001b700000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b00001b680000413d000000000530004c00001b7f0000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f000000000024043500000001020000311eb1024d0000040f0002000000000002000200000002001d000007b401100197000100000001001d00000000001004350000000101000039000000200010043f000000400200003900000000010000191eb1021a0000040f0000000204000029000000000201041a000000000342004b00001ba90000413d0000000002420049000000000021041b000000000100041a0000000001410049000000000010041b000000400100043d0000000000410435000007ae020000410000000003000414000007ae0430009c0000000003028019000007ae0410009c00000000010280190000004001100210000000c002300210000000000112019f000007f3011001c70000800d020000390000000303000039000007f404000041000000010500002900000000060000191eb11ea70000040f000000010120019000001bb00000613d000000000001042d000007bf0100004100000000001004350000001101000039000000040010043f000000240200003900000000010000191eb1024d0000040f000000000100001900000000020000191eb1024d0000040f0000000002120049000007b2030000410000005f0420008c00000000040000190000000004032019000007b202200197000000000520004c0000000003008019000007b20220009c00000000020400190000000002036019000000000220004c00001bd10000613d0000000203000367000000000213034f000000000402043b000007b40240009c00001bd10000213d0000002002100039000000000223034f000000000202043b000007b40520009c00001bd10000213d0000004001100039000000000113034f000000000301043b000000ff0130008c00001bd10000213d0000000001040019000000000001042d000000000100001900000000020000191eb1024d0000040f0004000000000002000300000004001d000000400600043d000400000006001d0000008404600039000000a0050000390000000000540435000007b40330019700000064046000390000000000340435000007b40220019700000044036000390000000000230435000007b401100197000000240260003900000000001204350000081b0100004100000000001604350000000401600039000000000200041000000000002104350000000001000414000100000001001d000007e20100004100000000001004390000000001000412000000040010044300000020010000390000002400100443000080050100003900000044020000391eb102310000040f000200000001001d0000000401000029000000a40210003900000003010000291eb119400000040f0000000202000029000007b402200197000000040320008c00001c050000613d000000040300002900000000043100490000002006000039000000010100002900000000050300191eb101e30000040f000000000110004c00001c260000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600320018f00000004050000290000000002530019000000000332004b00000000030000190000000103004039000007b30420009c000000000405001900001c1f0000213d000000010330019000001c1f0000c13d000000400020043f0000001f0110008c00001c1c0000a13d0000000001040433000007e40210009c00001c1c0000213d000000000001042d000000000100001900000000020000191eb1024d0000040f000007bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191eb1024d0000040f0000000302000367000000400100043d00000001040000310000001f0340018f000000050440027200001c350000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b00001c2d0000413d000000000530004c00001c440000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f000000000024043500000001020000311eb1024d0000040f0002000000000002000000400200043d0000081c010000410000000000120435000200000002001d0000000401200039000000000200041000000000002104350000000001000414000100000001001d000007e20100004100000000001004390000000001000412000000040010044300000020010000390000002400100443000080050100003900000044020000391eb102310000040f000007b402100197000000040120008c00001c640000613d000000240400003900000020060000390000000101000029000000020300002900000000050300191eb101e30000040f000000000110004c00001c850000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600320018f00000002050000290000000002530019000000000332004b00000000030000190000000103004039000007b30420009c000000000405001900001c7e0000213d000000010330019000001c7e0000c13d000000400020043f0000001f0110008c00001c7b0000a13d0000000001040433000007e40210009c00001c7b0000213d000000000001042d000000000100001900000000020000191eb1024d0000040f000007bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191eb1024d0000040f0000000302000367000000400100043d00000001040000310000001f0340018f000000050440027200001c940000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b00001c8c0000413d000000000530004c00001ca30000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f000000000024043500000001020000311eb1024d0000040f0000000a03000039000000000023041b0000000903000039000000000013041b000000400300043d000000200430003900000000002404350000000000130435000007ae010000410000000002000414000007ae0420009c0000000002018019000007ae0430009c00000000010340190000004001100210000000c002200210000000000112019f0000081d011001c70000800d0200003900000001030000390000081e040000411eb11ea70000040f000000010120019000001cbe0000613d000000000001042d000000000100001900000000020000191eb1024d0000040f0005000000000002000500000004001d000100000003001d000200000002001d000300000001001d000007e20100004100000000001004390000000001000412000000040010044300000040010000390000002400100443000080050100003900000044020000391eb102310000040f000007eb020000410000000000200439000007b401100197000400000001001d0000000400100443000080020100003900000024020000391eb102310000040f0000000502000029000000ff0220019000001cfc0000613d000000000110004c00001d210000613d000000400300043d000000640130003900000000002104350000004401300039000000010200002900000000002104350000000201000029000007b401100197000000240230003900000000001204350000081f0100004100000000001304350000000301000029000007b4011001970000000402300039000000000012043500000000010004140000000402000029000000040420008c00001cf80000613d0000008404000039000500000003001d000000050500002900000000060000191eb101ac0000040f0000000503000029000000000110004c00001d240000613d0000080b0130009c00001d1a0000813d000000400030043f000000000001042d000000000110004c00001d210000613d000000400300043d0000004401300039000000010200002900000000002104350000000201000029000007b40110019700000024023000390000000000120435000008200100004100000000001304350000000301000029000007b4011001970000000402300039000000000012043500000000010004140000000402000029000000040420008c00001d180000613d0000006404000039000500000003001d000000050500002900000000060000191eb101ac0000040f0000000503000029000000000110004c00001d240000613d000007b30130009c00001cfa0000a13d000007bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191eb1024d0000040f000000000100001900000000020000191eb1024d0000040f0000000302000367000000400100043d00000001040000310000001f0340018f000000050440027200001d330000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b00001d2b0000413d000000000530004c00001d420000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f000000000024043500000001020000311eb1024d0000040f0007000000000002000007e201000041000400000001001d00000000001004390000000001000412000700000001001d0000000400100443000000400100003900000024001004430000800501000039000300000001001d0000004402000039000200000002001d1eb102310000040f0000082102000041000000400300043d000600000003001d0000000000230435000500000001001d0000000001000414000100000001001d000000040100002900000000001004390000000701000029000000040010044300000060010000390000002400100443000000030100002900000002020000291eb102310000040f0000000603000029000007b401100197000000040230003900000000001204350000000001000410000007b4021001970000002401300039000400000002001d00000000002104350000000501000029000007b402100197000000040120008c000500000002001d00001d790000613d00000044040000390000002006000039000000010100002900000000050300191eb101e30000040f00000006030000290000000502000029000000000110004c00001dc50000613d0000000101000031000000200410008c000000200400003900000000040140190000001f04400039000000600540018f0000000004350019000000000554004b00000000050000190000000105004039000007b30640009c00001dbb0000213d000000010550019000001dbb0000c13d000000400040043f0000001f0110008c00001dc20000a13d0000000001030433000600000001001d000008210100004100000000001404350000000001000414000300000001001d000007e2010000410000000000100439000000070100002900000004001004430000008001000039000000240010044300008005010000390000004402000039000700000004001d1eb102310000040f00000007030000290000002402300039000000040400002900000000004204350000000402300039000007b40110019700000000001204350000000502000029000000040120008c00001dac0000613d00000044040000390000002006000039000000030100002900000007050000291eb101e30000040f0000000703000029000000000110004c00001dc50000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000002320019000007b30420009c00001dbb0000213d000000400020043f000000200110008c00001dc20000413d00000000020304330000000601000029000000000001042d000007bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191eb1024d0000040f000000000100001900000000020000191eb1024d0000040f0000000302000367000000400100043d00000001040000310000001f0340018f000000050440027200001dd40000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b00001dcc0000413d000000000530004c00001de30000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f000000000024043500000001020000311eb1024d0000040f0000000005020019000000000250004c0000000006000019000000000200001900001e050000613d000007e50210009c00001e070000813d000000010600008a00000000275600d9000007e6020000410000000002120049000000000827004b00001e070000413d000000000717004b00001e070000413d00000000275200aa00000000211500a9000007e61210012a00001dfb0000613d00000000517600d9000000000131004b00001e070000413d000007e80140009c00001e070000213d000000000567013f000007e6414000d1000000000451004b00001e070000213d000000000171001a00001e0e0000613d00000000433700a900000000161300d90000000001060019000000000001042d000007bf0100004100000000001004350000001101000039000000040010043f000000240200003900000000010000191eb1024d0000040f000007bf0100004100000000001004350000001201000039000000040010043f000000240200003900000000010000191eb1024d0000040f0000000005020019000000000250004c0000000006000019000000000200001900001e350000613d000007e50210009c00001e370000813d000000010600008a00000000275600d9000007e6020000410000000002120049000000000827004b00001e370000413d000000000717004b00001e370000413d00000000275200aa00000000211500a9000007e61210012a00001e2b0000613d00000000517600d9000000000141004b00001e370000413d000007e80130009c00001e370000213d000000000567013f000007e6313000d1000000000351004b00001e370000213d000000000171001a00001e3e0000613d00000000434700a900000000161300d90000000001060019000000000001042d000007bf0100004100000000001004350000001101000039000000040010043f000000240200003900000000010000191eb1024d0000040f000007bf0100004100000000001004350000001201000039000000040010043f000000240200003900000000010000191eb1024d0000040f000007f90310009c00001e9b0000213d000008220320009c00001e9b0000813d000000000310004c00001e4f0000613d000000010300008a00000000431300d9000000000323004b00001ea00000413d00000000211200a9000008230210009c00000000020000190000008002002039000000000321022f000008240330009c00000000030000190000004003002039000000000223019f000000000321022f000008250330009c00000000030000190000002003002039000000000223019f000000000321022f000007e40330009c00000000030000190000001003002039000000000223019f000000000321022f00000826033000410000000102200270000000b50220020f00000000233200a90000001202300270000008270330009c000000000300001900001e6c0000413d00000000432100d900000000032300190000000102300270000000020330008c000000000300001900001e720000413d00000000432100d900000000032300190000000102300270000000020330008c000000000300001900001e780000413d00000000432100d900000000032300190000000102300270000000020330008c000000000300001900001e7e0000413d00000000432100d900000000032300190000000102300270000000020330008c000000000300001900001e840000413d00000000432100d900000000032300190000000102300270000000020330008c000000000300001900001e8a0000413d00000000432100d900000000032300190000000102300270000000020330008c000000000300001900001e900000413d00000000432100d900000000032300190000000102300270000000020330008c000000000300001900001e960000413d00000000132100d9000000010100008a000000000323004b00000000010080190000000001120019000000000001042d000000400100043d000007fb02000041000000000021043500000004020000391eb1024d0000040f000007bf0100004100000000001004350000001101000039000000040010043f000000240200003900000000010000191eb1024d0000040f00001eaa002104210000000102000039000000000001042d000000000200001900001ea90000013d00001eaf002104230000000102000039000000000001042d000000000200001900001eae0000013d00001eb10000043200001eb20001042e00001eb300010430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffd039f62200000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000011f8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff000000000000000000000000ffffffffffffffffffffffffffffffffffffffffee97f7f300000000000000000000000000000000000000000000000000000000fbfa77cf0000000000000000000000000000000000000000000000000000000053796e63537761702000000000000000000000000000000000000000000000002f0000000000000000000000000000000000000000000000000000000000000020436c6173736963204c500000000000000000000000000000000000000000002063534c50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffbf53796e635377617020436c6173736963204c500000000000000000000000000063534c500000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000004e487b7100000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffc9a70000000000000000000000000000000000000000000000000000000003e7286a0000000000000000000000000000000000000000000000000000000006fdde030000000000000000000000000000000000000000000000000000000007f293f7000000000000000000000000000000000000000000000000000000000902f1ac00000000000000000000000000000000000000000000000000000000095ea7b3000000000000000000000000000000000000000000000000000000000dfe16810000000000000000000000000000000000000000000000000000000018160ddd0000000000000000000000000000000000000000000000000000000023b872dd0000000000000000000000000000000000000000000000000000000027b0bcea000000000000000000000000000000000000000000000000000000002c0198cc00000000000000000000000000000000000000000000000000000000313ce567000000000000000000000000000000000000000000000000000000003644e51500000000000000000000000000000000000000000000000000000000443cb4bc000000000000000000000000000000000000000000000000000000005a76f25e0000000000000000000000000000000000000000000000000000000067e4ac2c0000000000000000000000000000000000000000000000000000000070a08231000000000000000000000000000000000000000000000000000000007132bb7f000000000000000000000000000000000000000000000000000000007ecebe00000000000000000000000000000000000000000000000000000000008b4c54700000000000000000000000000000000000000000000000000000000095d89b4100000000000000000000000000000000000000000000000000000000a287c79500000000000000000000000000000000000000000000000000000000a5a4103100000000000000000000000000000000000000000000000000000000a9059cbb00000000000000000000000000000000000000000000000000000000b1dd61b600000000000000000000000000000000000000000000000000000000d21220a700000000000000000000000000000000000000000000000000000000d505accf00000000000000000000000000000000000000000000000000000000dd62ed3e00000000000000000000000000000000000000000000000000000000ee97f7f300000000000000000000000000000000000000000000000000000000f66eab5b00000000000000000000000000000000000000000000000000000000fbfa77cf00000000000000000000000000000000000000000000000000000000ff9c8ac6310ab089e4439a4c15d089f94afb7896ff553aecb10793d0ab882de59d99a32e000000000000000000000000000000000000000000000000ffffffffffffffdf0000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000186a100000000000000000000000000000000000000000000000000000000000186a00000a7c5ac471b4784230fcf80dc33721d53cddd6e04c059210385c67dfe32a10000a7c5ac471b4784230fcf80dc33721d53cddd6e04c059210385c67dfe32a0000000000000000000000000000000000000000000000000fffffffffffffebf4ccb20c0000000000000000000000000000000000000000000000000000000001806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b83843e82180000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000c400000000000000000000000084f513e800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff9f0200000000000000000000000000000000000060000000000000000000000000d175a80c109434bb89948928ab2475a6647c94244cb70002197896423c883363796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d955391320200000000000000000000000000000000000020000000000000000000000000ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0000000000000000000000000000000000000000000000000fffffffffffffe400200000000000000000000000000000000000080000000000000000000000000d78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d82200000000000000000000000000000000ffffffffffffffffffffffffffffffff608dbcbb0000000000000000000000000000000000000000000000000000000035278d12000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a01626ba7e000000000000000000000000000000000000000000000000000000008baa579f00000000000000000000000000000000000000000000000000000000203d82d8000000000000000000000000000000000000000000000000000000001d59ca82000000000000000000000000000000000000000000000000000000008a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b000000000000000000000000000000000000000000000000ffffffffffffffe00000000000000000000000000000000000000000000000000000000000030d402049973000000000000000000000000000000000000000000000000000000000a8137fff86647d8a402117b9c5dbda627f721d3773338fb9678c83e54ed39080d226f9d400000000000000000000000000000000000000000000000000000000ffffffff0000000000000000000000000000000000000000000000000000000001ffc9a700000000000000000000000000000000000000000000000000000000d505accf000000000000000000000000000000000000000000000000000000002c0198cc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000009a8a0592ac89c5ad3bc6df8224c17b485976f597df104ee20d0df415241f670bc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc68b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f000000000000000000000000000000000000000000000000ffffffffffffff3f95d89b410000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000008c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9256e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9000000000000000000000000000000000000000000000000ffffffffffffff201901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fffffffffffffe9f000000000000000000000000000000000000000000000000fffffffffffffe005265656e7472616e637947756172643a207265656e7472616e742063616c6c0008c379a000000000000000000000000000000000000000000000000000000000abcef554000000000000000000000000000000000000000000000000000000004625a94d000000000000000000000000000000000000000000000000000000000a992e0c000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000040000000000000000000000000cf2aa50876cdfbb541206f89af0ee78d44a2abf8d328e37fa4917f982149848a6cb568c100000000000000000000000000000000000000000000000000000000beabacc800000000000000000000000000000000000000000000000000000000f7888aec000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000ffffffffffffffffff000000000000000000000000000000000000000000000000000000ffffffffff000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.