Contract 0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb 2

Txn Hash Method
Block
From
To
Value [Txn Fee]
0xc2024f965b4ee96e98261bb547d9eae3035c4c9ca953f074709df11670f945b1Add Liquidity93877902021-10-24 6:35:311 min ago0xd340c7e4a6a5dd14d9d5e05a17ccf363b7dfe404 IN  0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb0 HT0.00041049 2.25
0x35213760b37a454d6413d4397d1dc7a188f7f2d1f8b5e5f826b36b53c8d93882Swap Exact Token...93877832021-10-24 6:35:101 min ago0x7f0720ae0f532a7b63a3ba34c2e03ea971c52dd0 IN  0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb0 HT0.000530808752.25
0xa0fd36ebb1ae34be133c752cb7bd43b4e2a973ca4ed143e8cee0ea5007e4c6efSwap Tokens For ...93877732021-10-24 6:34:402 mins ago0xd340c7e4a6a5dd14d9d5e05a17ccf363b7dfe404 IN  0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb0 HT0.0002487375 2.25
0x48ac649f32fbd80293e9eb08af702b4db7364782d96c6bd03c3083264cf7cc94Swap Exact Token...93877602021-10-24 6:34:012 mins ago0xd340c7e4a6a5dd14d9d5e05a17ccf363b7dfe404 IN  0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb0 HT0.00024849225 2.25
0x53b93fc046c43d067dc1d04490d4812cf5644bdccc1fbd6244c63a77dc70ecb3Swap Exact Token...93877212021-10-24 6:32:044 mins ago0x28aa891015d43bdd2e81ad39b946484ae2f386d5 IN  0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb0 HT0.000552188252.25
0x44ef1b451ba87dfb2a4fefbbe56c09c63dbd22bb6ff70e4ebf284e0f17740ed2Add Liquidity93877102021-10-24 6:31:315 mins ago0xb04306000de3f8aac783264e22f23a1ea215048c IN  0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb0 HT0.00037790325 2.25
0x3d48ab746e44af05f089c06aa674e107f82b7cc96b5dee1d697884538925789fSwap Exact Token...93877032021-10-24 6:31:105 mins ago0x7f0720ae0f532a7b63a3ba34c2e03ea971c52dd0 IN  0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb0 HT0.000530781752.25
0xb4f8b625548a2e99b90f9fffb487c63dbc924af7834140d3af017e523bb74abdSwap Exact HT Fo...93876972021-10-24 6:30:526 mins ago0xaa3e34c024271c476a979fafc181aadb9d8ecffd IN  0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb27.879297249999998 HT0.00442832841
0xe9894f6a4e14b9cf65fffff37d0d310e543c62d88844309f8c4ca98c19796c9aSwap Exact HT Fo...93876972021-10-24 6:30:526 mins ago0xaa3e34c024271c476a979fafc181aadb9d8ecffd IN  0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb26.124644 HT0.00442783641
0xf5ff0544a63a8f47fcdaca5b3ece300b290b87cfb378d02a130787c04e74e434Swap Exact Token...93876962021-10-24 6:30:496 mins ago0xb04306000de3f8aac783264e22f23a1ea215048c IN  0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb0 HT0.0002378115 2.25
0xa4d00726e654913db0ffad73916a0b2391d2f6d43dd1ef906b81d6912add0c34Add Liquidity93876932021-10-24 6:30:406 mins ago0x28aa891015d43bdd2e81ad39b946484ae2f386d5 IN  0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb0 HT0.0004104272.25
0x0e7ac54bcc40c35c04951b299fe0965ece6aa96a3c4d4c5c9ff2531538138693Swap Exact Token...93876802021-10-24 6:30:016 mins ago0x28aa891015d43bdd2e81ad39b946484ae2f386d5 IN  0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb0 HT0.00028719452.25
0xf1ca2fb6496b5efd35627a88ebd98c812b120a905d277f3d95beecd3c1080f63Swap Exact Token...93876632021-10-24 6:29:107 mins ago0x7f0720ae0f532a7b63a3ba34c2e03ea971c52dd0 IN  0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb0 HT0.00024869252.25
0xea2eb531c94befb98bd787e21ae89f6b987cbe2c2b362555233dab1e8a3e2541Swap Exact Token...93876392021-10-24 6:27:588 mins ago0x40b720ae763015698a24231609fb8351028b90de IN  0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb0 HT0.00023797352.25
0xeb1b715fe69efcea7ea5f925ceae7b114b72c91f263193eb5084fc7708c5e405Swap Exact HT Fo...93876362021-10-24 6:27:499 mins ago0xaa3e34c024271c476a979fafc181aadb9d8ecffd IN  0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb24.542011375000002 HT0.00442832841
0x5a5f0a0a14f9da7dee254c559892d7d80d21280657ac946f5570bdb545b30305Swap Tokens For ...93876342021-10-24 6:27:439 mins ago0x40b720ae763015698a24231609fb8351028b90de IN  0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb0 HT0.000420500252.25
0x50fec169c5bb7f16e4bf9aae3760cb82d07e94fce5d90a6928913ed6f01bb1d7Add Liquidity93876322021-10-24 6:27:379 mins ago0x87156841fadb604f5ba64d98fb6ba973b16a70f9 IN  0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb0 HT0.0004641752.5
0x7717397bea7baab30778e721069d93a9a1cea7313b2970bf1d241682e15f4b8cSwap Exact Token...93876212021-10-24 6:27:049 mins ago0xd340c7e4a6a5dd14d9d5e05a17ccf363b7dfe404 IN  0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb0 HT0.0002487915 2.25
0xfc8b64ebed275bfab7033f7b9cfa1d7641bc32f10f71bb8388c79d87b9faa77aSwap Exact HT Fo...93876192021-10-24 6:26:589 mins ago0xaa3e34c024271c476a979fafc181aadb9d8ecffd IN  0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb35.728484749999996 HT0.00442783641
0x8c01715f29ea9f53598bc3f5579a5c74b39abde36ee431dbe3666dd962dbd53aSwap Exact Token...93876182021-10-24 6:26:5510 mins ago0xaa3e34c024271c476a979fafc181aadb9d8ecffd IN  0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb0 HT0.00462434941
0xa085b722bad1d3c816de5ffd4f4beba334e45d056264764bb4a07966e3ff579fAdd Liquidity93876072021-10-24 6:26:2210 mins ago0xa0729eb67eaf5fd931f4b5ee6599de248c01ab60 IN  0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb0 HT0.000417213 2.25
0x72c2123f9f0185d8f3ac25f4317b0c74cfb282ec6ae75cc9694e52033bf6d680Swap Exact Token...93876052021-10-24 6:26:1610 mins ago0x7f0720ae0f532a7b63a3ba34c2e03ea971c52dd0 IN  0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb0 HT0.00024869252.25
0x8c15ce4aa157e65b25e544ba8cf9191da3fe3e1c83cc4a40158ad4f0d8e0006bSwap Exact HT Fo...93876052021-10-24 6:26:1610 mins ago0x87156841fadb604f5ba64d98fb6ba973b16a70f9 IN  0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb2 HT0.00031282.5
0xd21c5c605df77b06f4c0d0a6e13c0e1021f40f747621cfe528409dbda26320b4Swap Exact Token...93876042021-10-24 6:26:1310 mins ago0x7d2487cac8b55c8aa186c98982ab10d6e898b3f4 IN  0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb0 HT0.001083710
0xc9c5711a6fdac97c9587a51137ad1d3588de4a022c85f03924c361c36168a467Swap Exact Token...93876032021-10-24 6:26:1010 mins ago0x40b720ae763015698a24231609fb8351028b90de IN  0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb0 HT0.00023797352.25
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x53b93fc046c43d067dc1d04490d4812cf5644bdccc1fbd6244c63a77dc70ecb393877212021-10-24 6:32:044 mins ago 0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb0x28aa891015d43bdd2e81ad39b946484ae2f386d50.000761468369286525 HT
0x53b93fc046c43d067dc1d04490d4812cf5644bdccc1fbd6244c63a77dc70ecb393877212021-10-24 6:32:044 mins ago Huobi: Wrapped Huobi Token 0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb0.000761468369286525 HT
0xb4f8b625548a2e99b90f9fffb487c63dbc924af7834140d3af017e523bb74abd93876972021-10-24 6:30:526 mins ago 0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb Huobi: Wrapped Huobi Token27.879297249999998976 HT
0xe9894f6a4e14b9cf65fffff37d0d310e543c62d88844309f8c4ca98c19796c9a93876972021-10-24 6:30:526 mins ago 0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb Huobi: Wrapped Huobi Token26.124644 HT
0xeb1b715fe69efcea7ea5f925ceae7b114b72c91f263193eb5084fc7708c5e40593876362021-10-24 6:27:499 mins ago 0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb Huobi: Wrapped Huobi Token24.54201137500000256 HT
0xfc8b64ebed275bfab7033f7b9cfa1d7641bc32f10f71bb8388c79d87b9faa77a93876192021-10-24 6:26:589 mins ago 0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb Huobi: Wrapped Huobi Token35.728484749999996928 HT
0x8c15ce4aa157e65b25e544ba8cf9191da3fe3e1c83cc4a40158ad4f0d8e0006b93876052021-10-24 6:26:1610 mins ago 0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb Huobi: Wrapped Huobi Token2 HT
0xcbe40d921fb751a2707296ab0840483f96cbca17009b70765d86ddfd32c09cff93876032021-10-24 6:26:1010 mins ago 0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb Huobi: Wrapped Huobi Token35.20330275000000512 HT
0xbf7724fb6205124eb3d9d95f0bf1c598eb18506516b1eb492961079b3c72fb5f93875932021-10-24 6:25:4011 mins ago 0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb Huobi: Wrapped Huobi Token2 HT
0xf738c2d7c9bbddc323da9c483ff4b78e2cc204f10ec24bb5b75b4c5b7445238d93875522021-10-24 6:23:3713 mins ago 0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb Huobi: Wrapped Huobi Token32.118716 HT
0x76944b9afb7b33d8175034f1e1418e2b1477b9ff5b4846370d5676cb4694e19593874652021-10-24 6:19:1617 mins ago 0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb0xaa3e34c024271c476a979fafc181aadb9d8ecffd27.724202810714083859 HT
0x76944b9afb7b33d8175034f1e1418e2b1477b9ff5b4846370d5676cb4694e19593874652021-10-24 6:19:1617 mins ago Huobi: Wrapped Huobi Token 0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb27.724202810714083859 HT
0xdbedc4aae87465478fd24d8e22c7c486feb263d46269daa80fdd4bf6f195bfd193874632021-10-24 6:19:1017 mins ago 0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb0xaa3e34c024271c476a979fafc181aadb9d8ecffd16.756563818168232273 HT
0xdbedc4aae87465478fd24d8e22c7c486feb263d46269daa80fdd4bf6f195bfd193874632021-10-24 6:19:1017 mins ago Huobi: Wrapped Huobi Token 0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb16.756563818168232273 HT
0xd93b4e328e16d7e6bf5c92345cbca23269ae5518efa835c1af61ac81697302a693874622021-10-24 6:19:0717 mins ago 0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb0xaa3e34c024271c476a979fafc181aadb9d8ecffd40.497194657204053715 HT
0xd93b4e328e16d7e6bf5c92345cbca23269ae5518efa835c1af61ac81697302a693874622021-10-24 6:19:0717 mins ago Huobi: Wrapped Huobi Token 0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb40.497194657204053715 HT
0x472d5bf4df59e7db825f4080ea2f3618b55647a75c02a33647706eb729667d3793874552021-10-24 6:18:4618 mins ago 0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb0x28aa891015d43bdd2e81ad39b946484ae2f386d50.010956588565305226 HT
0x472d5bf4df59e7db825f4080ea2f3618b55647a75c02a33647706eb729667d3793874552021-10-24 6:18:4618 mins ago Huobi: Wrapped Huobi Token 0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb0.010956588565305226 HT
0x3d09408be6307b77d6d0e76d31f93274a6192bc8cd1e132a94d1b29d72b3de6e93874152021-10-24 6:16:4620 mins ago 0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb0xaa3e34c024271c476a979fafc181aadb9d8ecffd26.891530641170117161 HT
0x3d09408be6307b77d6d0e76d31f93274a6192bc8cd1e132a94d1b29d72b3de6e93874152021-10-24 6:16:4620 mins ago Huobi: Wrapped Huobi Token 0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb26.891530641170117161 HT
0xad32218213ee7321409cac1d9276040533806961a3125f60f60c60b3b098171893873632021-10-24 6:14:1022 mins ago 0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb Huobi: Wrapped Huobi Token30.793564392235085824 HT
0xda1271349b569c5e4895720301feb5a2f279dbb6dd7f9fe4d5eb2913cf330f2993873622021-10-24 6:14:0722 mins ago 0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb Huobi: Wrapped Huobi Token37.627161770797088768 HT
0xb68f60997b1c1681e7ea1e52846904268e6c5c581fc4b242a939d6dd827e17e793873592021-10-24 6:13:5822 mins ago 0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb Huobi: Wrapped Huobi Token43.030134 HT
0x1dc2d7f93dabd4ba5ebb8af055710793c32e63b3be01b85c3c5cdcd3558f55ba93873592021-10-24 6:13:5822 mins ago 0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb Huobi: Wrapped Huobi Token43.030134 HT
0x50834e27365d8f51d4fc4fcdc3cf56fc36ae8c7211a2f9b16838acf1c09396d693873592021-10-24 6:13:5822 mins ago 0x7f88bc12aa1ed9ff4605123649ac90f2cd9407eb Huobi: Wrapped Huobi Token54.11007425445937152 HT
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MakiswapRouter

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at hecoinfo.com on 2021-05-29
*/

// SPDX-License-Identifier: MIT

pragma solidity >=0.5.0;

// File: contracts/exchange/interfaces/IMakiswapFactory.sol

interface IMakiswapFactory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);
    event SetFeeTo(address indexed user, address indexed _feeTo);
    event SetMigrator(address indexed user, address indexed _migrator);
    event FeeToSetter(address indexed user, address indexed _feeToSetter);

    function feeTo() external view returns (address _feeTo);
    function feeToSetter() external view returns (address _feeToSetter);
    function migrator() external view returns (address _migrator);

    function getPair(address tokenA, address tokenB) external view returns (address pair);

    function createPair(address tokenA, address tokenB) external returns (address pair);
    function setMigrator(address) external;
    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

// File: maki-swap-lib/contracts/utils/TransferHelper.sol

pragma solidity >=0.6.0;

// helper methods for interacting with HRC20 tokens and sending HT that do not consistently return true/false
library TransferHelper {
    function safeApprove(
        address token,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED');
    }

    function safeTransfer(
        address token,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED');
    }

    function safeTransferFrom(
        address token,
        address from,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED');
    }

    function safeTransferHT(address to, uint256 value) internal {
        (bool success, ) = to.call{value: value}(new bytes(0));
        require(success, 'TransferHelper: HT_TRANSFER_FAILED');
    }
}

// File: makiswap-core/contracts/interfaces/IMakiswapPair.sol

pragma solidity >=0.5.0;

interface IMakiswapPair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

// File: makiswap-core/contracts/libraries/SafeMath.sol

pragma solidity >=0.5.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, 'SafeMath: addition overflow');

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, 'SafeMath: subtraction overflow');
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, 'SafeMath: division by zero');
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, 'SafeMath: modulo by zero');
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }

    function min(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = x < y ? x : y;
    }

    // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
    function sqrt(uint256 y) internal pure returns (uint256 z) {
        if (y > 3) {
            z = y;
            uint256 x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }
}

// File: contracts/exchange/libraries/MakiswapLibrary.sol

pragma solidity >=0.5.0;

library MakiswapLibrary {
    using SafeMath for uint;

    // returns sorted token addresses, used to handle return values from pairs sorted in this order
    function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
        require(tokenA != tokenB, 'MakiswapLibrary: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'MakiswapLibrary: ZERO_ADDRESS');
    }

    // calculates the CREATE2 address for a pair without making any external calls
    function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        pair = address(uint(keccak256(abi.encodePacked(
                hex'ff',
                factory,
                keccak256(abi.encodePacked(token0, token1)),
                hex'76ad5042ab28d96f7f282da03b97d50271603b12d04aa326091827f6a008f4cf' // init code hash
            ))));
    }

    // fetches and sorts the reserves for a pair
    function getReserves(address factory, address tokenA, address tokenB) internal view returns (uint reserveA, uint reserveB) {
        (address token0,) = sortTokens(tokenA, tokenB);
        pairFor(factory, tokenA, tokenB);
        (uint reserve0, uint reserve1,) = IMakiswapPair(pairFor(factory, tokenA, tokenB)).getReserves();
        (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
    }

    // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset
    function quote(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) {
        require(amountA > 0, 'MakiswapLibrary: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'MakiswapLibrary: INSUFFICIENT_LIQUIDITY');
        amountB = amountA.mul(reserveB) / reserveA;
    }

    // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) internal pure returns (uint amountOut) {
        require(amountIn > 0, 'MakiswapLibrary: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'MakiswapLibrary: INSUFFICIENT_LIQUIDITY');
        uint amountInWithFee = amountIn.mul(998);
        uint numerator = amountInWithFee.mul(reserveOut);
        uint denominator = reserveIn.mul(1000).add(amountInWithFee);
        amountOut = numerator / denominator;
    }

    // given an output amount of an asset and pair reserves, returns a required input amount of the other asset
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) internal pure returns (uint amountIn) {
        require(amountOut > 0, 'MakiswapLibrary: INSUFFICIENT_OUTPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'MakiswapLibrary: INSUFFICIENT_LIQUIDITY');
        uint numerator = reserveIn.mul(amountOut).mul(1000);
        uint denominator = reserveOut.sub(amountOut).mul(998);
        amountIn = (numerator / denominator).add(1);
    }

    // performs chained getAmountOut calculations on any number of pairs
    function getAmountsOut(address factory, uint amountIn, address[] memory path) internal view returns (uint[] memory amounts) {
        require(path.length >= 2, 'MakiswapLibrary: INVALID_PATH');
        amounts = new uint[](path.length);
        amounts[0] = amountIn;
        for (uint i; i < path.length - 1; i++) {
            (uint reserveIn, uint reserveOut) = getReserves(factory, path[i], path[i + 1]);
            amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut);
        }
    }

    // performs chained getAmountIn calculations on any number of pairs
    function getAmountsIn(address factory, uint amountOut, address[] memory path) internal view returns (uint[] memory amounts) {
        require(
            path.length >= 2, 'MakiswapLibrary: INVALID_PATH');
        amounts = new uint[](path.length);
        amounts[amounts.length - 1] = amountOut;
        for (uint i = path.length - 1; i > 0; i--) {
            (uint reserveIn, uint reserveOut) = getReserves(factory, path[i - 1], path[i]);
            amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut);
        }
    }
}

// File: maki-swap-periphery/contracts/interfaces/IMakiswapRouter01.sol

pragma solidity >=0.6.2;

interface IMakiswapRouter01 {
    function factory() external view returns (address);
    function WHT() external view returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityHT(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountHTMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountHT, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityHT(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountHTMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountHT);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityHTWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountHTMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountHT);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactHTForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactHT(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForHT(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapHTForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

// File: maki-swap-periphery/contracts/interfaces/IMakiswapRouter02.sol

pragma solidity >=0.6.2;


interface IMakiswapRouter02 is IMakiswapRouter01 {
    function removeLiquidityHTSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountHTMin,
        address to,
        uint deadline
    ) external returns (uint amountHT);
    function removeLiquidityHTWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountHTMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountHT);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactHTForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForHTSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

// File: makiswap-core/contracts/interfaces/IHRC20.sol

pragma solidity >=0.5.0;

interface IHRC20 {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
}

// File: maki-swap-periphery/contracts/interfaces/IWHT.sol

pragma solidity >=0.5.0;

interface IWHT {
    function deposit() external payable;
    function transfer(address to, uint value) external returns (bool);
    function withdraw(uint) external;
}

// File: contracts/exchange/MakiswapRouter.sol

pragma solidity =0.6.6;

contract MakiswapRouter is IMakiswapRouter02 {
    using SafeMath for uint256;

    address public immutable override factory;
    address public immutable override WHT;

    modifier ensure(uint256 deadline) {
        require(deadline >= block.timestamp, "MakiswapRouter: EXPIRED");
        _;
    }

    constructor(address _factory, address _WHT) public {
        factory = _factory;
        WHT = _WHT;
    }

    receive() external payable {
        assert(msg.sender == WHT); // only accept HT via fallback from the WHT contract
    }

    // **** ADD LIQUIDITY ****
    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin
    ) internal virtual returns (uint256 amountA, uint256 amountB) {
        // create the pair if it doesn't exist yet
        if (IMakiswapFactory(factory).getPair(tokenA, tokenB) == address(0)) {
            IMakiswapFactory(factory).createPair(tokenA, tokenB);
        }
        (uint256 reserveA, uint256 reserveB) =
            MakiswapLibrary.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint256 amountBOptimal =
                MakiswapLibrary.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(
                    amountBOptimal >= amountBMin,
                    "MakiswapRouter: INSUFFICIENT_B_AMOUNT"
                );
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint256 amountAOptimal =
                    MakiswapLibrary.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(
                    amountAOptimal >= amountAMin,
                    "MakiswapRouter: INSUFFICIENT_A_AMOUNT"
                );
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        virtual
        override
        ensure(deadline)
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        )
    {
        (amountA, amountB) = _addLiquidity(
            tokenA,
            tokenB,
            amountADesired,
            amountBDesired,
            amountAMin,
            amountBMin
        );
        address pair = MakiswapLibrary.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IMakiswapPair(pair).mint(to);
    }

    function addLiquidityHT(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountHTMin,
        address to,
        uint256 deadline
    )
        external
        payable
        virtual
        override
        ensure(deadline)
        returns (
            uint256 amountToken,
            uint256 amountHT,
            uint256 liquidity
        )
    {
        (amountToken, amountHT) = _addLiquidity(
            token,
            WHT,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountHTMin
        );
        address pair = MakiswapLibrary.pairFor(factory, token, WHT);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWHT(WHT).deposit{value: amountHT}();
        assert(IWHT(WHT).transfer(pair, amountHT));
        liquidity = IMakiswapPair(pair).mint(to);
        // refund dust ht, if any
        if (msg.value > amountHT)
            TransferHelper.safeTransferHT(msg.sender, msg.value - amountHT);
    }

    // **** REMOVE LIQUIDITY ****
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        public
        virtual
        override
        ensure(deadline)
        returns (uint256 amountA, uint256 amountB)
    {
        address pair = MakiswapLibrary.pairFor(factory, tokenA, tokenB);
        IMakiswapPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint256 amount0, uint256 amount1) = IMakiswapPair(pair).burn(to);
        (address token0, ) = MakiswapLibrary.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0
            ? (amount0, amount1)
            : (amount1, amount0);
        require(amountA >= amountAMin, "MakiswapRouter: INSUFFICIENT_A_AMOUNT");
        require(amountB >= amountBMin, "MakiswapRouter: INSUFFICIENT_B_AMOUNT");
    }

    function removeLiquidityHT(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountHTMin,
        address to,
        uint256 deadline
    )
        public
        virtual
        override
        ensure(deadline)
        returns (uint256 amountToken, uint256 amountHT)
    {
        (amountToken, amountHT) = removeLiquidity(
            token,
            WHT,
            liquidity,
            amountTokenMin,
            amountHTMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, amountToken);
        IWHT(WHT).withdraw(amountHT);
        TransferHelper.safeTransferHT(to, amountHT);
    }

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external virtual override returns (uint256 amountA, uint256 amountB) {
        address pair = MakiswapLibrary.pairFor(factory, tokenA, tokenB);
        uint256 value = approveMax ? uint256(-1) : liquidity;
        IMakiswapPair(pair).permit(
            msg.sender,
            address(this),
            value,
            deadline,
            v,
            r,
            s
        );
        (amountA, amountB) = removeLiquidity(
            tokenA,
            tokenB,
            liquidity,
            amountAMin,
            amountBMin,
            to,
            deadline
        );
    }

    function removeLiquidityHTWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountHTMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    )
        external
        virtual
        override
        returns (uint256 amountToken, uint256 amountHT)
    {
        address pair = MakiswapLibrary.pairFor(factory, token, WHT);
        uint256 value = approveMax ? uint256(-1) : liquidity;
        IMakiswapPair(pair).permit(
            msg.sender,
            address(this),
            value,
            deadline,
            v,
            r,
            s
        );
        (amountToken, amountHT) = removeLiquidityHT(
            token,
            liquidity,
            amountTokenMin,
            amountHTMin,
            to,
            deadline
        );
    }

    // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
    function removeLiquidityHTSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountHTMin,
        address to,
        uint256 deadline
    ) public virtual override ensure(deadline) returns (uint256 amountHT) {
        (, amountHT) = removeLiquidity(
            token,
            WHT,
            liquidity,
            amountTokenMin,
            amountHTMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(
            token,
            to,
            IHRC20(token).balanceOf(address(this))
        );
        IWHT(WHT).withdraw(amountHT);
        TransferHelper.safeTransferHT(to, amountHT);
    }

    function removeLiquidityHTWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountHTMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external virtual override returns (uint256 amountHT) {
        address pair = MakiswapLibrary.pairFor(factory, token, WHT);
        uint256 value = approveMax ? uint256(-1) : liquidity;
        IMakiswapPair(pair).permit(
            msg.sender,
            address(this),
            value,
            deadline,
            v,
            r,
            s
        );
        amountHT = removeLiquidityHTSupportingFeeOnTransferTokens(
            token,
            liquidity,
            amountTokenMin,
            amountHTMin,
            to,
            deadline
        );
    }

    // **** SWAP ****
    // requires the initial amount to have already been sent to the first pair
    function _swap(
        uint256[] memory amounts,
        address[] memory path,
        address _to
    ) internal virtual {
        for (uint256 i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0, ) = MakiswapLibrary.sortTokens(input, output);
            uint256 amountOut = amounts[i + 1];
            (uint256 amount0Out, uint256 amount1Out) =
                input == token0
                    ? (uint256(0), amountOut)
                    : (amountOut, uint256(0));
            address to =
                i < path.length - 2
                    ? MakiswapLibrary.pairFor(factory, output, path[i + 2])
                    : _to;
            IMakiswapPair(MakiswapLibrary.pairFor(factory, input, output)).swap(
                amount0Out,
                amount1Out,
                to,
                new bytes(0)
            );
        }
    }

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    )
        external
        virtual
        override
        ensure(deadline)
        returns (uint256[] memory amounts)
    {
        amounts = MakiswapLibrary.getAmountsOut(factory, amountIn, path);
        require(
            amounts[amounts.length - 1] >= amountOutMin,
            "MakiswapRouter: INSUFFICIENT_OUTPUT_AMOUNT"
        );
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            MakiswapLibrary.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, to);
    }

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    )
        external
        virtual
        override
        ensure(deadline)
        returns (uint256[] memory amounts)
    {
        amounts = MakiswapLibrary.getAmountsIn(factory, amountOut, path);
        require(
            amounts[0] <= amountInMax,
            "MakiswapRouter: EXCESSIVE_INPUT_AMOUNT"
        );
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            MakiswapLibrary.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, to);
    }

    function swapExactHTForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    )
        external
        payable
        virtual
        override
        ensure(deadline)
        returns (uint256[] memory amounts)
    {
        require(path[0] == WHT, "MakiswapRouter: INVALID_PATH");
        amounts = MakiswapLibrary.getAmountsOut(factory, msg.value, path);
        require(
            amounts[amounts.length - 1] >= amountOutMin,
            "MakiswapRouter: INSUFFICIENT_OUTPUT_AMOUNT"
        );
        IWHT(WHT).deposit{value: amounts[0]}();
        assert(
            IWHT(WHT).transfer(
                MakiswapLibrary.pairFor(factory, path[0], path[1]),
                amounts[0]
            )
        );
        _swap(amounts, path, to);
    }

    function swapTokensForExactHT(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    )
        external
        virtual
        override
        ensure(deadline)
        returns (uint256[] memory amounts)
    {
        require(path[path.length - 1] == WHT, "MakiswapRouter: INVALID_PATH");
        amounts = MakiswapLibrary.getAmountsIn(factory, amountOut, path);
        require(
            amounts[0] <= amountInMax,
            "MakiswapRouter: EXCESSIVE_INPUT_AMOUNT"
        );
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            MakiswapLibrary.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, address(this));
        IWHT(WHT).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferHT(to, amounts[amounts.length - 1]);
    }

    function swapExactTokensForHT(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    )
        external
        virtual
        override
        ensure(deadline)
        returns (uint256[] memory amounts)
    {
        require(path[path.length - 1] == WHT, "MakiswapRouter: INVALID_PATH");
        amounts = MakiswapLibrary.getAmountsOut(factory, amountIn, path);
        require(
            amounts[amounts.length - 1] >= amountOutMin,
            "MakiswapRouter: INSUFFICIENT_OUTPUT_AMOUNT"
        );
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            MakiswapLibrary.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, address(this));
        IWHT(WHT).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferHT(to, amounts[amounts.length - 1]);
    }

    function swapHTForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    )
        external
        payable
        virtual
        override
        ensure(deadline)
        returns (uint256[] memory amounts)
    {
        require(path[0] == WHT, "MakiswapRouter: INVALID_PATH");
        amounts = MakiswapLibrary.getAmountsIn(factory, amountOut, path);
        require(
            amounts[0] <= msg.value,
            "MakiswapRouter: EXCESSIVE_INPUT_AMOUNT"
        );
        IWHT(WHT).deposit{value: amounts[0]}();
        assert(
            IWHT(WHT).transfer(
                MakiswapLibrary.pairFor(factory, path[0], path[1]),
                amounts[0]
            )
        );
        _swap(amounts, path, to);
        // refund dust ht, if any
        if (msg.value > amounts[0])
            TransferHelper.safeTransferHT(msg.sender, msg.value - amounts[0]);
    }

    // **** SWAP (supporting fee-on-transfer tokens) ****
    // requires the initial amount to have already been sent to the first pair
    function _swapSupportingFeeOnTransferTokens(
        address[] memory path,
        address _to
    ) internal virtual {
        for (uint256 i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0, ) = MakiswapLibrary.sortTokens(input, output);
            IMakiswapPair pair =
                IMakiswapPair(MakiswapLibrary.pairFor(factory, input, output));
            uint256 amountInput;
            uint256 amountOutput;
            {
                // scope to avoid stack too deep errors
                (uint256 reserve0, uint256 reserve1, ) = pair.getReserves();
                (uint256 reserveInput, uint256 reserveOutput) =
                    input == token0
                        ? (reserve0, reserve1)
                        : (reserve1, reserve0);
                amountInput = IHRC20(input).balanceOf(address(pair)).sub(
                    reserveInput
                );
                amountOutput = MakiswapLibrary.getAmountOut(
                    amountInput,
                    reserveInput,
                    reserveOutput
                );
            }
            (uint256 amount0Out, uint256 amount1Out) =
                input == token0
                    ? (uint256(0), amountOutput)
                    : (amountOutput, uint256(0));
            address to =
                i < path.length - 2
                    ? MakiswapLibrary.pairFor(factory, output, path[i + 2])
                    : _to;
            pair.swap(amount0Out, amount1Out, to, new bytes(0));
        }
    }

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual override ensure(deadline) {
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            MakiswapLibrary.pairFor(factory, path[0], path[1]),
            amountIn
        );
        uint256 balanceBefore = IHRC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IHRC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >=
                amountOutMin,
            "MakiswapRouter: INSUFFICIENT_OUTPUT_AMOUNT"
        );
    }

    function swapExactHTForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable virtual override ensure(deadline) {
        require(path[0] == WHT, "MakiswapRouter: INVALID_PATH");
        uint256 amountIn = msg.value;
        IWHT(WHT).deposit{value: amountIn}();
        assert(
            IWHT(WHT).transfer(
                MakiswapLibrary.pairFor(factory, path[0], path[1]),
                amountIn
            )
        );
        uint256 balanceBefore = IHRC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IHRC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >=
                amountOutMin,
            "MakiswapRouter: INSUFFICIENT_OUTPUT_AMOUNT"
        );
    }

    function swapExactTokensForHTSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual override ensure(deadline) {
        require(path[path.length - 1] == WHT, "MakiswapRouter: INVALID_PATH");
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            MakiswapLibrary.pairFor(factory, path[0], path[1]),
            amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint256 amountOut = IHRC20(WHT).balanceOf(address(this));
        require(
            amountOut >= amountOutMin,
            "MakiswapRouter: INSUFFICIENT_OUTPUT_AMOUNT"
        );
        IWHT(WHT).withdraw(amountOut);
        TransferHelper.safeTransferHT(to, amountOut);
    }

    // **** LIBRARY FUNCTIONS ****
    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) public pure virtual override returns (uint256 amountB) {
        return MakiswapLibrary.quote(amountA, reserveA, reserveB);
    }

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) public pure virtual override returns (uint256 amountOut) {
        return MakiswapLibrary.getAmountOut(amountIn, reserveIn, reserveOut);
    }

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) public pure virtual override returns (uint256 amountIn) {
        return MakiswapLibrary.getAmountIn(amountOut, reserveIn, reserveOut);
    }

    function getAmountsOut(uint256 amountIn, address[] memory path)
        public
        view
        virtual
        override
        returns (uint256[] memory amounts)
    {
        return MakiswapLibrary.getAmountsOut(factory, amountIn, path);
    }

    function getAmountsIn(uint256 amountOut, address[] memory path)
        public
        view
        virtual
        override
        returns (uint256[] memory amounts)
    {
        return MakiswapLibrary.getAmountsIn(factory, amountOut, path);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WHT","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WHT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountHTMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityHT","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountHT","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountHTMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityHT","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountHT","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountHTMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityHTSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountHT","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountHTMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityHTWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountHT","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountHTMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityHTWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountHT","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactHTForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactHTForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForHT","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForHTSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapHTForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactHT","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c060405234801561001057600080fd5b5060405162004815380380620048158339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c614690620001856000398061015f5280610e2a5280610f9e52806110545280611110528061141752806115a452806116a4528061175352806118295280611b905280611bdc5280611d0f5280611d655280611d995280611e0d5280611fad52806120f05280612178528061243d52806124d2528061254652806127dd52806128185280612b875280612ccd5280612d55525080610cb35280610cec5280610ed952806110ee5280611243528061131a52806114a552806118b75280611bba5280611d43528061204052806121aa5280612349528061257852806128f85280612af05280612b195280612c1a5280612d875280612eeb528061347552806135f45280613a145280613a4a5280613d7b5280613e295280613ea952506146906000f3fe60806040526004361061014f5760003560e01c806379836890116100b6578063b08700c61161006f578063b08700c614610a37578063baa2abde14610a8a578063c45a015514610ae7578063d06ca61f14610afc578063de6b825614610bb1578063e8e3370014610c3557610188565b806379836890146107c95780637edecb451461082d57806385f8c259146108b15780638803dbee146108e7578063a223880b1461097d578063ad615dec14610a0157610188565b806346eb60511161010857806346eb6051146105105780634883f12a146105a65780634b361208146105f95780635c11d7951461068f5780635cb4859214610725578063613fc2491461075657610188565b8063054d50d41461018d5780631f00ca74146101d55780632195995c146102da57806325ae1cda1461037157806329dd23271461040757806338ed17391461047a57610188565b3661018857336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461018657fe5b005b600080fd5b34801561019957600080fd5b506101c3600480360360608110156101b057600080fd5b5080359060208101359060400135610c97565b60408051918252519081900360200190f35b3480156101e157600080fd5b5061028a600480360360408110156101f857600080fd5b81359190810190604081016020820135600160201b81111561021957600080fd5b82018360208201111561022b57600080fd5b803590602001918460208302840111600160201b8311171561024c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610cac945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102c65781810151838201526020016102ae565b505050509050019250505060405180910390f35b3480156102e657600080fd5b5061035860048036036101608110156102fe57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff6101008201351690610120810135906101400135610ce2565b6040805192835260208301919091528051918290030190f35b34801561037d57600080fd5b50610186600480360360a081101561039457600080fd5b813591602081013591810190606081016040820135600160201b8111156103ba57600080fd5b8201836020820111156103cc57600080fd5b803590602001918460208302840111600160201b831117156103ed57600080fd5b91935091506001600160a01b038135169060200135610ddc565b34801561041357600080fd5b50610358600480360361014081101561042b57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356110e4565b34801561048657600080fd5b5061028a600480360360a081101561049d57600080fd5b813591602081013591810190606081016040820135600160201b8111156104c357600080fd5b8201836020820111156104d557600080fd5b803590602001918460208302840111600160201b831117156104f657600080fd5b91935091506001600160a01b0381351690602001356111f8565b34801561051c57600080fd5b5061028a600480360360a081101561053357600080fd5b813591602081013591810190606081016040820135600160201b81111561055957600080fd5b82018360208201111561056b57600080fd5b803590602001918460208302840111600160201b8311171561058c57600080fd5b91935091506001600160a01b0381351690602001356113c7565b3480156105b257600080fd5b506101c3600480360360c08110156105c957600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135611658565b34801561060557600080fd5b5061028a600480360360a081101561061c57600080fd5b813591602081013591810190606081016040820135600160201b81111561064257600080fd5b82018360208201111561065457600080fd5b803590602001918460208302840111600160201b8311171561067557600080fd5b91935091506001600160a01b0381351690602001356117d9565b34801561069b57600080fd5b50610186600480360360a08110156106b257600080fd5b813591602081013591810190606081016040820135600160201b8111156106d857600080fd5b8201836020820111156106ea57600080fd5b803590602001918460208302840111600160201b8311171561070b57600080fd5b91935091506001600160a01b038135169060200135611968565b34801561073157600080fd5b5061073a611b8e565b604080516001600160a01b039092168252519081900360200190f35b34801561076257600080fd5b506101c3600480360361014081101561077a57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135611bb2565b61080f600480360360c08110156107df57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135611cc0565b60408051938452602084019290925282820152519081900360600190f35b61028a6004803603608081101561084357600080fd5b81359190810190604081016020820135600160201b81111561086457600080fd5b82018360208201111561087657600080fd5b803590602001918460208302840111600160201b8311171561089757600080fd5b91935091506001600160a01b038135169060200135611f65565b3480156108bd57600080fd5b506101c3600480360360608110156108d457600080fd5b50803590602081013590604001356122f1565b3480156108f357600080fd5b5061028a600480360360a081101561090a57600080fd5b813591602081013591810190606081016040820135600160201b81111561093057600080fd5b82018360208201111561094257600080fd5b803590602001918460208302840111600160201b8311171561096357600080fd5b91935091506001600160a01b0381351690602001356122fe565b6101866004803603608081101561099357600080fd5b81359190810190604081016020820135600160201b8111156109b457600080fd5b8201836020820111156109c657600080fd5b803590602001918460208302840111600160201b831117156109e757600080fd5b91935091506001600160a01b0381351690602001356123f7565b348015610a0d57600080fd5b506101c360048036036060811015610a2457600080fd5b5080359060208101359060400135612783565b348015610a4357600080fd5b50610358600480360360c0811015610a5a57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612790565b348015610a9657600080fd5b50610358600480360360e0811015610aad57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c001356128aa565b348015610af357600080fd5b5061073a612aee565b348015610b0857600080fd5b5061028a60048036036040811015610b1f57600080fd5b81359190810190604081016020820135600160201b811115610b4057600080fd5b820183602082011115610b5257600080fd5b803590602001918460208302840111600160201b83111715610b7357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612b12945050505050565b61028a60048036036080811015610bc757600080fd5b81359190810190604081016020820135600160201b811115610be857600080fd5b820183602082011115610bfa57600080fd5b803590602001918460208302840111600160201b83111715610c1b57600080fd5b91935091506001600160a01b038135169060200135612b3f565b348015610c4157600080fd5b5061080f6004803603610100811015610c5957600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135612e88565b6000610ca4848484612fc4565b949350505050565b6060610cd97f000000000000000000000000000000000000000000000000000000000000000084846130b4565b90505b92915050565b6000806000610d127f00000000000000000000000000000000000000000000000000000000000000008f8f613201565b9050600087610d21578c610d25565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b158015610d9b57600080fd5b505af1158015610daf573d6000803e3d6000fd5b50505050610dc28f8f8f8f8f8f8f6128aa565b809450819550505050509b509b9950505050505050505050565b8042811015610e20576040805162461bcd60e51b8152602060048201526017602482015260008051602061454f833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001685856000198101818110610e5a57fe5b905060200201356001600160a01b03166001600160a01b031614610eb3576040805162461bcd60e51b815260206004820152601c6024820152600080516020614456833981519152604482015290519081900360640190fd5b610f3d85856000818110610ec357fe5b905060200201356001600160a01b031633610f377f000000000000000000000000000000000000000000000000000000000000000089896000818110610f0557fe5b905060200201356001600160a01b03168a8a6001818110610f2257fe5b905060200201356001600160a01b0316613201565b8a6132c1565b610f7b85858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525030925061341e915050565b604080516370a0823160e01b815230600482015290516000916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b158015610fe557600080fd5b505afa158015610ff9573d6000803e3d6000fd5b505050506040513d602081101561100f57600080fd5b50519050868110156110525760405162461bcd60e51b815260040180806020018281038252602a8152602001806145bf602a913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156110b857600080fd5b505af11580156110cc573d6000803e3d6000fd5b505050506110da848261373b565b5050505050505050565b60008060006111347f00000000000000000000000000000000000000000000000000000000000000008e7f0000000000000000000000000000000000000000000000000000000000000000613201565b9050600087611143578c611147565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156111bd57600080fd5b505af11580156111d1573d6000803e3d6000fd5b505050506111e38e8e8e8e8e8e612790565b909f909e509c50505050505050505050505050565b6060814281101561123e576040805162461bcd60e51b8152602060048201526017602482015260008051602061454f833981519152604482015290519081900360640190fd5b61129c7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061382e92505050565b915086826001845103815181106112af57fe5b602002602001015110156112f45760405162461bcd60e51b815260040180806020018281038252602a8152602001806145bf602a913960400191505060405180910390fd5b61137d8686600081811061130457fe5b905060200201356001600160a01b0316336113637f00000000000000000000000000000000000000000000000000000000000000008a8a600081811061134657fe5b905060200201356001600160a01b03168b8b6001818110610f2257fe5b8560008151811061137057fe5b60200260200101516132c1565b6113bc82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613965915050565b509695505050505050565b6060814281101561140d576040805162461bcd60e51b8152602060048201526017602482015260008051602061454f833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686600019810181811061144757fe5b905060200201356001600160a01b03166001600160a01b0316146114a0576040805162461bcd60e51b815260206004820152601c6024820152600080516020614456833981519152604482015290519081900360640190fd5b6114fe7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506130b492505050565b9150868260008151811061150e57fe5b602002602001015111156115535760405162461bcd60e51b81526004018080602001828103825260268152602001806145296026913960400191505060405180910390fd5b6115638686600081811061130457fe5b6115a282878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613965915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836001855103815181106115e157fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561161f57600080fd5b505af1158015611633573d6000803e3d6000fd5b505050506113bc848360018551038151811061164b57fe5b602002602001015161373b565b6000814281101561169e576040805162461bcd60e51b8152602060048201526017602482015260008051602061454f833981519152604482015290519081900360640190fd5b6116cd887f000000000000000000000000000000000000000000000000000000000000000089898930896128aa565b604080516370a0823160e01b8152306004820152905191945061175192508a9187916001600160a01b038416916370a0823191602480820192602092909190829003018186803b15801561172057600080fd5b505afa158015611734573d6000803e3d6000fd5b505050506040513d602081101561174a57600080fd5b5051613b9e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156117b757600080fd5b505af11580156117cb573d6000803e3d6000fd5b505050506113bc848361373b565b6060814281101561181f576040805162461bcd60e51b8152602060048201526017602482015260008051602061454f833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686600019810181811061185957fe5b905060200201356001600160a01b03166001600160a01b0316146118b2576040805162461bcd60e51b815260206004820152601c6024820152600080516020614456833981519152604482015290519081900360640190fd5b6119107f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061382e92505050565b9150868260018451038151811061192357fe5b602002602001015110156115535760405162461bcd60e51b815260040180806020018281038252602a8152602001806145bf602a913960400191505060405180910390fd5b80428110156119ac576040805162461bcd60e51b8152602060048201526017602482015260008051602061454f833981519152604482015290519081900360640190fd5b6119bc85856000818110610ec357fe5b6000858560001981018181106119ce57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611a3357600080fd5b505afa158015611a47573d6000803e3d6000fd5b505050506040513d6020811015611a5d57600080fd5b50516040805160208881028281018201909352888252929350611a9f92909189918991829185019084908082843760009201919091525088925061341e915050565b86611b518288886000198101818110611ab457fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611b1957600080fd5b505afa158015611b2d573d6000803e3d6000fd5b505050506040513d6020811015611b4357600080fd5b50519063ffffffff613d0816565b10156110da5760405162461bcd60e51b815260040180806020018281038252602a8152602001806145bf602a913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b600080611c007f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000613201565b9050600086611c0f578b611c13565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b158015611c8957600080fd5b505af1158015611c9d573d6000803e3d6000fd5b50505050611caf8d8d8d8d8d8d611658565b9d9c50505050505050505050505050565b60008060008342811015611d09576040805162461bcd60e51b8152602060048201526017602482015260008051602061454f833981519152604482015290519081900360640190fd5b611d378a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c613d4a565b90945092506000611d897f00000000000000000000000000000000000000000000000000000000000000008c7f0000000000000000000000000000000000000000000000000000000000000000613201565b9050611d978b3383886132c1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015611df257600080fd5b505af1158015611e06573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611e8b57600080fd5b505af1158015611e9f573d6000803e3d6000fd5b505050506040513d6020811015611eb557600080fd5b5051611ebd57fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015611f1557600080fd5b505af1158015611f29573d6000803e3d6000fd5b505050506040513d6020811015611f3f57600080fd5b5051925034841015611f5757611f573385340361373b565b505096509650969350505050565b60608142811015611fab576040805162461bcd60e51b8152602060048201526017602482015260008051602061454f833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611fe257fe5b905060200201356001600160a01b03166001600160a01b03161461203b576040805162461bcd60e51b815260206004820152601c6024820152600080516020614456833981519152604482015290519081900360640190fd5b6120997f0000000000000000000000000000000000000000000000000000000000000000888888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506130b492505050565b915034826000815181106120a957fe5b602002602001015111156120ee5760405162461bcd60e51b81526004018080602001828103825260268152602001806145296026913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db08360008151811061212a57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561215d57600080fd5b505af1158015612171573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6121d67f000000000000000000000000000000000000000000000000000000000000000089896000818110610f0557fe5b846000815181106121e357fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561223a57600080fd5b505af115801561224e573d6000803e3d6000fd5b505050506040513d602081101561226457600080fd5b505161226c57fe5b6122ab82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613965915050565b816000815181106122b857fe5b60200260200101513411156122e7576122e733836000815181106122d857fe5b6020026020010151340361373b565b5095945050505050565b6000610ca4848484613fbe565b60608142811015612344576040805162461bcd60e51b8152602060048201526017602482015260008051602061454f833981519152604482015290519081900360640190fd5b6123a27f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506130b492505050565b915086826000815181106123b257fe5b602002602001015111156112f45760405162461bcd60e51b81526004018080602001828103825260268152602001806145296026913960400191505060405180910390fd5b804281101561243b576040805162461bcd60e51b8152602060048201526017602482015260008051602061454f833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168585600081811061247257fe5b905060200201356001600160a01b03166001600160a01b0316146124cb576040805162461bcd60e51b815260206004820152601c6024820152600080516020614456833981519152604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561252b57600080fd5b505af115801561253f573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6125a47f000000000000000000000000000000000000000000000000000000000000000089896000818110610f0557fe5b836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156125f457600080fd5b505af1158015612608573d6000803e3d6000fd5b505050506040513d602081101561261e57600080fd5b505161262657fe5b60008686600019810181811061263857fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561269d57600080fd5b505afa1580156126b1573d6000803e3d6000fd5b505050506040513d60208110156126c757600080fd5b505160408051602089810282810182019093528982529293506127099290918a918a91829185019084908082843760009201919091525089925061341e915050565b87611b51828989600019810181811061271e57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611b1957600080fd5b6000610ca48484846140ae565b60008082428110156127d7576040805162461bcd60e51b8152602060048201526017602482015260008051602061454f833981519152604482015290519081900360640190fd5b612806897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a6128aa565b9093509150612816898685613b9e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561287c57600080fd5b505af1158015612890573d6000803e3d6000fd5b5050505061289e858361373b565b50965096945050505050565b60008082428110156128f1576040805162461bcd60e51b8152602060048201526017602482015260008051602061454f833981519152604482015290519081900360640190fd5b600061291e7f00000000000000000000000000000000000000000000000000000000000000008c8c613201565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b15801561297957600080fd5b505af115801561298d573d6000803e3d6000fd5b505050506040513d60208110156129a357600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b1580156129f057600080fd5b505af1158015612a04573d6000803e3d6000fd5b505050506040513d6040811015612a1a57600080fd5b50805160209091015190925090506000612a348e8e61415a565b509050806001600160a01b03168e6001600160a01b031614612a57578183612a5a565b82825b90975095508a871015612a9e5760405162461bcd60e51b815260040180806020018281038252602581526020018061459a6025913960400191505060405180910390fd5b89861015612add5760405162461bcd60e51b815260040180806020018281038252602581526020018061449d6025913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6060610cd97f0000000000000000000000000000000000000000000000000000000000000000848461382e565b60608142811015612b85576040805162461bcd60e51b8152602060048201526017602482015260008051602061454f833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612bbc57fe5b905060200201356001600160a01b03166001600160a01b031614612c15576040805162461bcd60e51b815260206004820152601c6024820152600080516020614456833981519152604482015290519081900360640190fd5b612c737f00000000000000000000000000000000000000000000000000000000000000003488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061382e92505050565b91508682600184510381518110612c8657fe5b60200260200101511015612ccb5760405162461bcd60e51b815260040180806020018281038252602a8152602001806145bf602a913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110612d0757fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612d3a57600080fd5b505af1158015612d4e573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612db37f000000000000000000000000000000000000000000000000000000000000000089896000818110610f0557fe5b84600081518110612dc057fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612e1757600080fd5b505af1158015612e2b573d6000803e3d6000fd5b505050506040513d6020811015612e4157600080fd5b5051612e4957fe5b6122e782878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613965915050565b60008060008342811015612ed1576040805162461bcd60e51b8152602060048201526017602482015260008051602061454f833981519152604482015290519081900360640190fd5b612edf8c8c8c8c8c8c613d4a565b90945092506000612f117f00000000000000000000000000000000000000000000000000000000000000008e8e613201565b9050612f1f8d3383886132c1565b612f2b8c3383876132c1565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612f8357600080fd5b505af1158015612f97573d6000803e3d6000fd5b505050506040513d6020811015612fad57600080fd5b5051949d939c50939a509198505050505050505050565b60008084116130045760405162461bcd60e51b815260040180806020018281038252602a8152602001806145e9602a913960400191505060405180910390fd5b6000831180156130145750600082115b61304f5760405162461bcd60e51b81526004018080602001828103825260278152602001806144766027913960400191505060405180910390fd5b6000613063856103e663ffffffff61423816565b90506000613077828563ffffffff61423816565b9050600061309d83613091886103e863ffffffff61423816565b9063ffffffff61429116565b90508082816130a857fe5b04979650505050505050565b606060028251101561310d576040805162461bcd60e51b815260206004820152601d60248201527f4d616b69737761704c6962726172793a20494e56414c49445f50415448000000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561312557600080fd5b5060405190808252806020026020018201604052801561314f578160200160208202803683370190505b509050828160018351038151811061316357fe5b60209081029190910101528151600019015b80156131f9576000806131b28786600186038151811061319157fe5b60200260200101518786815181106131a557fe5b60200260200101516142eb565b915091506131d48484815181106131c557fe5b60200260200101518383613fbe565b8460018503815181106131e357fe5b6020908102919091010152505060001901613175565b509392505050565b6000806000613210858561415a565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527f76ad5042ab28d96f7f282da03b97d50271603b12d04aa326091827f6a008f4cf609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106133465780518252601f199092019160209182019101613327565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146133a8576040519150601f19603f3d011682016040523d82523d6000602084013e6133ad565b606091505b50915091508180156133db5750805115806133db57508080602001905160208110156133d857600080fd5b50515b6134165760405162461bcd60e51b81526004018080602001828103825260248152602001806146136024913960400191505060405180910390fd5b505050505050565b60005b60018351038110156137365760008084838151811061343c57fe5b602002602001015185846001018151811061345357fe5b602002602001015191509150600061346b838361415a565b509050600061349b7f00000000000000000000000000000000000000000000000000000000000000008585613201565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156134dc57600080fd5b505afa1580156134f0573d6000803e3d6000fd5b505050506040513d606081101561350657600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a81169089161461353c57828461353f565b83835b9150915061359d828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611b1957600080fd5b95506135aa868383612fc4565b945050505050600080856001600160a01b0316886001600160a01b0316146135d4578260006135d8565b6000835b91509150600060028c51038a106135ef578a613630565b6136307f0000000000000000000000000000000000000000000000000000000000000000898e8d6002018151811061362357fe5b6020026020010151613201565b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b838110156136ba5781810151838201526020016136a2565b50505050905090810190601f1680156136e75780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561370957600080fd5b505af115801561371d573d6000803e3d6000fd5b50506001909b019a506134219950505050505050505050565b505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106137875780518252601f199092019160209182019101613768565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146137e9576040519150601f19603f3d011682016040523d82523d6000602084013e6137ee565b606091505b50509050806137365760405162461bcd60e51b81526004018080602001828103825260228152602001806144c26022913960400191505060405180910390fd5b6060600282511015613887576040805162461bcd60e51b815260206004820152601d60248201527f4d616b69737761704c6962726172793a20494e56414c49445f50415448000000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561389f57600080fd5b506040519080825280602002602001820160405280156138c9578160200160208202803683370190505b50905082816000815181106138da57fe5b60200260200101818152505060005b60018351038110156131f95760008061391f8786858151811061390857fe5b60200260200101518786600101815181106131a557fe5b9150915061394184848151811061393257fe5b60200260200101518383612fc4565b84846001018151811061395057fe5b602090810291909101015250506001016138e9565b60005b6001835103811015613b985760008084838151811061398357fe5b602002602001015185846001018151811061399a57fe5b60200260200101519150915060006139b2838361415a565b50905060008785600101815181106139c657fe5b60200260200101519050600080836001600160a01b0316866001600160a01b0316146139f4578260006139f8565b6000835b91509150600060028a51038810613a0f5788613a43565b613a437f0000000000000000000000000000000000000000000000000000000000000000878c8b6002018151811061362357fe5b9050613a707f00000000000000000000000000000000000000000000000000000000000000008888613201565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613aad576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613b1e578181015183820152602001613b06565b50505050905090810190601f168015613b4b5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613b6d57600080fd5b505af1158015613b81573d6000803e3d6000fd5b505060019099019850613968975050505050505050565b50505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b60208310613c1b5780518252601f199092019160209182019101613bfc565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613c7d576040519150601f19603f3d011682016040523d82523d6000602084013e613c82565b606091505b5091509150818015613cb0575080511580613cb05750808060200190516020811015613cad57600080fd5b50515b613d01576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b6000610cd983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506143be565b6040805163e6a4390560e01b81526001600160a01b03888116600483015287811660248301529151600092839283927f00000000000000000000000000000000000000000000000000000000000000009092169163e6a4390591604480820192602092909190829003018186803b158015613dc457600080fd5b505afa158015613dd8573d6000803e3d6000fd5b505050506040513d6020811015613dee57600080fd5b50516001600160a01b03161415613ea157604080516364e329cb60e11b81526001600160a01b038a81166004830152898116602483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163c9c65396916044808201926020929091908290030181600087803b158015613e7457600080fd5b505af1158015613e88573d6000803e3d6000fd5b505050506040513d6020811015613e9e57600080fd5b50505b600080613ecf7f00000000000000000000000000000000000000000000000000000000000000008b8b6142eb565b91509150816000148015613ee1575080155b15613ef157879350869250613fb1565b6000613efe8984846140ae565b9050878111613f515785811015613f465760405162461bcd60e51b815260040180806020018281038252602581526020018061449d6025913960400191505060405180910390fd5b889450925082613faf565b6000613f5e8984866140ae565b905089811115613f6a57fe5b87811015613fa95760405162461bcd60e51b815260040180806020018281038252602581526020018061459a6025913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b6000808411613ffe5760405162461bcd60e51b815260040180806020018281038252602b81526020018061456f602b913960400191505060405180910390fd5b60008311801561400e5750600082115b6140495760405162461bcd60e51b81526004018080602001828103825260278152602001806144766027913960400191505060405180910390fd5b600061406d6103e8614061868863ffffffff61423816565b9063ffffffff61423816565b905060006140876103e6614061868963ffffffff613d0816565b90506140a4600182848161409757fe5b049063ffffffff61429116565b9695505050505050565b60008084116140ee5760405162461bcd60e51b81526004018080602001828103825260248152602001806146376024913960400191505060405180910390fd5b6000831180156140fe5750600082115b6141395760405162461bcd60e51b81526004018080602001828103825260278152602001806144766027913960400191505060405180910390fd5b8261414a858463ffffffff61423816565b8161415157fe5b04949350505050565b600080826001600160a01b0316846001600160a01b031614156141ae5760405162461bcd60e51b81526004018080602001828103825260248152602001806144e46024913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b0316106141ce5782846141d1565b83835b90925090506001600160a01b038216614231576040805162461bcd60e51b815260206004820152601d60248201527f4d616b69737761704c6962726172793a205a45524f5f41444452455353000000604482015290519081900360640190fd5b9250929050565b60008261424757506000610cdc565b8282028284828161425457fe5b0414610cd95760405162461bcd60e51b81526004018080602001828103825260218152602001806145086021913960400191505060405180910390fd5b600082820183811015610cd9576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008060006142fa858561415a565b509050614308868686613201565b50600080614317888888613201565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561434f57600080fd5b505afa158015614363573d6000803e3d6000fd5b505050506040513d606081101561437957600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b03878116908416146143ac5780826143af565b81815b90999098509650505050505050565b6000818484111561444d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156144125781810151838201526020016143fa565b50505050905090810190601f16801561443f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50505090039056fe4d616b6973776170526f757465723a20494e56414c49445f50415448000000004d616b69737761704c6962726172793a20494e53554646494349454e545f4c49515549444954594d616b6973776170526f757465723a20494e53554646494349454e545f425f414d4f554e545472616e7366657248656c7065723a2048545f5452414e534645525f4641494c45444d616b69737761704c6962726172793a204944454e544943414c5f414444524553534553536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774d616b6973776170526f757465723a204558434553534956455f494e5055545f414d4f554e544d616b6973776170526f757465723a20455850495245440000000000000000004d616b69737761704c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e544d616b6973776170526f757465723a20494e53554646494349454e545f415f414d4f554e544d616b6973776170526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e544d616b69737761704c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e545472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c45444d616b69737761704c6962726172793a20494e53554646494349454e545f414d4f554e54a26469706673582212208b6e14beaf19f2c08abd78ecad6e41153993654575bd6e9ce90fbe384dfa1cad64736f6c6343000606003300000000000000000000000011cdc9bd86ff68b6a6152037342bae0c3a717f560000000000000000000000005545153ccfca01fbd7dd11c0b23ba694d9509a6f

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

00000000000000000000000011cdc9bd86ff68b6a6152037342bae0c3a717f560000000000000000000000005545153ccfca01fbd7dd11c0b23ba694d9509a6f

-----Decoded View---------------
Arg [0] : _factory (address): 0x11cdc9bd86ff68b6a6152037342bae0c3a717f56
Arg [1] : _WHT (address): 0x5545153ccfca01fbd7dd11c0b23ba694d9509a6f

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000011cdc9bd86ff68b6a6152037342bae0c3a717f56
Arg [1] : 0000000000000000000000005545153ccfca01fbd7dd11c0b23ba694d9509a6f


Deployed ByteCode Sourcemap

22110:21718:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22589:10;-1:-1:-1;;;;;22603:3:0;22589:17;;22582:25;;;;22110:21718;;12:1:-1;9;2:12;42772:257:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;42772:257:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;42772:257:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;43567:258;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43567:258:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;43567:258:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;43567:258:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;43567:258:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;43567:258:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;43567:258:0;;-1:-1:-1;43567:258:0;;-1:-1:-1;;;;;43567:258:0:i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;43567:258:0;;;;;;;;;;;;;;;;;28106:930;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28106:930:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;28106:930:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;41606:881;;5:9:-1;2:2;;;27:1;24;17:12;2:2;41606:881:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;41606:881:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;41606:881:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;41606:881:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;41606:881:0;;-1:-1:-1;41606:881:0;-1:-1:-1;;;;;;41606:881:0;;;;;;;;:::i;29044:943::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;29044:943:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;29044:943:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32827:763::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32827:763:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;32827:763:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;32827:763:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;32827:763:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;32827:763:0;;-1:-1:-1;32827:763:0;-1:-1:-1;;;;;;32827:763:0;;;;;;;;:::i;35204:959::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35204:959:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;35204:959:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;35204:959:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;35204:959:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;35204:959:0;;-1:-1:-1;35204:959:0;-1:-1:-1;;;;;;35204:959:0;;;;;;;;:::i;30066:754::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30066:754:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;30066:754:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;36171:981::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;36171:981:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;36171:981:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;36171:981:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;36171:981:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;36171:981:0;;-1:-1:-1;36171:981:0;-1:-1:-1;;;;;;36171:981:0;;;;;;;;:::i;39917:780::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39917:780:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;39917:780:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;39917:780:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;39917:780:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;39917:780:0;;-1:-1:-1;39917:780:0;-1:-1:-1;;;;;;39917:780:0;;;;;;;;:::i;22245:37::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22245:37:0;;;:::i;:::-;;;;-1:-1:-1;;;;;22245:37:0;;;;;;;;;;;;;;30828:924;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30828:924:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;30828:924:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;25259:1098::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;25259:1098:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;37160:973;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;37160:973:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;37160:973:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;37160:973:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;37160:973:0;;-1:-1:-1;37160:973:0;-1:-1:-1;;;;;;37160:973:0;;;;;;;;:::i;43037:256::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43037:256:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;43037:256:0;;;;;;;;;;;;:::i;33598:741::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33598:741:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;33598:741:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;33598:741:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;33598:741:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;33598:741:0;;-1:-1:-1;33598:741:0;-1:-1:-1;;;;;;33598:741:0;;;;;;;;:::i;40705:893::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;40705:893:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;40705:893:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;40705:893:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;40705:893:0;;-1:-1:-1;40705:893:0;-1:-1:-1;;;;;;40705:893:0;;;;;;;;:::i;42531:233::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;42531:233:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;42531:233:0;;;;;;;;;;;;:::i;27368:730::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27368:730:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;27368:730:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;26400:960::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26400:960:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;26400:960:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;22197:41::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22197:41:0;;;:::i;43301:258::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43301:258:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;43301:258:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;43301:258:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;43301:258:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;43301:258:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;43301:258:0;;-1:-1:-1;43301:258:0;;-1:-1:-1;;;;;43301:258:0:i;34347:849::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;34347:849:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;34347:849:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;34347:849:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;34347:849:0;;-1:-1:-1;34347:849:0;-1:-1:-1;;;;;;34347:849:0;;;;;;;;:::i;24302:949::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24302:949:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;24302:949:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;42772:257::-;42923:17;42960:61;42989:8;42999:9;43010:10;42960:28;:61::i;:::-;42953:68;42772:257;-1:-1:-1;;;;42772:257:0:o;43567:258::-;43714:24;43763:54;43792:7;43801:9;43812:4;43763:28;:54::i;:::-;43756:61;;43567:258;;;;;:::o;28106:930::-;28451:15;28468;28496:12;28511:48;28535:7;28544:6;28552;28511:23;:48::i;:::-;28496:63;;28570:13;28586:10;:36;;28613:9;28586:36;;;-1:-1:-1;;28586:36:0;28633:181;;;-1:-1:-1;;;28633:181:0;;28674:10;28633:181;;;;28707:4;28633:181;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28570:52;;-1:-1:-1;;;;;;28633:26:0;;;;;:181;;;;;-1:-1:-1;;28633:181:0;;;;;;;;-1:-1:-1;28633:26:0;:181;;;2:2:-1;;;;27:1;24;17:12;2:2;28633:181:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28633:181:0;;;;28846:182;28876:6;28897;28918:9;28942:10;28967;28992:2;29009:8;28846:15;:182::i;:::-;28825:203;;;;;;;;28106:930;;;;;;;;;;;;;;;;:::o;41606:881::-;41845:8;22356:15;22344:8;:27;;22336:63;;;;;-1:-1:-1;;;22336:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22336:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;41899:3:0::1;41874:28;:4:::0;;-1:-1:-1;;41879:15:0;;41874:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;41874:21:0::1;-1:-1:-1::0;;;;;41874:28:0::1;;41866:69;;;::::0;;-1:-1:-1;;;41866:69:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;41866:69:0;;;;;;;;;;;;;::::1;;41946:177;41992:4;;41997:1;41992:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;41992:7:0::1;42014:10;42039:50;42063:7;42072:4;;42077:1;42072:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;42072:7:0::1;42081:4;;42086:1;42081:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;42081:7:0::1;42039:23;:50::i;:::-;42104:8;41946:31;:177::i;:::-;42134:55;42169:4;;42134:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;42183:4:0::1;::::0;-1:-1:-1;42134:34:0::1;::::0;-1:-1:-1;;42134:55:0:i:1;:::-;42220:36;::::0;;-1:-1:-1;;;42220:36:0;;42250:4:::1;42220:36;::::0;::::1;::::0;;;42200:17:::1;::::0;-1:-1:-1;;;;;42227:3:0::1;42220:21;::::0;::::1;::::0;:36;;;;;::::1;::::0;;;;;;;;;:21;:36;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;42220:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;42220:36:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;42220:36:0;;-1:-1:-1;42289:25:0;;::::1;;42267:117;;;;-1:-1:-1::0;;;42267:117:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42400:3;-1:-1:-1::0;;;;;42395:18:0::1;;42414:9;42395:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;42395:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;42395:29:0;;;;42435:44;42465:2;42469:9;42435:29;:44::i;:::-;22410:1;41606:881:::0;;;;;;;:::o;29044:943::-;29406:19;29427:16;29461:12;29476:44;29500:7;29509:5;29516:3;29476:23;:44::i;:::-;29461:59;;29531:13;29547:10;:36;;29574:9;29547:36;;;-1:-1:-1;;29547:36:0;29594:181;;;-1:-1:-1;;;29594:181:0;;29635:10;29594:181;;;;29668:4;29594:181;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29531:52;;-1:-1:-1;;;;;;29594:26:0;;;;;:181;;;;;-1:-1:-1;;29594:181:0;;;;;;;;-1:-1:-1;29594:26:0;:181;;;2:2:-1;;;;27:1;24;17:12;2:2;29594:181:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29594:181:0;;;;29812:167;29844:5;29864:9;29888:14;29917:11;29943:2;29960:8;29812:17;:167::i;:::-;29786:193;;;;-1:-1:-1;29044:943:0;-1:-1:-1;;;;;;;;;;;;;29044:943:0:o;32827:763::-;33105:24;33077:8;22356:15;22344:8;:27;;22336:63;;;;;-1:-1:-1;;;22336:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22336:63:0;;;;;;;;;;;;;;;33157:54:::1;33187:7;33196:8;33206:4;;33157:54;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;33157:29:0::1;::::0;-1:-1:-1;;;33157:54:0:i:1;:::-;33147:64;;33275:12;33244:7;33269:1;33252:7;:14;:18;33244:27;;;;;;;;;;;;;;:43;;33222:135;;;;-1:-1:-1::0;;;33222:135:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33368:179;33414:4;;33419:1;33414:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;33414:7:0::1;33436:10;33461:50;33485:7;33494:4;;33499:1;33494:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;33494:7:0::1;33503:4;;33508:1;33503:7;;;;;;33461:50;33526:7;33534:1;33526:10;;;;;;;;;;;;;;33368:31;:179::i;:::-;33558:24;33564:7;33573:4;;33558:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;33579:2:0;;-1:-1:-1;33558:5:0::1;::::0;-1:-1:-1;;33558:24:0:i:1;:::-;32827:763:::0;;;;;;;;;:::o;35204:959::-;35478:24;35450:8;22356:15;22344:8;:27;;22336:63;;;;;-1:-1:-1;;;22336:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22336:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;35553:3:0::1;35528:28;:4:::0;;-1:-1:-1;;35533:15:0;;35528:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;35528:21:0::1;-1:-1:-1::0;;;;;35528:28:0::1;;35520:69;;;::::0;;-1:-1:-1;;;35520:69:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;35520:69:0;;;;;;;;;;;;;::::1;;35610:54;35639:7;35648:9;35659:4;;35610:54;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;35610:28:0::1;::::0;-1:-1:-1;;;35610:54:0:i:1;:::-;35600:64;;35711:11;35697:7;35705:1;35697:10;;;;;;;;;;;;;;:25;;35675:113;;;;-1:-1:-1::0;;;35675:113:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35799:179;35845:4;;35850:1;35845:7;;;;;;35799:179;35989:35;35995:7;36004:4;;35989:35;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;36018:4:0::1;::::0;-1:-1:-1;35989:5:0::1;::::0;-1:-1:-1;;35989:35:0:i:1;:::-;36040:3;-1:-1:-1::0;;;;;36035:18:0::1;;36054:7;36079:1;36062:7;:14;:18;36054:27;;;;;;;;;;;;;;36035:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;36035:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;36035:47:0;;;;36093:62;36123:2;36127:7;36152:1;36135:7;:14;:18;36127:27;;;;;;;;;;;;;;36093:29;:62::i;30066:754::-:0;30342:16;30323:8;22356:15;22344:8;:27;;22336:63;;;;;-1:-1:-1;;;22336:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22336:63:0;;;;;;;;;;;;;;;30386:194:::1;30416:5;30436:3;30454:9;30478:14;30507:11;30541:4;30561:8;30386:15;:194::i;:::-;30670:38;::::0;;-1:-1:-1;;;30670:38:0;;30702:4:::1;30670:38;::::0;::::1;::::0;;;30371:209;;-1:-1:-1;30591:128:0::1;::::0;-1:-1:-1;30633:5:0;;30653:2;;-1:-1:-1;;;;;30670:23:0;::::1;::::0;::::1;::::0;:38;;;;;::::1;::::0;;;;;;;;;:23;:38;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;30670:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;30670:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;30670:38:0;30591:27:::1;:128::i;:::-;30735:3;-1:-1:-1::0;;;;;30730:18:0::1;;30749:8;30730:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;30730:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;30730:28:0;;;;30769:43;30799:2;30803:8;30769:29;:43::i;36171:981::-:0;36445:24;36417:8;22356:15;22344:8;:27;;22336:63;;;;;-1:-1:-1;;;22336:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22336:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;36520:3:0::1;36495:28;:4:::0;;-1:-1:-1;;36500:15:0;;36495:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;36495:21:0::1;-1:-1:-1::0;;;;;36495:28:0::1;;36487:69;;;::::0;;-1:-1:-1;;;36487:69:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;36487:69:0;;;;;;;;;;;;;::::1;;36577:54;36607:7;36616:8;36626:4;;36577:54;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;36577:29:0::1;::::0;-1:-1:-1;;;36577:54:0:i:1;:::-;36567:64;;36695:12;36664:7;36689:1;36672:7;:14;:18;36664:27;;;;;;;;;;;;;;:43;;36642:135;;;;-1:-1:-1::0;;;36642:135:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39917:780:::0;40160:8;22356:15;22344:8;:27;;22336:63;;;;;-1:-1:-1;;;22336:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22336:63:0;;;;;;;;;;;;;;;40181:177:::1;40227:4;;40232:1;40227:7;;;;;;40181:177;40369:21;40400:4:::0;;-1:-1:-1;;40405:15:0;;40400:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;40400:21:0::1;-1:-1:-1::0;;;;;40393:39:0::1;;40433:2;40393:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;40393:43:0::1;-1:-1:-1::0;;;;;40393:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;40393:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;40393:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;40393:43:0;40447:44:::1;::::0;;40393:43:::1;40447:44:::0;;::::1;::::0;;;;;;;;;;;40393:43;;-1:-1:-1;40447:44:0::1;::::0;;;40482:4;;;;;;40447:44;::::1;::::0;40482:4;;40447:44;40482:4;40447:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;40488:2:0;;-1:-1:-1;40447:34:0::1;::::0;-1:-1:-1;;40447:44:0:i:1;:::-;40607:12:::0;40524:62:::1;40572:13:::0;40531:4;;-1:-1:-1;;40536:15:0;;40531:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;40531:21:0::1;-1:-1:-1::0;;;;;40524:39:0::1;;40564:2;40524:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;40524:43:0::1;-1:-1:-1::0;;;;;40524:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;40524:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;40524:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;40524:43:0;;:62:::1;:47;:62;:::i;:::-;:95;;40502:187;;;;-1:-1:-1::0;;;40502:187:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22245:37:::0;;;:::o;30828:924::-;31183:16;31212:12;31227:44;31251:7;31260:5;31267:3;31227:23;:44::i;:::-;31212:59;;31282:13;31298:10;:36;;31325:9;31298:36;;;-1:-1:-1;;31298:36:0;31345:181;;;-1:-1:-1;;;31345:181:0;;31386:10;31345:181;;;;31419:4;31345:181;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31282:52;;-1:-1:-1;;;;;;31345:26:0;;;;;:181;;;;;-1:-1:-1;;31345:181:0;;;;;;;;-1:-1:-1;31345:26:0;:181;;;2:2:-1;;;;27:1;24;17:12;2:2;31345:181:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31345:181:0;;;;31548:196;31609:5;31629:9;31653:14;31682:11;31708:2;31725:8;31548:46;:196::i;:::-;31537:207;30828:924;-1:-1:-1;;;;;;;;;;;;;30828:924:0:o;25259:1098::-;25590:19;25624:16;25655:17;25548:8;22356:15;22344:8;:27;;22336:63;;;;;-1:-1:-1;;;22336:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22336:63:0;;;;;;;;;;;;;;;25726:174:::1;25754:5;25774:3;25792:18;25825:9;25849:14;25878:11;25726:13;:174::i;:::-;25700:200:::0;;-1:-1:-1;25700:200:0;-1:-1:-1;25911:12:0::1;25926:44;25950:7;25959:5:::0;25966:3:::1;25926:23;:44::i;:::-;25911:59;;25981:69;26013:5;26020:10;26032:4;26038:11;25981:31;:69::i;:::-;26066:3;-1:-1:-1::0;;;;;26061:17:0::1;;26086:8;26061:36;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;26061:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;26061:36:0;;;;;26120:3;-1:-1:-1::0;;;;;26115:18:0::1;;26134:4;26140:8;26115:34;;;;;;;;;;;;;-1:-1:-1::0;;;;;26115:34:0::1;-1:-1:-1::0;;;;;26115:34:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;26115:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;26115:34:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;26115:34:0;26108:42:::1;;;;26187:4;-1:-1:-1::0;;;;;26173:24:0::1;;26198:2;26173:28;;;;;;;;;;;;;-1:-1:-1::0;;;;;26173:28:0::1;-1:-1:-1::0;;;;;26173:28:0::1;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;26173:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;26173:28:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;26173:28:0;;-1:-1:-1;26251:9:0::1;:20:::0;-1:-1:-1;26247:102:0::1;;;26286:63;26316:10;26340:8;26328:9;:20;26286:29;:63::i;:::-;22410:1;25259:1098:::0;;;;;;;;;;;:::o;37160:973::-;37421:24;37393:8;22356:15;22344:8;:27;;22336:63;;;;;-1:-1:-1;;;22336:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22336:63:0;;;;;;;;;;;;;;;37482:3:::1;-1:-1:-1::0;;;;;37471:14:0::1;:4;;37476:1;37471:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;37471:7:0::1;-1:-1:-1::0;;;;;37471:14:0::1;;37463:55;;;::::0;;-1:-1:-1;;;37463:55:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;37463:55:0;;;;;;;;;;;;;::::1;;37539:54;37568:7;37577:9;37588:4;;37539:54;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;37539:28:0::1;::::0;-1:-1:-1;;;37539:54:0:i:1;:::-;37529:64;;37640:9;37626:7;37634:1;37626:10;;;;;;;;;;;;;;:23;;37604:111;;;;-1:-1:-1::0;;;37604:111:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37731:3;-1:-1:-1::0;;;;;37726:17:0::1;;37751:7;37759:1;37751:10;;;;;;;;;;;;;;37726:38;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;37726:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;37726:38:0;;;;;37801:3;-1:-1:-1::0;;;;;37796:18:0::1;;37833:50;37857:7;37866:4;;37871:1;37866:7;;;;;;37833:50;37902:7;37910:1;37902:10;;;;;;;;;;;;;;37796:131;;;;;;;;;;;;;-1:-1:-1::0;;;;;37796:131:0::1;-1:-1:-1::0;;;;;37796:131:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;37796:131:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;37796:131:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;37796:131:0;37775:163:::1;;;;37949:24;37955:7;37964:4;;37949:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;37970:2:0;;-1:-1:-1;37949:5:0::1;::::0;-1:-1:-1;;37949:24:0:i:1;:::-;38035:7;38043:1;38035:10;;;;;;;;;;;;;;38023:9;:22;38019:106;;;38060:65;38090:10;38114:7;38122:1;38114:10;;;;;;;;;;;;;;38102:9;:22;38060:29;:65::i;:::-;37160:973:::0;;;;;;;;:::o;43037:256::-;43188:16;43224:61;43252:9;43263;43274:10;43224:27;:61::i;33598:741::-;33876:24;33848:8;22356:15;22344:8;:27;;22336:63;;;;;-1:-1:-1;;;22336:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22336:63:0;;;;;;;;;;;;;;;33928:54:::1;33957:7;33966:9;33977:4;;33928:54;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;33928:28:0::1;::::0;-1:-1:-1;;;33928:54:0:i:1;:::-;33918:64;;34029:11;34015:7;34023:1;34015:10;;;;;;;;;;;;;;:25;;33993:113;;;;-1:-1:-1::0;;;33993:113:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40705:893:::0;40925:8;22356:15;22344:8;:27;;22336:63;;;;;-1:-1:-1;;;22336:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22336:63:0;;;;;;;;;;;;;;;40965:3:::1;-1:-1:-1::0;;;;;40954:14:0::1;:4;;40959:1;40954:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;40954:7:0::1;-1:-1:-1::0;;;;;40954:14:0::1;;40946:55;;;::::0;;-1:-1:-1;;;40946:55:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;40946:55:0;;;;;;;;;;;;;::::1;;41012:16;41031:9;41012:28;;41056:3;-1:-1:-1::0;;;;;41051:17:0::1;;41076:8;41051:36;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;41051:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;41051:36:0;;;;;41124:3;-1:-1:-1::0;;;;;41119:18:0::1;;41156:50;41180:7;41189:4;;41194:1;41189:7;;;;;;41156:50;41225:8;41119:129;;;;;;;;;;;;;-1:-1:-1::0;;;;;41119:129:0::1;-1:-1:-1::0;;;;;41119:129:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;41119:129:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;41119:129:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;41119:129:0;41098:161:::1;;;;41270:21;41301:4:::0;;-1:-1:-1;;41306:15:0;;41301:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;41301:21:0::1;-1:-1:-1::0;;;;;41294:39:0::1;;41334:2;41294:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;41294:43:0::1;-1:-1:-1::0;;;;;41294:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;41294:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;41294:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;41294:43:0;41348:44:::1;::::0;;41294:43:::1;41348:44:::0;;::::1;::::0;;;;;;;;;;;41294:43;;-1:-1:-1;41348:44:0::1;::::0;;;41383:4;;;;;;41348:44;::::1;::::0;41383:4;;41348:44;41383:4;41348:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;41389:2:0;;-1:-1:-1;41348:34:0::1;::::0;-1:-1:-1;;41348:44:0:i:1;:::-;41508:12:::0;41425:62:::1;41473:13:::0;41432:4;;-1:-1:-1;;41437:15:0;;41432:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;41432:21:0::1;-1:-1:-1::0;;;;;41425:39:0::1;;41465:2;41425:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;41425:43:0::1;-1:-1:-1::0;;;;;41425:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;42531:233:0::0;42671:15;42706:50;42728:7;42737:8;42747;42706:21;:50::i;27368:730::-;27660:19;27681:16;27632:8;22356:15;22344:8;:27;;22336:63;;;;;-1:-1:-1;;;22336:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22336:63:0;;;;;;;;;;;;;;;27741:194:::1;27771:5;27791:3;27809:9;27833:14;27862:11;27896:4;27916:8;27741:15;:194::i;:::-;27715:220:::0;;-1:-1:-1;27715:220:0;-1:-1:-1;27946:51:0::1;27974:5:::0;27981:2;27715:220;27946:27:::1;:51::i;:::-;28013:3;-1:-1:-1::0;;;;;28008:18:0::1;;28027:8;28008:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;28008:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;28008:28:0;;;;28047:43;28077:2;28081:8;28047:29;:43::i;:::-;27368:730:::0;;;;;;;;;;:::o;26400:960::-;26711:15;26728;26683:8;22356:15;22344:8;:27;;22336:63;;;;;-1:-1:-1;;;22336:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22336:63:0;;;;;;;;;;;;;;;26761:12:::1;26776:48;26800:7;26809:6;26817;26776:23;:48::i;:::-;26835:61;::::0;;-1:-1:-1;;;26835:61:0;;26868:10:::1;26835:61;::::0;::::1;::::0;-1:-1:-1;;;;;26835:32:0;::::1;:61:::0;;;;;;;;;;;;;;26761:63;;-1:-1:-1;26835:32:0;;::::1;::::0;:61;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;26835:32:0;:61;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;26835:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;26835:61:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;;26970:28:0::1;::::0;;-1:-1:-1;;;26970:28:0;;-1:-1:-1;;;;;26970:28:0;;::::1;;::::0;::::1;::::0;;;26934:15:::1;::::0;;;26970:24;;::::1;::::0;::::1;::::0;:28;;;;;;;;;;;26934:15;26970:24;:28;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;26970:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;26970:28:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;26970:28:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;26970:28:0;-1:-1:-1;27010:14:0::1;27030:42;27057:6:::0;27065;27030:26:::1;:42::i;:::-;27009:63;;;27114:6;-1:-1:-1::0;;;;;27104:16:0::1;:6;-1:-1:-1::0;;;;;27104:16:0::1;;:84;;27171:7;27180;27104:84;;;27137:7;27146;27104:84;27083:105:::0;;-1:-1:-1;27083:105:0;-1:-1:-1;27207:21:0;;::::1;;27199:71;;;;-1:-1:-1::0;;;27199:71:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27300:10;27289:7;:21;;27281:71;;;;-1:-1:-1::0;;;27281:71:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22410:1;;;;26400:960:::0;;;;;;;;;;;:::o;22197:41::-;;;:::o;43301:258::-;43448:24;43497:54;43527:7;43536:8;43546:4;43497:29;:54::i;34347:849::-;34611:24;34583:8;22356:15;22344:8;:27;;22336:63;;;;;-1:-1:-1;;;22336:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22336:63:0;;;;;;;;;;;;;;;34672:3:::1;-1:-1:-1::0;;;;;34661:14:0::1;:4;;34666:1;34661:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;34661:7:0::1;-1:-1:-1::0;;;;;34661:14:0::1;;34653:55;;;::::0;;-1:-1:-1;;;34653:55:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;34653:55:0;;;;;;;;;;;;;::::1;;34729;34759:7;34768:9;34779:4;;34729:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;34729:29:0::1;::::0;-1:-1:-1;;;34729:55:0:i:1;:::-;34719:65;;34848:12;34817:7;34842:1;34825:7;:14;:18;34817:27;;;;;;;;;;;;;;:43;;34795:135;;;;-1:-1:-1::0;;;34795:135:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34946:3;-1:-1:-1::0;;;;;34941:17:0::1;;34966:7;34974:1;34966:10;;;;;;;;;;;;;;34941:38;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;34941:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;34941:38:0;;;;;35016:3;-1:-1:-1::0;;;;;35011:18:0::1;;35048:50;35072:7;35081:4;;35086:1;35081:7;;;;;;35048:50;35117:7;35125:1;35117:10;;;;;;;;;;;;;;35011:131;;;;;;;;;;;;;-1:-1:-1::0;;;;;35011:131:0::1;-1:-1:-1::0;;;;;35011:131:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;35011:131:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;35011:131:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;35011:131:0;34990:163:::1;;;;35164:24;35170:7;35179:4;;35164:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;35185:2:0;;-1:-1:-1;35164:5:0::1;::::0;-1:-1:-1;;35164:24:0:i:1;24302:949::-:0;24664:15;24694;24724:17;24622:8;22356:15;22344:8;:27;;22336:63;;;;;-1:-1:-1;;;22336:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22336:63:0;;;;;;;;;;;;;;;24790:174:::1;24818:6;24839;24860:14;24889;24918:10;24943;24790:13;:174::i;:::-;24769:195:::0;;-1:-1:-1;24769:195:0;-1:-1:-1;24975:12:0::1;24990:48;25014:7;25023:6:::0;25031;24990:23:::1;:48::i;:::-;24975:63;;25049:66;25081:6;25089:10;25101:4;25107:7;25049:31;:66::i;:::-;25126;25158:6;25166:10;25178:4;25184:7;25126:31;:66::i;:::-;25229:4;-1:-1:-1::0;;;;;25215:24:0::1;;25240:2;25215:28;;;;;;;;;;;;;-1:-1:-1::0;;;;;25215:28:0::1;-1:-1:-1::0;;;;;25215:28:0::1;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;25215:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;25215:28:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;25215:28:0;24302:949;;;;-1:-1:-1;25215:28:0;;-1:-1:-1;24302:949:0;;-1:-1:-1;;;;;;;;;24302:949:0:o;13492:515::-;13585:14;13631:1;13620:8;:12;13612:67;;;;-1:-1:-1;;;13612:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13710:1;13698:9;:13;:31;;;;;13728:1;13715:10;:14;13698:31;13690:83;;;;-1:-1:-1;;;13690:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13784:20;13807:17;:8;13820:3;13807:17;:12;:17;:::i;:::-;13784:40;-1:-1:-1;13835:14:0;13852:31;13784:40;13872:10;13852:31;:19;:31;:::i;:::-;13835:48;-1:-1:-1;13894:16:0;13913:40;13937:15;13913:19;:9;13927:4;13913:19;:13;:19;:::i;:::-;:23;:40;:23;:40;:::i;:::-;13894:59;;13988:11;13976:9;:23;;;;;;;13492:515;-1:-1:-1;;;;;;;13492:515:0:o;15271:545::-;15372:21;15443:1;15428:4;:11;:16;;15406:72;;;;;-1:-1:-1;;;15406:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15510:4;:11;15499:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;15499:23:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;15499:23:0;;15489:33;;15563:9;15533:7;15558:1;15541:7;:14;:18;15533:27;;;;;;;;;;;;;;;;;:39;15597:11;;-1:-1:-1;;15597:15:0;15583:226;15614:5;;15583:226;;15642:14;15658:15;15677:42;15689:7;15698:4;15707:1;15703;:5;15698:11;;;;;;;;;;;;;;15711:4;15716:1;15711:7;;;;;;;;;;;;;;15677:11;:42::i;:::-;15641:78;;;;15751:46;15763:7;15771:1;15763:10;;;;;;;;;;;;;;15775:9;15786:10;15751:11;:46::i;:::-;15734:7;15746:1;15742;:5;15734:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;;;15621:3:0;15583:226;;;;15271:545;;;;;:::o;11969:478::-;12058:12;12084:14;12100;12118:26;12129:6;12137;12118:10;:26::i;:::-;12282:32;;;-1:-1:-1;;12282:32:0;;;;;;;;;;;;;;;;;;;;;;;;;22::-1;26:21;;;22:32;6:49;;12282:32:0;;;;;12272:43;;;;;;-1:-1:-1;;;;;;12185:251:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;12185:251:0;;;;;;;12175:262;;;;;;;;;11969:478;-1:-1:-1;;;;;11969:478:0:o;2035:448::-;2306:51;;;-1:-1:-1;;;;;2306:51:0;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;2306:51:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;2295:63:0;;;;2260:12;;2274:17;;2295:10;;;;2306:51;2295:63;;;25:18:-1;2295:63:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;2295:63:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;2259:99:0;;;;2377:7;:57;;;;-1:-1:-1;2389:11:0;;:16;;:44;;;2420:4;2409:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;2409:24:0;2389:44;2369:106;;;;-1:-1:-1;;;2369:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2035:448;;;;;;:::o;38280:1629::-;38418:9;38413:1489;38447:1;38433:4;:11;:15;38429:1;:19;38413:1489;;;38471:13;38486:14;38505:4;38510:1;38505:7;;;;;;;;;;;;;;38514:4;38519:1;38523;38519:5;38514:11;;;;;;;;;;;;;;38470:56;;;;38542:14;38562:41;38589:5;38596:6;38562:26;:41::i;:::-;38541:62;;;38618:18;38670:47;38694:7;38703:5;38710:6;38670:23;:47::i;:::-;38618:100;;38733:19;38767:20;38879:16;38897;38919:4;-1:-1:-1;;;;;38919:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;38919:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38919:18:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;38919:18:0;;;;;;;-1:-1:-1;;;;;38878:59:0;;;;-1:-1:-1;38878:59:0;;-1:-1:-1;38957:20:0;;-1:-1:-1;;;;;39025:15:0;;;;;;;:111;;39117:8;39127;39025:111;;;39069:8;39079;39025:111;38956:180;;;;39169:96;39234:12;39176:5;-1:-1:-1;;;;;39169:23:0;;39201:4;39169:38;;;;;;;;;;;;;-1:-1:-1;;;;;39169:38:0;-1:-1:-1;;;;;39169:38:0;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;39169:96:0;39155:110;;39299:152;39350:11;39384:12;39419:13;39299:28;:152::i;:::-;39284:167;;38413:1489;;;;39482:18;39502;39550:6;-1:-1:-1;;;;;39541:15:0;:5;-1:-1:-1;;;;;39541:15:0;;:115;;39631:12;39653:1;39541:115;;;39589:1;39593:12;39541:115;39481:175;;;;39671:10;39719:1;39705:4;:11;:15;39701:1;:19;:123;;39821:3;39701:123;;;39744:53;39768:7;39777:6;39785:4;39790:1;39794;39790:5;39785:11;;;;;;;;;;;;;;39744:23;:53::i;:::-;39877:12;;;39887:1;39877:12;;;;;;;;;;-1:-1:-1;;;39839:51:0;;;;;;;;;;;;;;-1:-1:-1;;;;;39839:51:0;;;;;;;;;;;;;;;;;;;;;;39671:153;;-1:-1:-1;39839:9:0;;;;;;39849:10;;39861;;39671:153;;39877:12;;39839:51;;;;;;;;39877:12;;39839:51;;;;39877:12;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;39839:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39839:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;38450:3:0;;;;;-1:-1:-1;38413:1489:0;;-1:-1:-1;;;;;;;;;;38413:1489:0;;;38280:1629;;:::o;2491:198::-;2603:12;;;2563;2603;;;;;;;;;-1:-1:-1;;;;;2581:7:0;;;2596:5;;2581:35;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;2581:35:0;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;2562:54:0;;;2635:7;2627:54;;;;-1:-1:-1;;;2627:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14680:510;14781:21;14838:1;14823:4;:11;:16;;14815:58;;;;;-1:-1:-1;;;14815:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14905:4;:11;14894:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;14894:23:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;14894:23:0;;14884:33;;14941:8;14928:7;14936:1;14928:10;;;;;;;;;;;;;:21;;;;;14965:6;14960:223;14991:1;14977:4;:11;:15;14973:1;:19;14960:223;;;15015:14;15031:15;15050:42;15062:7;15071:4;15076:1;15071:7;;;;;;;;;;;;;;15080:4;15085:1;15089;15085:5;15080:11;;;;;;;15050:42;15014:78;;;;15124:47;15137:7;15145:1;15137:10;;;;;;;;;;;;;;15149:9;15160:10;15124:12;:47::i;:::-;15107:7;15115:1;15119;15115:5;15107:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;14994:3:0;;14960:223;;31863:956;32007:9;32002:810;32036:1;32022:4;:11;:15;32018:1;:19;32002:810;;;32060:13;32075:14;32094:4;32099:1;32094:7;;;;;;;;;;;;;;32103:4;32108:1;32112;32108:5;32103:11;;;;;;;;;;;;;;32059:56;;;;32131:14;32151:41;32178:5;32185:6;32151:26;:41::i;:::-;32130:62;;;32207:17;32227:7;32235:1;32239;32235:5;32227:14;;;;;;;;;;;;;;32207:34;;32257:18;32277;32325:6;-1:-1:-1;;;;;32316:15:0;:5;-1:-1:-1;;;;;32316:15:0;;:109;;32403:9;32422:1;32316:109;;;32364:1;32368:9;32316:109;32256:169;;;;32440:10;32488:1;32474:4;:11;:15;32470:1;:19;:123;;32590:3;32470:123;;;32513:53;32537:7;32546:6;32554:4;32559:1;32563;32559:5;32554:11;;;;;;;32513:53;32440:153;;32622:47;32646:7;32655:5;32662:6;32622:23;:47::i;:::-;-1:-1:-1;;;;;32608:67:0;;32694:10;32723;32752:2;32783:1;32773:12;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;108:14;32773:12:0;87:42:-1;143:17;;-1:-1;32773:12:0;;32608:192;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32608:192:0;-1:-1:-1;;;;;32608:192:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;32608:192:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32608:192:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;32039:3:0;;;;;-1:-1:-1;32002:810:0;;-1:-1:-1;;;;;;;;32002:810:0;;;31863:956;;;:::o;1629:398::-;1861:45;;;-1:-1:-1;;;;;1861:45:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1861:45:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;1850:57:0;;;;1815:12;;1829:17;;1850:10;;;;1861:45;1850:57;;;25:18:-1;1850:57:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;1850:57:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;1814:93:0;;;;1926:7;:57;;;;-1:-1:-1;1938:11:0;;:16;;:44;;;1969:4;1958:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1958:24:0;1938:44;1918:101;;;;;-1:-1:-1;;;1918:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1629:398;;;;;:::o;6636:136::-;6694:7;6721:43;6725:1;6728;6721:43;;;;;;;;;;;;;;;;;:3;:43::i;22708:1586::-;23039:49;;;-1:-1:-1;;;23039:49:0;;-1:-1:-1;;;;;23039:49:0;;;;;;;;;;;;;;;;22938:15;;;;;;23056:7;23039:33;;;;;;:49;;;;;;;;;;;;;;;:33;:49;;;2:2:-1;;;;27:1;24;17:12;2:2;23039:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23039:49:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;23039:49:0;-1:-1:-1;;;;;23039:63:0;;23035:148;;;23119:52;;;-1:-1:-1;;;23119:52:0;;-1:-1:-1;;;;;23119:52:0;;;;;;;;;;;;;;;;23136:7;23119:36;;;;;;:52;;;;;;;;;;;;;;;-1:-1:-1;23119:36:0;:52;;;2:2:-1;;;;27:1;24;17:12;2:2;23119:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23119:52:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;23035:148:0;23194:16;23212;23245:52;23273:7;23282:6;23290;23245:27;:52::i;:::-;23193:104;;;;23312:8;23324:1;23312:13;:30;;;;-1:-1:-1;23329:13:0;;23312:30;23308:979;;;23381:14;;-1:-1:-1;23397:14:0;;-1:-1:-1;23308:979:0;;;23445:22;23487:57;23509:14;23525:8;23535;23487:21;:57::i;:::-;23445:99;;23581:14;23563;:32;23559:717;;23664:10;23646:14;:28;;23616:139;;;;-1:-1:-1;;;23616:139:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23796:14;;-1:-1:-1;23812:14:0;-1:-1:-1;23812:14:0;23559:717;;;23868:22;23914:57;23936:14;23952:8;23962;23914:21;:57::i;:::-;23868:103;;24015:14;23997;:32;;23990:40;;;;24097:10;24079:14;:28;;24049:139;;;;-1:-1:-1;;;24049:139:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24229:14;-1:-1:-1;24245:14:0;;-1:-1:-1;23559:717:0;23308:979;;22708:1586;;;;;;;;;;;:::o;14128:470::-;14221:13;14267:1;14255:9;:13;14247:69;;;;-1:-1:-1;;;14247:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14347:1;14335:9;:13;:31;;;;;14365:1;14352:10;:14;14335:31;14327:83;;;;-1:-1:-1;;;14327:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14421:14;14438:34;14467:4;14438:24;:9;14452;14438:24;:13;:24;:::i;:::-;:28;:34;:28;:34;:::i;:::-;14421:51;-1:-1:-1;14483:16:0;14502:34;14532:3;14502:25;:10;14517:9;14502:25;:14;:25;:::i;:34::-;14483:53;;14558:32;14588:1;14571:11;14559:9;:23;;;;;;;14558:32;:29;:32;:::i;:::-;14547:43;14128:470;-1:-1:-1;;;;;;14128:470:0:o;13051:319::-;13133:12;13176:1;13166:7;:11;13158:60;;;;-1:-1:-1;;;13158:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13248:1;13237:8;:12;:28;;;;;13264:1;13253:8;:12;13237:28;13229:80;;;;-1:-1:-1;;;13229:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13354:8;13330:21;:7;13342:8;13330:21;:11;:21;:::i;:::-;:32;;;;;;;13051:319;-1:-1:-1;;;;13051:319:0:o;11530:347::-;11605:14;11621;11666:6;-1:-1:-1;;;;;11656:16:0;:6;-1:-1:-1;;;;;11656:16:0;;;11648:65;;;;-1:-1:-1;;;11648:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11752:6;-1:-1:-1;;;;;11743:15:0;:6;-1:-1:-1;;;;;11743:15:0;;:53;;11781:6;11789;11743:53;;;11762:6;11770;11743:53;11724:72;;-1:-1:-1;11724:72:0;-1:-1:-1;;;;;;11815:20:0;;11807:62;;;;;-1:-1:-1;;;11807:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11530:347;;;;;:::o;7560:471::-;7618:7;7863:6;7859:47;;-1:-1:-1;7893:1:0;7886:8;;7859:47;7930:5;;;7934:1;7930;:5;:1;7954:5;;;;;:10;7946:56;;;;-1:-1:-1;;;7946:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6172:181;6230:7;6262:5;;;6286:6;;;;6278:46;;;;;-1:-1:-1;;;6278:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;12505:433;12598:13;12613;12640:14;12659:26;12670:6;12678;12659:10;:26::i;:::-;12639:46;;;12696:32;12704:7;12713:6;12721;12696:7;:32::i;:::-;;12740:13;12755;12787:32;12795:7;12804:6;12812;12787:7;:32::i;:::-;-1:-1:-1;;;;;12773:59:0;;:61;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;12773:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12773:61:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;12773:61:0;;;;;;;-1:-1:-1;;;;;12739:95:0;;;;-1:-1:-1;12739:95:0;;-1:-1:-1;;;;;;12868:16:0;;;;;;;:62;;12911:8;12921;12868:62;;;12888:8;12898;12868:62;12845:85;;;;-1:-1:-1;12505:433:0;-1:-1:-1;;;;;;;12505:433:0:o;7075:226::-;7195:7;7231:12;7223:6;;;;7215:29;;;;-1:-1:-1;;;7215:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;7215:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7267:5:0;;;7075:226::o

Swarm Source

ipfs://8b6e14beaf19f2c08abd78ecad6e41153993654575bd6e9ce90fbe384dfa1cad
Block Transaction Gas Used Reward
Age Block Fee Address Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading