Contract 0x299a9B7E24139180a9B90682150379B511972b1b

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x3c868937087823823a1502f480a26e5e0bdfb9b6b97e51ae94ddb32327ce2b1eZap In ETH2230282062024-06-18 4:14:161 hr 55 mins ago0xa32020afc4a8077c15f6d344a14054cbf3fc8e2a IN  0x299a9b7e24139180a9b90682150379b511972b1b0.037247457374064 ETH0.00000462 0.01
0x53a8b24bbec98e3ed19aa5671b26e77bd3a98df580ad8314a183e68e5547314cZap In ETH2229037252024-06-17 19:31:0110 hrs 38 mins ago0x02500b1916df80f3ff8a05bd7e76f30c8ead9d49 IN  0x299a9b7e24139180a9b90682150379b511972b1b1.686022123645739 ETH0.00000439 0.01
0x59324696b1866b36781308617b2cd7ab30fd2fe2451e3ddf5b12fdbe3c146d3fZap In ETH2229035132024-06-17 19:30:0810 hrs 39 mins ago0x02500b1916df80f3ff8a05bd7e76f30c8ead9d49 IN  0x299a9b7e24139180a9b90682150379b511972b1b2.813748210167446 ETH0.00000456 0.01
0xe963178ed8bbd5b22d8c58665449b2d1daaa6378e0d1dec4719e4c3a6266b97fZap In ETH2228364062024-06-17 14:48:4515 hrs 20 mins ago0x53e3e9488863783f5b41cd1fcff67f9ce37568c7 IN  0x299a9b7e24139180a9b90682150379b511972b1b2.866488415984157 ETH0.000005 0.01
0xb45d8b0f7353b40e9675346c3b36713989e4060c953f541ccca0fd0e304f525bZap In ETH2228360452024-06-17 14:47:1515 hrs 22 mins ago0x53e3e9488863783f5b41cd1fcff67f9ce37568c7 IN  0x299a9b7e24139180a9b90682150379b511972b1b1.41666290580357 ETH0.000005 0.01
0xa5f95bd0b8a69e16b5bc07dad890a201927a99f2c68cc04d14bc4d662a562e0cZap In ETH2228359392024-06-17 14:46:4715 hrs 22 mins ago0x53e3e9488863783f5b41cd1fcff67f9ce37568c7 IN  0x299a9b7e24139180a9b90682150379b511972b1b1.41666290580357 ETH0.00000518 0.01
0x40c9c0abe6d6a1e36f6fdea396a1373a6f19d1ec1c758024ddf41d7ac6adb2d0Zap In ETH2228355442024-06-17 14:45:0815 hrs 24 mins ago0x53e3e9488863783f5b41cd1fcff67f9ce37568c7 IN  0x299a9b7e24139180a9b90682150379b511972b1b1.41666290580357 ETH0.00000558 0.01
0x6fae408dbd5976f43213f878ce6fde7e802894e876826a663e70dbe591cdafb4Zap In ETH2218083552024-06-14 15:23:373 days 14 hrs ago0x39271090d2ccc74e4a4aba89e1c52539552bebd8 IN  0x299a9b7e24139180a9b90682150379b511972b1b4.690221551692779 ETH0.00000484 0.01
0xecb7b70db93d597bef385e7be4528af939024a823830da707f341167547f7b17Zap In ETH2218080762024-06-14 15:22:303 days 14 hrs ago0x39271090d2ccc74e4a4aba89e1c52539552bebd8 IN  0x299a9b7e24139180a9b90682150379b511972b1b4.309543280478927 ETH0.00000532 0.01
0x5093e99deda1cc261caf4f7c795d561f5b52a473e638a6a7eedc64fc855df9ccZap Out And Swap2215246182024-06-13 19:41:554 days 10 hrs ago0x5c70387dbc7c481dbc54d6d6080a5c936a883ba8 IN  0x299a9b7e24139180a9b90682150379b511972b1b0 ETH0.00000893 0.01
0xa95c9c08c3659bafea6d5bdc4749995c214ee487d427fa7c64d8700a64a6cfc5Zap In ETH2214992152024-06-13 17:56:194 days 12 hrs ago0x1e801f5e63713661a875d387df14bbb2ca4e389b IN  0x299a9b7e24139180a9b90682150379b511972b1b5.872152146702822 ETH0.00000437 0.01
0xc1c8e47134ab6bb16e1dc76e34b723514d8b6ddc4242d65417ec40695f8ea4ceZap In ETH2214959042024-06-13 17:42:324 days 12 hrs ago0x1e801f5e63713661a875d387df14bbb2ca4e389b IN  0x299a9b7e24139180a9b90682150379b511972b1b1.15580086433756 ETH0.00000491 0.01
0x99be7e25377bc866b30f9a5af540e7145159f31a51c81cba1831ed0e43929f30Zap In ETH2211947482024-06-12 20:47:385 days 9 hrs ago0x5c70387dbc7c481dbc54d6d6080a5c936a883ba8 IN  0x299a9b7e24139180a9b90682150379b511972b1b0.001409917521465 ETH0.00000483 0.01
0xf448f123f2f72d8451d5ccfdf4f0ca78a2500c57485bd25a81fc0b30a2d08a9dZap In ETH2211934872024-06-12 20:42:255 days 9 hrs ago0x792d0700ee11f53a1a74705ec622186fc9569a2f IN  0x299a9b7e24139180a9b90682150379b511972b1b2.458730064115386 ETH0.00000422 0.01
0x5ce905facd561770b7f04810da11bf5befb7a0543dec23e7650eb2722b5fe1bbZap Out And Swap...2211927552024-06-12 20:39:215 days 9 hrs ago0x1fa4e8b67ec771b5f3e35b71d4a9b75c51565af2 IN  0x299a9b7e24139180a9b90682150379b511972b1b0 ETH0.00000439 0.01
0x36adaf4476f6e226dc93a4c69105e9dfc26cb995e699a3ccd1a87ae18cf4d478Zap In ETH2211512922024-06-12 17:45:565 days 12 hrs ago0x792d0700ee11f53a1a74705ec622186fc9569a2f IN  0x299a9b7e24139180a9b90682150379b511972b1b3.048295647823041 ETH0.00000428 0.01
0x86eb91c3d76933e6316e4043353c1ef6ad441032c206620b6366fe500249783dZap In ETH2211457202024-06-12 17:22:465 days 12 hrs ago0x792d0700ee11f53a1a74705ec622186fc9569a2f IN  0x299a9b7e24139180a9b90682150379b511972b1b1.385576081317033 ETH0.00000492 0.01
0x43bfa2abe0d75878ecbe973f1cef8863820af808a7bbe36c51bf931fa99cafb2Zap In2207385082024-06-11 13:12:586 days 16 hrs ago0x74541e279fe87135e43d390aa5eab8486fb185b9 IN  0x299a9b7e24139180a9b90682150379b511972b1b0 ETH0.00000614 0.01
0xc103745e8d43eba45c3ebaf90f0591bd809937f437e550ae50aef70abaa74c51Zap In2190719552024-06-06 17:08:1911 days 13 hrs ago0x1fa4e8b67ec771b5f3e35b71d4a9b75c51565af2 IN  0x299a9b7e24139180a9b90682150379b511972b1b0 ETH0.00000685 0.01
0x61a8392fe8465636034e90e8076dd442d1c35bbd028a6a6e25936126851e48c1Zap Out And Swap...2186672262024-06-05 12:54:0912 days 17 hrs ago0x5c70387dbc7c481dbc54d6d6080a5c936a883ba8 IN  0x299a9b7e24139180a9b90682150379b511972b1b0 ETH0.00000555 0.01
0xf73602668f190d1766b75a557712adedee0e2f4a52ab76e65d3f2b98cf5db22cZap In2182443542024-06-04 7:26:4113 days 22 hrs ago0x5c70387dbc7c481dbc54d6d6080a5c936a883ba8 IN  0x299a9b7e24139180a9b90682150379b511972b1b0 ETH0.0000065 0.01
0x9b18dd594a33914f0d5c6cf048c9c67efe2abede0a16b157704953305337fc53Zap Out And Swap2180191812024-06-03 15:45:3814 days 14 hrs ago0x1fa4e8b67ec771b5f3e35b71d4a9b75c51565af2 IN  0x299a9b7e24139180a9b90682150379b511972b1b0 ETH0.00000602 0.01
0xfdddb5960d415c8a1c3a7c6d7116907e963de18fd0e1fcd41f987b98b39b5dddZap In ETH2180190752024-06-03 15:45:1214 days 14 hrs ago0x1fa4e8b67ec771b5f3e35b71d4a9b75c51565af2 IN  0x299a9b7e24139180a9b90682150379b511972b1b0.001320511670941 ETH0.00000543 0.01
0xe2ee4698da15500d0dd06bffef4236a807b8b472e65b77db148297baa54cda0aZap In2166733752024-05-30 18:03:4218 days 12 hrs ago0xd937cca8592678eab5e2634992aff55c81f252e5 IN  0x299a9b7e24139180a9b90682150379b511972b1b0 ETH0.00000654 0.01
0x6257204e074e21d7daeb14386dd3ffc8a87ee2ad8465a271805140527b5e310cZap In2164454702024-05-30 2:13:1219 days 3 hrs ago0xd937cca8592678eab5e2634992aff55c81f252e5 IN  0x299a9b7e24139180a9b90682150379b511972b1b0 ETH0.0000053 0.01
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x3c868937087823823a1502f480a26e5e0bdfb9b6b97e51ae94ddb32327ce2b1e2230282062024-06-18 4:14:161 hr 55 mins ago 0x299a9b7e24139180a9b90682150379b511972b1b Wrapped Ether0.037247457374064096 ETH
0x53a8b24bbec98e3ed19aa5671b26e77bd3a98df580ad8314a183e68e5547314c2229037252024-06-17 19:31:0110 hrs 38 mins ago 0x299a9b7e24139180a9b90682150379b511972b1b Wrapped Ether1.686022123645739778 ETH
0x59324696b1866b36781308617b2cd7ab30fd2fe2451e3ddf5b12fdbe3c146d3f2229035132024-06-17 19:30:0810 hrs 39 mins ago 0x299a9b7e24139180a9b90682150379b511972b1b Wrapped Ether2.813748210167446917 ETH
0xe963178ed8bbd5b22d8c58665449b2d1daaa6378e0d1dec4719e4c3a6266b97f2228364062024-06-17 14:48:4515 hrs 20 mins ago 0x299a9b7e24139180a9b90682150379b511972b1b Wrapped Ether2.866488415984157267 ETH
0xb45d8b0f7353b40e9675346c3b36713989e4060c953f541ccca0fd0e304f525b2228360452024-06-17 14:47:1515 hrs 22 mins ago 0x299a9b7e24139180a9b90682150379b511972b1b Wrapped Ether1.416662905803570016 ETH
0xa5f95bd0b8a69e16b5bc07dad890a201927a99f2c68cc04d14bc4d662a562e0c2228359392024-06-17 14:46:4715 hrs 22 mins ago 0x299a9b7e24139180a9b90682150379b511972b1b Wrapped Ether1.416662905803570016 ETH
0x40c9c0abe6d6a1e36f6fdea396a1373a6f19d1ec1c758024ddf41d7ac6adb2d02228355442024-06-17 14:45:0815 hrs 24 mins ago 0x299a9b7e24139180a9b90682150379b511972b1b Wrapped Ether1.416662905803570016 ETH
0x6fae408dbd5976f43213f878ce6fde7e802894e876826a663e70dbe591cdafb42218083552024-06-14 15:23:373 days 14 hrs ago 0x299a9b7e24139180a9b90682150379b511972b1b Wrapped Ether4.690221551692779655 ETH
0xecb7b70db93d597bef385e7be4528af939024a823830da707f341167547f7b172218080762024-06-14 15:22:303 days 14 hrs ago 0x299a9b7e24139180a9b90682150379b511972b1b Wrapped Ether4.309543280478927762 ETH
0xa95c9c08c3659bafea6d5bdc4749995c214ee487d427fa7c64d8700a64a6cfc52214992152024-06-13 17:56:194 days 12 hrs ago 0x299a9b7e24139180a9b90682150379b511972b1b Wrapped Ether5.872152146702822013 ETH
0xc1c8e47134ab6bb16e1dc76e34b723514d8b6ddc4242d65417ec40695f8ea4ce2214959042024-06-13 17:42:324 days 12 hrs ago 0x299a9b7e24139180a9b90682150379b511972b1b Wrapped Ether1.155800864337560574 ETH
0x99be7e25377bc866b30f9a5af540e7145159f31a51c81cba1831ed0e43929f302211947482024-06-12 20:47:385 days 9 hrs ago 0x299a9b7e24139180a9b90682150379b511972b1b Wrapped Ether0.00140991752146572 ETH
0xf448f123f2f72d8451d5ccfdf4f0ca78a2500c57485bd25a81fc0b30a2d08a9d2211934872024-06-12 20:42:255 days 9 hrs ago 0x299a9b7e24139180a9b90682150379b511972b1b Wrapped Ether2.458730064115386415 ETH
0x5ce905facd561770b7f04810da11bf5befb7a0543dec23e7650eb2722b5fe1bb2211927552024-06-12 20:39:215 days 9 hrs ago 0x299a9b7e24139180a9b90682150379b511972b1b0x1fa4e8b67ec771b5f3e35b71d4a9b75c51565af20.000520617048329666 ETH
0x5ce905facd561770b7f04810da11bf5befb7a0543dec23e7650eb2722b5fe1bb2211927552024-06-12 20:39:215 days 9 hrs ago Wrapped Ether 0x299a9b7e24139180a9b90682150379b511972b1b0.000520617048329666 ETH
0x36adaf4476f6e226dc93a4c69105e9dfc26cb995e699a3ccd1a87ae18cf4d4782211512922024-06-12 17:45:565 days 12 hrs ago 0x299a9b7e24139180a9b90682150379b511972b1b Wrapped Ether3.048295647823041409 ETH
0x86eb91c3d76933e6316e4043353c1ef6ad441032c206620b6366fe500249783d2211457202024-06-12 17:22:465 days 12 hrs ago 0x299a9b7e24139180a9b90682150379b511972b1b Wrapped Ether1.385576081317033914 ETH
0x61a8392fe8465636034e90e8076dd442d1c35bbd028a6a6e25936126851e48c12186672262024-06-05 12:54:0912 days 17 hrs ago 0x299a9b7e24139180a9b90682150379b511972b1b0x5c70387dbc7c481dbc54d6d6080a5c936a883ba80.000215976937946889 ETH
0x61a8392fe8465636034e90e8076dd442d1c35bbd028a6a6e25936126851e48c12186672262024-06-05 12:54:0912 days 17 hrs ago Wrapped Ether 0x299a9b7e24139180a9b90682150379b511972b1b0.000215976937946889 ETH
0xfdddb5960d415c8a1c3a7c6d7116907e963de18fd0e1fcd41f987b98b39b5ddd2180190752024-06-03 15:45:1214 days 14 hrs ago 0x299a9b7e24139180a9b90682150379b511972b1b Wrapped Ether0.00132051167094115 ETH
0xded8d9f8928f6f4442650169002d08780a39ac76789cbb71f6fc8bb65f04c55b2168788002024-05-31 8:22:1617 days 21 hrs ago 0x299a9b7e24139180a9b90682150379b511972b1b 0x33562a2a720fb95d16de24486620964c09a522780.000267685636738353 ETH
0xded8d9f8928f6f4442650169002d08780a39ac76789cbb71f6fc8bb65f04c55b2168788002024-05-31 8:22:1617 days 21 hrs ago Wrapped Ether 0x299a9b7e24139180a9b90682150379b511972b1b0.000267685636738353 ETH
0xc38d8f0a0de81f2257746c3d6e8be8bef79acceb955bfb0b71cd94b4695f968a2168775652024-05-31 8:17:0617 days 21 hrs ago 0x299a9b7e24139180a9b90682150379b511972b1b Wrapped Ether0.000267899814408365 ETH
0xc38d8f0a0de81f2257746c3d6e8be8bef79acceb955bfb0b71cd94b4695f968a2168775652024-05-31 8:17:0617 days 21 hrs ago 0x33562a2a720fb95d16de24486620964c09a52278 0x299a9b7e24139180a9b90682150379b511972b1b0.000267899814408365 ETH
0xc2ef318addfe60c473e790eeeb6188aab6d7111b7ea160437c9c7bb916f781372168769962024-05-31 8:14:4417 days 21 hrs ago 0x299a9b7e24139180a9b90682150379b511972b1b Wrapped Ether0.000267899814408365 ETH
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
VaultZapperHop

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Arbiscan.io on 2024-02-20
*/

// Sources flattened with hardhat v2.10.1-gzeon-c8fe47dd4 https://hardhat.org

// File contracts/lib/safe-math.sol

// SPDX-License-Identifier: MIT

pragma solidity 0.8.4;

/**
 * @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;
    }
}


// File contracts/lib/context.sol



pragma solidity 0.8.4;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return payable(msg.sender);
    }

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


// File contracts/lib/erc20.sol

// File: contracts/GSN/Context.sol



pragma solidity 0.8.4;


// File: contracts/token/ERC20/IERC20.sol


/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: contracts/utils/Address.sol


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

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

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

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

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

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

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

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

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: contracts/token/ERC20/ERC20.sol

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;
    using Address for address;

    mapping (address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _decimals = 18;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
     * called.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20};
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

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

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    /**
     * @dev Sets {decimals} to a value other than the default one of 18.
     *
     * WARNING: This function should only be called from the constructor. Most
     * applications that interact with token contracts will not expect
     * {decimals} to ever change, and may work incorrectly if it does.
     */
    function _setupDecimals(uint8 decimals_) internal {
        _decimals = decimals_;
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}


// File contracts/interfaces/hop.sol



pragma solidity 0.8.4;

interface IHopStakingRewards {
  function balanceOf(address account) external view returns (uint256);

  function earned(address account) external view returns (uint256);

  function stake(uint256 amount) external; 

  function getReward() external;

  function withdraw(uint256 amount) external;

}

interface IHopSwap {
  function swap(uint8 tokenIndexFrom, uint8 tokenIndexTo, uint256 dx, uint256 minDy, uint256 deadline) external returns (uint256);

  function addLiquidity(uint256[] calldata amounts, uint256 minToMint, uint256 deadline) external returns (uint256);

  function getTokenBalance(uint8 index) external view returns (uint256);

  function getToken(uint8 index) external view returns (address);

  function removeLiquidity(
        uint256 amount,
        uint256[] calldata minAmounts,
        uint256 deadline
  ) external returns (uint256[] memory);

  function calculateSwap(
      uint8 tokenIndexFrom,
      uint8 tokenIndexTo,
      uint256 dx
  ) external view returns (uint256);

  function calculateTokenAmount(
      address account,
      uint256[] calldata amounts,
      bool deposit
  ) external view returns (uint256); 
}

interface ILPToken {
  function swap() external view returns (address);

}


// File contracts/lib/square-root.sol

// File: @uniswap/lib/contracts/libraries/Babylonian.sol

pragma solidity 0.8.4;

// computes square roots using the babylonian method
// https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method
library Babylonian {
    // credit for this implementation goes to
    // https://github.com/abdk-consulting/abdk-libraries-solidity/blob/master/ABDKMath64x64.sol#L687
    function sqrt(uint256 x) internal pure returns (uint256) {
        if (x == 0) return 0;
        // this block is equivalent to r = uint256(1) << (BitMath.mostSignificantBit(x) / 2);
        // however that code costs significantly more gas
        uint256 xx = x;
        uint256 r = 1;
        if (xx >= 0x100000000000000000000000000000000) {
            xx >>= 128;
            r <<= 64;
        }
        if (xx >= 0x10000000000000000) {
            xx >>= 64;
            r <<= 32;
        }
        if (xx >= 0x100000000) {
            xx >>= 32;
            r <<= 16;
        }
        if (xx >= 0x10000) {
            xx >>= 16;
            r <<= 8;
        }
        if (xx >= 0x100) {
            xx >>= 8;
            r <<= 4;
        }
        if (xx >= 0x10) {
            xx >>= 4;
            r <<= 2;
        }
        if (xx >= 0x8) {
            r <<= 1;
        }
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1; // Seven iterations should be enough
        uint256 r1 = x / r;
        return (r < r1 ? r : r1);
    }
}


// File contracts/interfaces/weth.sol



pragma solidity 0.8.4;

interface WETH {
    function name() external view returns (string memory);

    function approve(address guy, uint256 wad) external returns (bool);

    function totalSupply() external view returns (uint256);

    function transferFrom(
        address src,
        address dst,
        uint256 wad
    ) external returns (bool);

    function withdraw(uint256 wad) external;

    function withdrawTo(address account, uint256 amount) external; 

    function decimals() external view returns (uint8);

    function balanceOf(address) external view returns (uint256);

    function symbol() external view returns (string memory);

    function transfer(address dst, uint256 wad) external returns (bool);

    function deposit() external payable;

    function allowance(address, address) external view returns (uint256);
}


// File contracts/interfaces/vault.sol


pragma solidity 0.8.4;

interface IVault is IERC20 {
    function token() external view returns (address);
    
    function reward() external view returns (address);

    function claimInsurance() external; // NOTE: Only yDelegatedVault implements this

    function getRatio() external view returns (uint256);

    function depositAll() external;
    
    function balance() external view returns (uint256);

    function deposit(uint256) external;

    function withdrawAll() external;

    function withdraw(uint256) external;

    function earn() external;

    function decimals() external view returns (uint8);
}


// File contracts/interfaces/uniswapv3.sol

pragma solidity 0.8.4;
pragma abicoder v2;

interface ISwapRouter{
   struct ExactInputSingleParams {
        address tokenIn;
        address tokenOut;
        uint24 fee;
        address recipient;
        uint256 deadline;
        uint256 amountIn;
        uint256 amountOutMinimum;
        uint160 sqrtPriceLimitX96;
    }

    /// @notice Swaps `amountIn` of one token for as much as possible of another token
    /// @param params The parameters necessary for the swap, encoded as `ExactInputSingleParams` in calldata
    /// @return amountOut The amount of the received token
    function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut);

    struct ExactInputParams {
        bytes path;
        address recipient;
        uint256 deadline;
        uint256 amountIn;
        uint256 amountOutMinimum;
    }

    /// @notice Swaps `amountIn` of one token for as much as possible of another along the specified path
    /// @param params The parameters necessary for the multi-hop swap, encoded as `ExactInputParams` in calldata
    /// @return amountOut The amount of the received token
    function exactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut);

    struct ExactOutputSingleParams {
        address tokenIn;
        address tokenOut;
        uint24 fee;
        address recipient;
        uint256 deadline;
        uint256 amountOut;
        uint256 amountInMaximum;
        uint160 sqrtPriceLimitX96;
    }

    /// @notice Swaps as little as possible of one token for `amountOut` of another token
    /// @param params The parameters necessary for the swap, encoded as `ExactOutputSingleParams` in calldata
    /// @return amountIn The amount of the input token
    function exactOutputSingle(ExactOutputSingleParams calldata params) external payable returns (uint256 amountIn);

    struct ExactOutputParams {
        bytes path;
        address recipient;
        uint256 deadline;
        uint256 amountOut;
        uint256 amountInMaximum;
    }

    /// @notice Swaps as little as possible of one token for `amountOut` of another along the specified path (reversed)
    /// @param params The parameters necessary for the multi-hop swap, encoded as `ExactOutputParams` in calldata
    /// @return amountIn The amount of the input token
    function exactOutput(ExactOutputParams calldata params) external payable returns (uint256 amountIn);

}


// File contracts/strategies/hop/hop-zapper/hop-zapper-base.sol


pragma solidity 0.8.4;







abstract contract HopZapperBase {
    using SafeERC20 for IERC20;
    using Address for address;
    using SafeMath for uint256;
    using SafeERC20 for IVault;

    address public router;

    address public constant weth = 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1;
    address public governance;

    // Define a mapping to store whether an address is whitelisted or not
    mapping(address => bool) public whitelistedVaults;

    uint256 public constant minimumAmount = 1000;

    // For this example, we will set the pool fee to 0.3%.
    uint24 public constant poolFee = 3000;

    constructor(
        address _router,  
        address _governance
    ) {
        // Safety checks to ensure WETH token address
        WETH(weth).deposit{value: 0}();
        WETH(weth).withdraw(0);
        router = _router;
        governance = _governance;
    }

    receive() external payable {
        assert(msg.sender == weth);
    }

     // **** Modifiers **** //

    // Modifier to restrict access to whitelisted vaults only
    modifier onlyWhitelistedVaults(address vault) {
        require(whitelistedVaults[vault], "Vault is not whitelisted");
        _;
    }

    // Modifier to restrict access to governance only
    modifier onlyGovernance() {
        require(msg.sender == governance, "Caller is not the governance");
        _;
    }
    
    // Function to add a vault to the whitelist
    function addToWhitelist(address _vault) external onlyGovernance {
        whitelistedVaults[_vault] = true;
    }

    // Function to remove a vault from the whitelist
    function removeFromWhitelist(address _vault) external onlyGovernance {
        whitelistedVaults[_vault] = false;
    }

    //returns DUST
    function _returnAssets(address[] memory tokens) internal {
        uint256 balance;
        for (uint256 i; i < tokens.length; i++) {
            balance = IERC20(tokens[i]).balanceOf(address(this));
            if (balance > 0) {
                if (tokens[i] == weth) {
                    WETH(weth).withdraw(balance);
                    (bool success, ) = msg.sender.call{value: balance}(
                        new bytes(0)
                    );
                    require(success, "ETH transfer failed");
                } else {
                    IERC20(tokens[i]).safeTransfer(msg.sender, balance);
                }
            }
        }
    }

    function _swapAndStake(address vault, uint256 tokenAmountOutMin, address tokenIn) public virtual;

    function zapInETH(address vault, uint256 tokenAmountOutMin, address tokenIn) external payable onlyWhitelistedVaults(vault){
        require(msg.value >= minimumAmount, "Insignificant input amount");

        WETH(weth).deposit{value: msg.value}();

        // allows us to zapIn if eth isn't part of the original pair
        if (tokenIn != weth){
            uint256 _amount = IERC20(weth).balanceOf(address(this));

            (, IHopSwap pair) = _getVaultPair(vault);

            (address token0) = pair.getToken(0);
            (address token1) = pair.getToken(1); 

            bool isInputA = token0 == tokenIn;
            require(isInputA || token1 == tokenIn, "Input token not present in liquidity pair");

            address[] memory path = new address[](2);
            path[0] = weth;
            path[1] = tokenIn;
       
            _approveTokenIfNeeded(path[0], address(router));
            ISwapRouter.ExactInputSingleParams memory params = ISwapRouter.ExactInputSingleParams({
              tokenIn: path[0],
              tokenOut: path[1],
              fee: poolFee,
              recipient: address(this),
              deadline: block.timestamp,
              amountIn: _amount,
              amountOutMinimum: 0,
              sqrtPriceLimitX96: 0
            });

            // The call to `exactInputSingle` executes the swap.
            ISwapRouter(address(router)).exactInputSingle(params);
            
            _swapAndStake(vault, tokenAmountOutMin, tokenIn);
        }else{
            _swapAndStake(vault, tokenAmountOutMin, tokenIn);
        }
    }


    // transfers tokens from msg.sender to this contract 
    function zapIn(address vault, uint256 tokenAmountOutMin, address tokenIn, uint256 tokenInAmount) external onlyWhitelistedVaults(vault){
        require(tokenInAmount >= minimumAmount, "Insignificant input amount");
        require(IERC20(tokenIn).allowance(msg.sender, address(this)) >= tokenInAmount, "Input token is not approved");

        // transfer token 
        IERC20(tokenIn).safeTransferFrom(
            msg.sender,
            address(this),
            tokenInAmount
        );

        (, IHopSwap pair) = _getVaultPair(vault);
        (address desiredToken) = pair.getToken(0);

        if(desiredToken != tokenIn){
            address[] memory path = new address[](2);
            path[0] = tokenIn;
            path[1] = desiredToken;

            _approveTokenIfNeeded(path[0], address(router));
            ISwapRouter.ExactInputSingleParams memory params = ISwapRouter.ExactInputSingleParams({
                tokenIn: path[0],
                tokenOut: path[1],
                fee: poolFee,
                recipient: address(this),
                deadline: block.timestamp,
                amountIn: tokenInAmount,
                amountOutMinimum: 0,
                sqrtPriceLimitX96: 0
            });

            // The call to `exactInputSingle` executes the swap.
            ISwapRouter(address(router)).exactInputSingle(params);
            _swapAndStake(vault, tokenAmountOutMin, desiredToken);

        }else {
            _swapAndStake(vault, tokenAmountOutMin, tokenIn);
        }
        
    }

    function zapOutAndSwap(address vault, uint256 withdrawAmount, address desiredToken, uint256 desiredTokenOutMin) public virtual;

    function zapOutAndSwapEth(address vault, uint256 withdrawAmount, uint256 desiredTokenOutMin) public virtual;

    function _removeLiquidity(address token, IHopSwap pair) internal {
        _approveTokenIfNeeded(token, address(pair));

        uint256[] memory amounts;
        amounts = new uint256[](2);
        amounts[0] = 0;
        amounts[1] = 0;
        IHopSwap(pair).removeLiquidity(IERC20(token).balanceOf(address(this)), amounts, block.timestamp); 

    }

    function _getVaultPair(address vault_addr) internal view returns (IVault vault, IHopSwap pair){
        vault = IVault(vault_addr);
        pair = IHopSwap(ILPToken(vault.token()).swap());

        require(ILPToken(vault.token()).swap() != address(0), "Liquidity pool address cannot be the zero address");
    }

    function _approveTokenIfNeeded(address token, address spender) internal {
        if (IERC20(token).allowance(address(this), spender) == 0) {
            IERC20(token).safeApprove(spender, type(uint256).max);
        }
    }

    function zapOut(address vault_addr, uint256 withdrawAmount) external onlyWhitelistedVaults(vault_addr){
        (IVault vault, IHopSwap pair) = _getVaultPair(vault_addr);

        IERC20(vault_addr).safeTransferFrom(msg.sender, address(this), withdrawAmount);
        vault.withdraw(withdrawAmount);

        _removeLiquidity(address(vault.token()), IHopSwap(pair));

        address[] memory tokens = new address[](2);
        tokens[0] = pair.getToken(0);
        tokens[1] = pair.getToken(1);

        _returnAssets(tokens);
    }
}


// File contracts/strategies/hop/hop-zapper/hop-vault-zapper.sol


pragma solidity 0.8.4;

contract VaultZapperHop is HopZapperBase {
    using SafeERC20 for IERC20;
    using Address for address;
    using SafeMath for uint256;
    using SafeERC20 for IVault;

    constructor()
        HopZapperBase(0xE592427A0AEce92De3Edee1F18E0157C05861564, 0xCb410A689A03E06de0a6247b13C13D14237DecC8){}

    function zapOutAndSwap(address vault_addr, uint256 withdrawAmount, address desiredToken, uint256 desiredTokenOutMin) public override onlyWhitelistedVaults(vault_addr){
        (IVault vault, IHopSwap pair) = _getVaultPair(vault_addr);
        (address token0) = pair.getToken(0);
        (address token1) = pair.getToken(1); 

        vault.safeTransferFrom(msg.sender, address(this), withdrawAmount);
        vault.withdraw(withdrawAmount);
        _removeLiquidity(address(vault.token()), IHopSwap(pair));

        _approveTokenIfNeeded(token1, address(pair));
        IHopSwap(pair).swap(
          1,
          0,
          IERC20(token1).balanceOf(address(this)),
          desiredTokenOutMin,
          block.timestamp
        );

        if(desiredToken == token0){
          address[] memory path = new address[](2);
          path[0] = token0;
          path[1] = token1;

          _returnAssets(path);
        }else {
          address[] memory path = new address[](2);
          path[0] = token0;
          path[1] = desiredToken;
      
          _approveTokenIfNeeded(path[0], address(router));
          ISwapRouter.ExactInputSingleParams memory params = ISwapRouter.ExactInputSingleParams({
            tokenIn: path[0],
            tokenOut: path[1],
            fee: poolFee,
            recipient: address(this),
            deadline: block.timestamp,
            amountIn: IERC20(path[0]).balanceOf(address(this)),
            amountOutMinimum: 0,
            sqrtPriceLimitX96: 0
          });

          // The call to `exactInputSingle` executes the swap.
          ISwapRouter(address(router)).exactInputSingle(params);

          address[] memory path2 = new address[](3);
          path2[0] = token0;
          path2[1] = token1; 
          path2[2] = desiredToken;

          _returnAssets(path2);
        }
        
    }

    function zapOutAndSwapEth(address vault_addr, uint256 withdrawAmount, uint256 desiredTokenOutMin) public override onlyWhitelistedVaults(vault_addr){
        (IVault vault, IHopSwap pair) = _getVaultPair(vault_addr);

        (address token0) = pair.getToken(0);
        (address token1) = pair.getToken(1); 

        vault.safeTransferFrom(msg.sender, address(this), withdrawAmount);
        vault.withdraw(withdrawAmount);
        _removeLiquidity(address(vault.token()), IHopSwap(pair));

        _approveTokenIfNeeded(token1, address(pair));
        IHopSwap(pair).swap(
          1,
          0,
          IERC20(token1).balanceOf(address(this)),
          desiredTokenOutMin,
          block.timestamp
        );

        if(token0 == weth){
          address[] memory path = new address[](2);
          path[0] = token0;
          path[1] = token1;

          _returnAssets(path);
        }else {

          address[] memory path = new address[](2);
          path[0] = token0;
          path[1] = weth;
      
          _approveTokenIfNeeded(path[0], address(router));
          ISwapRouter.ExactInputSingleParams memory params = ISwapRouter.ExactInputSingleParams({
            tokenIn: path[0],
            tokenOut: path[1],
            fee: poolFee,
            recipient: address(this),
            deadline: block.timestamp,
            amountIn: IERC20(path[0]).balanceOf(address(this)),
            amountOutMinimum: 0,
            sqrtPriceLimitX96: 0
          });

          // The call to `exactInputSingle` executes the swap.
          ISwapRouter(address(router)).exactInputSingle(params);

          _returnAssets(path);
        }
      
    }

    function _swapAndStake(address vault_addr, uint256 tokenAmountOutMin, address tokenIn) public override onlyWhitelistedVaults(vault_addr){
        (IVault vault, IHopSwap pair) = _getVaultPair(vault_addr);

        (address token0) = pair.getToken(0);
        (address token1) = pair.getToken(1); 

        bool isInputA = token0 == tokenIn;
        require(isInputA || token1 == tokenIn, "Input token not present in liquidity pair");

        (uint256 _tokenBalance0) = IHopSwap(pair).getTokenBalance(0);
        (uint256 _tokenBalance1) = IHopSwap(pair).getTokenBalance(1);

        if(_tokenBalance0 > _tokenBalance1){
          uint256 fullInvestment = IERC20(tokenIn).balanceOf(address(this));
          _approveTokenIfNeeded(token0, address(pair)); 

          IHopSwap(pair).swap(
              0, 
              1, 
              fullInvestment, 
              tokenAmountOutMin, 
              block.timestamp
          ); 
        }

        // Adds in liquidity for token0/token1
        uint256 _token0 = IERC20(token0).balanceOf(address(this));
        uint256 _token1 = IERC20(token1).balanceOf(address(this));

        uint256[] memory amounts;
        amounts = new uint256[](2);
        amounts[0] = _token0;
        amounts[1] = _token1;
        
        _approveTokenIfNeeded(token0, address(pair));
        _approveTokenIfNeeded(token1, address(pair));

        uint256 amountLiquidity = IHopSwap(pair).addLiquidity(
            amounts, 
            0, 
            block.timestamp
        );

        _approveTokenIfNeeded(address(vault.token()), address(vault));
        vault.deposit(amountLiquidity);

        //add to guage if possible instead of returning to user, and so no receipt token
        vault.safeTransfer(msg.sender, vault.balanceOf(address(this)));

        address[] memory path = new address[](2);
        path[0] = token0;
        path[1] = token1;

        _returnAssets(path);
    }

    function estimateSwap(address vault_addr, address tokenIn, uint256 fullInvestmentIn) public view returns (uint256 swapAmountIn, uint256 swapAmountOut, address swapTokenOut){
        (IVault vault, IHopSwap pair) = _getVaultPair(vault_addr);

        bool isInputA = pair.getToken(0) == tokenIn;
        require(isInputA || pair.getToken(1) == tokenIn, "Input token not present in liquidity pair");

        (uint256 reserveA) = pair.getTokenBalance(0);
        (uint256 reserveB) = pair.getTokenBalance(1);

        if(isInputA){
          if(reserveA >= reserveB){
            uint256 _tokenOut = pair.calculateSwap(0, 1, fullInvestmentIn); 

            uint256[] memory amounts;
            amounts = new uint256[](2);
            amounts[0] = 0;
            amounts[1] = _tokenOut;

            swapAmountOut = pair.calculateTokenAmount(address(this), amounts, true); 
          }
        }else {
          if(reserveB >= reserveA){
            uint256 _tokenOut = pair.calculateSwap(1, 0, fullInvestmentIn); 

            uint256[] memory amounts;
            amounts = new uint256[](2);
            amounts[0] = 0;
            amounts[1] = _tokenOut;

            swapAmountOut = pair.calculateTokenAmount(address(this), amounts, true); 
          }
        }
        
        swapAmountIn = fullInvestmentIn; 
        swapTokenOut = vault.token();
    }
}

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"vault_addr","type":"address"},{"internalType":"uint256","name":"tokenAmountOutMin","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"}],"name":"_swapAndStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"vault_addr","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"fullInvestmentIn","type":"uint256"}],"name":"estimateSwap","outputs":[{"internalType":"uint256","name":"swapAmountIn","type":"uint256"},{"internalType":"uint256","name":"swapAmountOut","type":"uint256"},{"internalType":"address","name":"swapTokenOut","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"removeFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistedVaults","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"uint256","name":"tokenAmountOutMin","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"tokenInAmount","type":"uint256"}],"name":"zapIn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"uint256","name":"tokenAmountOutMin","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"}],"name":"zapInETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"vault_addr","type":"address"},{"internalType":"uint256","name":"withdrawAmount","type":"uint256"}],"name":"zapOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"vault_addr","type":"address"},{"internalType":"uint256","name":"withdrawAmount","type":"uint256"},{"internalType":"address","name":"desiredToken","type":"address"},{"internalType":"uint256","name":"desiredTokenOutMin","type":"uint256"}],"name":"zapOutAndSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"vault_addr","type":"address"},{"internalType":"uint256","name":"withdrawAmount","type":"uint256"},{"internalType":"uint256","name":"desiredTokenOutMin","type":"uint256"}],"name":"zapOutAndSwapEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b5073e592427a0aece92de3edee1f18e0157c0586156473cb410a689a03e06de0a6247b13c13d14237decc87382af49447d8a07e3bd95bd0d56f35241523fbab16001600160a01b031663d0e30db060006040518263ffffffff1660e01b81526004016000604051808303818588803b1580156200008d57600080fd5b505af1158015620000a2573d6000803e3d6000fd5b5050604051632e1a7d4d60e01b8152600060048201527382af49447d8a07e3bd95bd0d56f35241523fbab19350632e1a7d4d92506024019050600060405180830381600087803b158015620000f657600080fd5b505af11580156200010b573d6000803e3d6000fd5b5050600080546001600160a01b039586166001600160a01b031991821617909155600180549490951693169290921790925550620001469050565b613cb980620001566000396000f3fe6080604052600436106100ec5760003560e01c80638ab1d6811161008a578063d9139f6311610059578063d9139f63146102f3578063e43252d714610313578063f3cc669a14610333578063f887ea401461035357600080fd5b80638ab1d6811461027c578063a6cedf9c1461029c578063b384bcbc146102af578063bb0c8298146102cf57600080fd5b80633fc8cef3116100c65780633fc8cef3146101bc578063574b7675146101fc5780635aa6e6751461023c57806372f8b6cd1461025c57600080fd5b806302006da014610129578063089fe6aa146101495780633f2f869a1461017857600080fd5b3661012457337382af49447d8a07e3bd95bd0d56f35241523fbab11461012257634e487b7160e01b600052600160045260246000fd5b005b600080fd5b34801561013557600080fd5b506101226101443660046138e0565b610373565b34801561015557600080fd5b5061015f610bb881565b60405162ffffff90911681526020015b60405180910390f35b34801561018457600080fd5b506101986101933660046137ed565b610a87565b6040805193845260208401929092526001600160a01b03169082015260600161016f565b3480156101c857600080fd5b506101e47382af49447d8a07e3bd95bd0d56f35241523fbab181565b6040516001600160a01b03909116815260200161016f565b34801561020857600080fd5b5061022c6102173660046137ae565b60026020526000908152604090205460ff1681565b604051901515815260200161016f565b34801561024857600080fd5b506001546101e4906001600160a01b031681565b34801561026857600080fd5b50610122610277366004613899565b611088565b34801561028857600080fd5b506101226102973660046137ae565b6114d7565b6101226102aa366004613858565b611552565b3480156102bb57600080fd5b506101226102ca366004613858565b611a95565b3480156102db57600080fd5b506102e56103e881565b60405190815260200161016f565b3480156102ff57600080fd5b5061012261030e36600461382d565b612276565b34801561031f57600080fd5b5061012261032e3660046137ae565b61253c565b34801561033f57600080fd5b5061012261034e366004613899565b6125ba565b34801561035f57600080fd5b506000546101e4906001600160a01b031681565b6001600160a01b038316600090815260026020526040902054839060ff166103b65760405162461bcd60e51b81526004016103ad90613af0565b60405180910390fd5b6000806103c286612d37565b60405162415c3360e91b81526000600482018190529294509092506001600160a01b038316906382b866009060240160206040518083038186803b15801561040957600080fd5b505afa15801561041d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061044191906137d1565b60405162415c3360e91b8152600160048201529091506000906001600160a01b038416906382b866009060240160206040518083038186803b15801561048657600080fd5b505afa15801561049a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104be91906137d1565b90506104d56001600160a01b03851633308a612f82565b604051632e1a7d4d60e01b8152600481018890526001600160a01b03851690632e1a7d4d90602401600060405180830381600087803b15801561051757600080fd5b505af115801561052b573d6000803e3d6000fd5b505050506105a9846001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561056b57600080fd5b505afa15801561057f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a391906137d1565b84612fed565b6105b3818461316b565b6040516370a0823160e01b81523060048201526001600160a01b03808516916391695586916001916000918616906370a082319060240160206040518083038186803b15801561060257600080fd5b505afa158015610616573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063a91906139f4565b6040516001600160e01b031960e086901b16815260ff938416600482015292909116602483015260448201526064810189905242608482015260a401602060405180830381600087803b15801561069057600080fd5b505af11580156106a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c891906139f4565b506001600160a01b0382167382af49447d8a07e3bd95bd0d56f35241523fbab114156107a257604080516002808252606082018352600092602083019080368337019050509050828160008151811061073157634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050818160018151811061077357634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b03168152505061079c81613208565b50610a7d565b60408051600280825260608201835260009260208301908036833701905050905082816000815181106107e557634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250507382af49447d8a07e3bd95bd0d56f35241523fbab18160018151811061083b57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b03168152505061089b8160008151811061087f57634e487b7160e01b600052603260045260246000fd5b60209081029190910101516000546001600160a01b031661316b565b6000604051806101000160405280836000815181106108ca57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031681526020018360018151811061090157634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03168152602001610bb862ffffff168152602001306001600160a01b031681526020014281526020018360008151811061095a57634e487b7160e01b600052603260045260246000fd5b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156109a557600080fd5b505afa1580156109b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109dd91906139f4565b8152600060208201819052604091820181905254905163414bf38960e01b81529192506001600160a01b03169063414bf38990610a1e908490600401613b70565b602060405180830381600087803b158015610a3857600080fd5b505af1158015610a4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7091906139f4565b50610a7a82613208565b50505b5050505050505050565b6000806000806000610a9888612d37565b60405162415c3360e91b81526000600482018190529294509092506001600160a01b03808a1691908416906382b866009060240160206040518083038186803b158015610ae457600080fd5b505afa158015610af8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1c91906137d1565b6001600160a01b03161490508080610bb6575060405162415c3360e91b8152600160048201526001600160a01b03808a1691908416906382b866009060240160206040518083038186803b158015610b7357600080fd5b505afa158015610b87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bab91906137d1565b6001600160a01b0316145b610bd25760405162461bcd60e51b81526004016103ad90613b27565b6040516391ceb3eb60e01b8152600060048201819052906001600160a01b038416906391ceb3eb9060240160206040518083038186803b158015610c1557600080fd5b505afa158015610c29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4d91906139f4565b6040516391ceb3eb60e01b8152600160048201529091506000906001600160a01b038516906391ceb3eb9060240160206040518083038186803b158015610c9357600080fd5b505afa158015610ca7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ccb91906139f4565b90508215610e6e57808210610e695760405163a95b089f60e01b815260006004820181905260016024830152604482018b9052906001600160a01b0386169063a95b089f9060640160206040518083038186803b158015610d2b57600080fd5b505afa158015610d3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6391906139f4565b604080516002808252606080830184529394509091602083019080368337019050509050600081600081518110610daa57634e487b7160e01b600052603260045260246000fd5b6020026020010181815250508181600181518110610dd857634e487b7160e01b600052603260045260246000fd5b602090810291909101015260405163f9273ffb60e01b81526001600160a01b0387169063f9273ffb90610e149030908590600190600401613a62565b60206040518083038186803b158015610e2c57600080fd5b505afa158015610e40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6491906139f4565b985050505b611004565b8181106110045760405163a95b089f60e01b815260016004820152600060248201819052604482018b9052906001600160a01b0386169063a95b089f9060640160206040518083038186803b158015610ec657600080fd5b505afa158015610eda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610efe91906139f4565b604080516002808252606080830184529394509091602083019080368337019050509050600081600081518110610f4557634e487b7160e01b600052603260045260246000fd5b6020026020010181815250508181600181518110610f7357634e487b7160e01b600052603260045260246000fd5b602090810291909101015260405163f9273ffb60e01b81526001600160a01b0387169063f9273ffb90610faf9030908590600190600401613a62565b60206040518083038186803b158015610fc757600080fd5b505afa158015610fdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fff91906139f4565b985050505b889750846001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561104057600080fd5b505afa158015611054573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107891906137d1565b9550505050505093509350939050565b6001600160a01b038416600090815260026020526040902054849060ff166110c25760405162461bcd60e51b81526004016103ad90613af0565b6103e88210156111145760405162461bcd60e51b815260206004820152601a60248201527f496e7369676e69666963616e7420696e70757420616d6f756e7400000000000060448201526064016103ad565b604051636eb1769f60e11b815233600482015230602482015282906001600160a01b0385169063dd62ed3e9060440160206040518083038186803b15801561115b57600080fd5b505afa15801561116f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119391906139f4565b10156111e15760405162461bcd60e51b815260206004820152601b60248201527f496e70757420746f6b656e206973206e6f7420617070726f766564000000000060448201526064016103ad565b6111f66001600160a01b038416333085612f82565b600061120186612d37565b60405162415c3360e91b81526000600482018190529193509091506001600160a01b038316906382b866009060240160206040518083038186803b15801561124857600080fd5b505afa15801561125c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128091906137d1565b9050846001600160a01b0316816001600160a01b0316146114c35760408051600280825260608201835260009260208301908036833701905050905085816000815181106112de57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050818160018151811061132057634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250506113648160008151811061087f57634e487b7160e01b600052603260045260246000fd5b60006040518061010001604052808360008151811061139357634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03168152602001836001815181106113ca57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03168152602001610bb862ffffff168152602001306001600160a01b031681526020014281526020018781526020016000815260200160006001600160a01b0316815250905060008054906101000a90046001600160a01b03166001600160a01b031663414bf389826040518263ffffffff1660e01b815260040161145e9190613b70565b602060405180830381600087803b15801561147857600080fd5b505af115801561148c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b091906139f4565b506114bc898985611a95565b50506114ce565b6114ce878787611a95565b50505050505050565b6001546001600160a01b031633146115315760405162461bcd60e51b815260206004820152601c60248201527f43616c6c6572206973206e6f742074686520676f7665726e616e63650000000060448201526064016103ad565b6001600160a01b03166000908152600260205260409020805460ff19169055565b6001600160a01b038316600090815260026020526040902054839060ff1661158c5760405162461bcd60e51b81526004016103ad90613af0565b6103e83410156115de5760405162461bcd60e51b815260206004820152601a60248201527f496e7369676e69666963616e7420696e70757420616d6f756e7400000000000060448201526064016103ad565b7382af49447d8a07e3bd95bd0d56f35241523fbab16001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561162d57600080fd5b505af1158015611641573d6000803e3d6000fd5b505050506001600160a01b0383167382af49447d8a07e3bd95bd0d56f35241523fbab1149050611a84576040516370a0823160e01b81523060048201526000907382af49447d8a07e3bd95bd0d56f35241523fbab1906370a082319060240160206040518083038186803b1580156116b857600080fd5b505afa1580156116cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f091906139f4565b905060006116fd86612d37565b60405162415c3360e91b81526000600482018190529193509091506001600160a01b038316906382b866009060240160206040518083038186803b15801561174457600080fd5b505afa158015611758573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177c91906137d1565b60405162415c3360e91b8152600160048201529091506000906001600160a01b038416906382b866009060240160206040518083038186803b1580156117c157600080fd5b505afa1580156117d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f991906137d1565b90506001600160a01b038281169087161480806118275750866001600160a01b0316826001600160a01b0316145b6118435760405162461bcd60e51b81526004016103ad90613b27565b6040805160028082526060820183526000926020830190803683370190505090507382af49447d8a07e3bd95bd0d56f35241523fbab18160008151811061189a57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b03168152505087816001815181106118dc57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250506119208160008151811061087f57634e487b7160e01b600052603260045260246000fd5b60006040518061010001604052808360008151811061194f57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031681526020018360018151811061198657634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03168152602001610bb862ffffff168152602001306001600160a01b031681526020014281526020018881526020016000815260200160006001600160a01b0316815250905060008054906101000a90046001600160a01b03166001600160a01b031663414bf389826040518263ffffffff1660e01b8152600401611a1a9190613b70565b602060405180830381600087803b158015611a3457600080fd5b505af1158015611a48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6c91906139f4565b50611a788b8b8b611a95565b50505050505050611a8f565b611a8f848484611a95565b50505050565b6001600160a01b038316600090815260026020526040902054839060ff16611acf5760405162461bcd60e51b81526004016103ad90613af0565b600080611adb86612d37565b60405162415c3360e91b81526000600482018190529294509092506001600160a01b038316906382b866009060240160206040518083038186803b158015611b2257600080fd5b505afa158015611b36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5a91906137d1565b60405162415c3360e91b8152600160048201529091506000906001600160a01b038416906382b866009060240160206040518083038186803b158015611b9f57600080fd5b505afa158015611bb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd791906137d1565b90506001600160a01b03828116908716148080611c055750866001600160a01b0316826001600160a01b0316145b611c215760405162461bcd60e51b81526004016103ad90613b27565b6040516391ceb3eb60e01b8152600060048201819052906001600160a01b038616906391ceb3eb9060240160206040518083038186803b158015611c6457600080fd5b505afa158015611c78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9c91906139f4565b6040516391ceb3eb60e01b8152600160048201529091506000906001600160a01b038716906391ceb3eb9060240160206040518083038186803b158015611ce257600080fd5b505afa158015611cf6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1a91906139f4565b905080821115611e42576040516370a0823160e01b81523060048201526000906001600160a01b038b16906370a082319060240160206040518083038186803b158015611d6657600080fd5b505afa158015611d7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d9e91906139f4565b9050611daa868861316b565b6040516348b4aac360e11b8152600060048201526001602482015260448101829052606481018c90524260848201526001600160a01b0388169063916955869060a401602060405180830381600087803b158015611e0757600080fd5b505af1158015611e1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3f91906139f4565b50505b6040516370a0823160e01b81523060048201526000906001600160a01b038716906370a082319060240160206040518083038186803b158015611e8457600080fd5b505afa158015611e98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ebc91906139f4565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038716906370a082319060240160206040518083038186803b158015611f0157600080fd5b505afa158015611f15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f3991906139f4565b6040805160028082526060808301845293945090916020830190803683370190505090508281600081518110611f7f57634e487b7160e01b600052603260045260246000fd5b6020026020010181815250508181600181518110611fad57634e487b7160e01b600052603260045260246000fd5b602002602001018181525050611fc3888a61316b565b611fcd878a61316b565b604051634d49e87d60e01b81526000906001600160a01b038b1690634d49e87d9061200090859085904290600401613a98565b602060405180830381600087803b15801561201a57600080fd5b505af115801561202e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205291906139f4565b90506120ce8b6001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561209057600080fd5b505afa1580156120a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c891906137d1565b8c61316b565b60405163b6b55f2560e01b8152600481018290526001600160a01b038c169063b6b55f2590602401600060405180830381600087803b15801561211057600080fd5b505af1158015612124573d6000803e3d6000fd5b50506040516370a0823160e01b81523060048201526121b692503391506001600160a01b038e16906370a082319060240160206040518083038186803b15801561216d57600080fd5b505afa158015612181573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a591906139f4565b6001600160a01b038e169190613485565b60408051600280825260608201835260009260208301908036833701905050905089816000815181106121f957634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050888160018151811061223b57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b03168152505061226481613208565b50505050505050505050505050505050565b6001600160a01b038216600090815260026020526040902054829060ff166122b05760405162461bcd60e51b81526004016103ad90613af0565b6000806122bc85612d37565b90925090506122d66001600160a01b038616333087612f82565b604051632e1a7d4d60e01b8152600481018590526001600160a01b03831690632e1a7d4d90602401600060405180830381600087803b15801561231857600080fd5b505af115801561232c573d6000803e3d6000fd5b505050506123aa826001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561236c57600080fd5b505afa158015612380573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123a491906137d1565b82612fed565b6040805160028082526060820183526000926020830190803683370190505060405162415c3360e91b8152600060048201529091506001600160a01b038316906382b866009060240160206040518083038186803b15801561240b57600080fd5b505afa15801561241f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061244391906137d1565b8160008151811061246457634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260405162415c3360e91b815260016004820152908316906382b866009060240160206040518083038186803b1580156124b257600080fd5b505afa1580156124c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ea91906137d1565b8160018151811061250b57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b03168152505061253481613208565b505050505050565b6001546001600160a01b031633146125965760405162461bcd60e51b815260206004820152601c60248201527f43616c6c6572206973206e6f742074686520676f7665726e616e63650000000060448201526064016103ad565b6001600160a01b03166000908152600260205260409020805460ff19166001179055565b6001600160a01b038416600090815260026020526040902054849060ff166125f45760405162461bcd60e51b81526004016103ad90613af0565b60008061260087612d37565b60405162415c3360e91b81526000600482018190529294509092506001600160a01b038316906382b866009060240160206040518083038186803b15801561264757600080fd5b505afa15801561265b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061267f91906137d1565b60405162415c3360e91b8152600160048201529091506000906001600160a01b038416906382b866009060240160206040518083038186803b1580156126c457600080fd5b505afa1580156126d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126fc91906137d1565b90506127136001600160a01b03851633308b612f82565b604051632e1a7d4d60e01b8152600481018990526001600160a01b03851690632e1a7d4d90602401600060405180830381600087803b15801561275557600080fd5b505af1158015612769573d6000803e3d6000fd5b505050506127a9846001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561056b57600080fd5b6127b3818461316b565b6040516370a0823160e01b81523060048201526001600160a01b03808516916391695586916001916000918616906370a082319060240160206040518083038186803b15801561280257600080fd5b505afa158015612816573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061283a91906139f4565b6040516001600160e01b031960e086901b16815260ff938416600482015292909116602483015260448201526064810189905242608482015260a401602060405180830381600087803b15801561289057600080fd5b505af11580156128a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c891906139f4565b50816001600160a01b0316876001600160a01b0316141561299757604080516002808252606082018352600092602083019080368337019050509050828160008151811061292657634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050818160018151811061296857634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b03168152505061299181613208565b50612d2c565b60408051600280825260608201835260009260208301908036833701905050905082816000815181106129da57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250508781600181518110612a1c57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050612a608160008151811061087f57634e487b7160e01b600052603260045260246000fd5b600060405180610100016040528083600081518110612a8f57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316815260200183600181518110612ac657634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03168152602001610bb862ffffff168152602001306001600160a01b0316815260200142815260200183600081518110612b1f57634e487b7160e01b600052603260045260246000fd5b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015612b6a57600080fd5b505afa158015612b7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ba291906139f4565b8152600060208201819052604091820181905254905163414bf38960e01b81529192506001600160a01b03169063414bf38990612be3908490600401613b70565b602060405180830381600087803b158015612bfd57600080fd5b505af1158015612c11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c3591906139f4565b5060408051600380825260808201909252600091602082016060803683370190505090508481600081518110612c7b57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250508381600181518110612cbd57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250508981600281518110612cff57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050612d2881613208565b5050505b505050505050505050565b600080829150816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015612d7657600080fd5b505afa158015612d8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dae91906137d1565b6001600160a01b0316638119c0656040518163ffffffff1660e01b815260040160206040518083038186803b158015612de657600080fd5b505afa158015612dfa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e1e91906137d1565b905060006001600160a01b0316826001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015612e6457600080fd5b505afa158015612e78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e9c91906137d1565b6001600160a01b0316638119c0656040518163ffffffff1660e01b815260040160206040518083038186803b158015612ed457600080fd5b505afa158015612ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f0c91906137d1565b6001600160a01b03161415612f7d5760405162461bcd60e51b815260206004820152603160248201527f4c697175696469747920706f6f6c20616464726573732063616e6e6f7420626560448201527020746865207a65726f206164647265737360781b60648201526084016103ad565b915091565b6040516001600160a01b0380851660248301528316604482015260648101829052611a8f9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526134b5565b612ff7828261316b565b604080516002808252606080830184529260208301908036833701905050905060008160008151811061303a57634e487b7160e01b600052603260045260246000fd5b60200260200101818152505060008160018151811061306957634e487b7160e01b600052603260045260246000fd5b60209081029190910101526040516370a0823160e01b81523060048201526001600160a01b03808416916331cd52b0918616906370a082319060240160206040518083038186803b1580156130bd57600080fd5b505afa1580156130d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130f591906139f4565b83426040518463ffffffff1660e01b815260040161311593929190613bd9565b600060405180830381600087803b15801561312f57600080fd5b505af1158015613143573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a8f9190810190613914565b604051636eb1769f60e11b81523060048201526001600160a01b03828116602483015283169063dd62ed3e9060440160206040518083038186803b1580156131b257600080fd5b505afa1580156131c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ea91906139f4565b613204576132046001600160a01b03831682600019613587565b5050565b6000805b82518110156134805782818151811061323557634e487b7160e01b600052603260045260246000fd5b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561328057600080fd5b505afa158015613294573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132b891906139f4565b9150811561346e577382af49447d8a07e3bd95bd0d56f35241523fbab16001600160a01b03168382815181106132fe57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316141561342957604051632e1a7d4d60e01b8152600481018390527382af49447d8a07e3bd95bd0d56f35241523fbab190632e1a7d4d90602401600060405180830381600087803b15801561336257600080fd5b505af1158015613376573d6000803e3d6000fd5b505060408051600080825260208201928390529350339250859161339a9190613a46565b60006040518083038185875af1925050503d80600081146133d7576040519150601f19603f3d011682016040523d82523d6000602084013e6133dc565b606091505b50509050806134235760405162461bcd60e51b8152602060048201526013602482015272115512081d1c985b9cd9995c8819985a5b1959606a1b60448201526064016103ad565b5061346e565b61346e338385848151811061344e57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166134859092919063ffffffff16565b8061347881613c2e565b91505061320c565b505050565b6040516001600160a01b03831660248201526044810182905261348090849063a9059cbb60e01b90606401612fb6565b600061350a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166136ab9092919063ffffffff16565b805190915015613480578080602001905181019061352891906139d4565b6134805760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103ad565b8015806136105750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156135d657600080fd5b505afa1580156135ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061360e91906139f4565b155b61367b5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b60648201526084016103ad565b6040516001600160a01b03831660248201526044810182905261348090849063095ea7b360e01b90606401612fb6565b60606136ba84846000856136c2565b949350505050565b6060843b6137125760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103ad565b600080866001600160a01b0316858760405161372e9190613a46565b60006040518083038185875af1925050503d806000811461376b576040519150601f19603f3d011682016040523d82523d6000602084013e613770565b606091505b509150915081156137845791506136ba9050565b8051156137945780518082602001fd5b8360405162461bcd60e51b81526004016103ad9190613abd565b6000602082840312156137bf578081fd5b81356137ca81613c6b565b9392505050565b6000602082840312156137e2578081fd5b81516137ca81613c6b565b600080600060608486031215613801578182fd5b833561380c81613c6b565b9250602084013561381c81613c6b565b929592945050506040919091013590565b6000806040838503121561383f578182fd5b823561384a81613c6b565b946020939093013593505050565b60008060006060848603121561386c578283fd5b833561387781613c6b565b925060208401359150604084013561388e81613c6b565b809150509250925092565b600080600080608085870312156138ae578081fd5b84356138b981613c6b565b93506020850135925060408501356138d081613c6b565b9396929550929360600135925050565b6000806000606084860312156138f4578283fd5b83356138ff81613c6b565b95602085013595506040909401359392505050565b60006020808385031215613926578182fd5b825167ffffffffffffffff8082111561393d578384fd5b818501915085601f830112613950578384fd5b81518181111561396257613962613c55565b8060051b604051601f19603f8301168101818110858211171561398757613987613c55565b604052828152858101935084860182860187018a10156139a5578788fd5b8795505b838610156139c75780518552600195909501949386019386016139a9565b5098975050505050505050565b6000602082840312156139e5578081fd5b815180151581146137ca578182fd5b600060208284031215613a05578081fd5b5051919050565b6000815180845260208085019450808401835b83811015613a3b57815187529582019590820190600101613a1f565b509495945050505050565b60008251613a58818460208701613c02565b9190910192915050565b6001600160a01b0384168152606060208201819052600090613a8690830185613a0c565b90508215156040830152949350505050565b606081526000613aab6060830186613a0c565b60208301949094525060400152919050565b6020815260008251806020840152613adc816040850160208701613c02565b601f01601f19169190910160400192915050565b60208082526018908201527f5661756c74206973206e6f742077686974656c69737465640000000000000000604082015260600190565b60208082526029908201527f496e70757420746f6b656e206e6f742070726573656e7420696e206c697175696040820152683234ba3c903830b4b960b91b606082015260800190565b81516001600160a01b03908116825260208084015182169083015260408084015162ffffff16908301526060808401518216908301526080808401519083015260a0838101519083015260c0808401519083015260e09283015116918101919091526101000190565b838152606060208201526000613bf26060830185613a0c565b9050826040830152949350505050565b60005b83811015613c1d578181015183820152602001613c05565b83811115611a8f5750506000910152565b6000600019821415613c4e57634e487b7160e01b81526011600452602481fd5b5060010190565b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114613c8057600080fd5b5056fea2646970667358221220eaa5ae89987e47ae9803bed1d22201f36d2d3e2f0f1fbd174959cc5933329ce964736f6c63430008040033

Deployed Bytecode

0x6080604052600436106100ec5760003560e01c80638ab1d6811161008a578063d9139f6311610059578063d9139f63146102f3578063e43252d714610313578063f3cc669a14610333578063f887ea401461035357600080fd5b80638ab1d6811461027c578063a6cedf9c1461029c578063b384bcbc146102af578063bb0c8298146102cf57600080fd5b80633fc8cef3116100c65780633fc8cef3146101bc578063574b7675146101fc5780635aa6e6751461023c57806372f8b6cd1461025c57600080fd5b806302006da014610129578063089fe6aa146101495780633f2f869a1461017857600080fd5b3661012457337382af49447d8a07e3bd95bd0d56f35241523fbab11461012257634e487b7160e01b600052600160045260246000fd5b005b600080fd5b34801561013557600080fd5b506101226101443660046138e0565b610373565b34801561015557600080fd5b5061015f610bb881565b60405162ffffff90911681526020015b60405180910390f35b34801561018457600080fd5b506101986101933660046137ed565b610a87565b6040805193845260208401929092526001600160a01b03169082015260600161016f565b3480156101c857600080fd5b506101e47382af49447d8a07e3bd95bd0d56f35241523fbab181565b6040516001600160a01b03909116815260200161016f565b34801561020857600080fd5b5061022c6102173660046137ae565b60026020526000908152604090205460ff1681565b604051901515815260200161016f565b34801561024857600080fd5b506001546101e4906001600160a01b031681565b34801561026857600080fd5b50610122610277366004613899565b611088565b34801561028857600080fd5b506101226102973660046137ae565b6114d7565b6101226102aa366004613858565b611552565b3480156102bb57600080fd5b506101226102ca366004613858565b611a95565b3480156102db57600080fd5b506102e56103e881565b60405190815260200161016f565b3480156102ff57600080fd5b5061012261030e36600461382d565b612276565b34801561031f57600080fd5b5061012261032e3660046137ae565b61253c565b34801561033f57600080fd5b5061012261034e366004613899565b6125ba565b34801561035f57600080fd5b506000546101e4906001600160a01b031681565b6001600160a01b038316600090815260026020526040902054839060ff166103b65760405162461bcd60e51b81526004016103ad90613af0565b60405180910390fd5b6000806103c286612d37565b60405162415c3360e91b81526000600482018190529294509092506001600160a01b038316906382b866009060240160206040518083038186803b15801561040957600080fd5b505afa15801561041d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061044191906137d1565b60405162415c3360e91b8152600160048201529091506000906001600160a01b038416906382b866009060240160206040518083038186803b15801561048657600080fd5b505afa15801561049a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104be91906137d1565b90506104d56001600160a01b03851633308a612f82565b604051632e1a7d4d60e01b8152600481018890526001600160a01b03851690632e1a7d4d90602401600060405180830381600087803b15801561051757600080fd5b505af115801561052b573d6000803e3d6000fd5b505050506105a9846001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561056b57600080fd5b505afa15801561057f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a391906137d1565b84612fed565b6105b3818461316b565b6040516370a0823160e01b81523060048201526001600160a01b03808516916391695586916001916000918616906370a082319060240160206040518083038186803b15801561060257600080fd5b505afa158015610616573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063a91906139f4565b6040516001600160e01b031960e086901b16815260ff938416600482015292909116602483015260448201526064810189905242608482015260a401602060405180830381600087803b15801561069057600080fd5b505af11580156106a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c891906139f4565b506001600160a01b0382167382af49447d8a07e3bd95bd0d56f35241523fbab114156107a257604080516002808252606082018352600092602083019080368337019050509050828160008151811061073157634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050818160018151811061077357634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b03168152505061079c81613208565b50610a7d565b60408051600280825260608201835260009260208301908036833701905050905082816000815181106107e557634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250507382af49447d8a07e3bd95bd0d56f35241523fbab18160018151811061083b57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b03168152505061089b8160008151811061087f57634e487b7160e01b600052603260045260246000fd5b60209081029190910101516000546001600160a01b031661316b565b6000604051806101000160405280836000815181106108ca57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031681526020018360018151811061090157634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03168152602001610bb862ffffff168152602001306001600160a01b031681526020014281526020018360008151811061095a57634e487b7160e01b600052603260045260246000fd5b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156109a557600080fd5b505afa1580156109b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109dd91906139f4565b8152600060208201819052604091820181905254905163414bf38960e01b81529192506001600160a01b03169063414bf38990610a1e908490600401613b70565b602060405180830381600087803b158015610a3857600080fd5b505af1158015610a4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7091906139f4565b50610a7a82613208565b50505b5050505050505050565b6000806000806000610a9888612d37565b60405162415c3360e91b81526000600482018190529294509092506001600160a01b03808a1691908416906382b866009060240160206040518083038186803b158015610ae457600080fd5b505afa158015610af8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1c91906137d1565b6001600160a01b03161490508080610bb6575060405162415c3360e91b8152600160048201526001600160a01b03808a1691908416906382b866009060240160206040518083038186803b158015610b7357600080fd5b505afa158015610b87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bab91906137d1565b6001600160a01b0316145b610bd25760405162461bcd60e51b81526004016103ad90613b27565b6040516391ceb3eb60e01b8152600060048201819052906001600160a01b038416906391ceb3eb9060240160206040518083038186803b158015610c1557600080fd5b505afa158015610c29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4d91906139f4565b6040516391ceb3eb60e01b8152600160048201529091506000906001600160a01b038516906391ceb3eb9060240160206040518083038186803b158015610c9357600080fd5b505afa158015610ca7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ccb91906139f4565b90508215610e6e57808210610e695760405163a95b089f60e01b815260006004820181905260016024830152604482018b9052906001600160a01b0386169063a95b089f9060640160206040518083038186803b158015610d2b57600080fd5b505afa158015610d3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6391906139f4565b604080516002808252606080830184529394509091602083019080368337019050509050600081600081518110610daa57634e487b7160e01b600052603260045260246000fd5b6020026020010181815250508181600181518110610dd857634e487b7160e01b600052603260045260246000fd5b602090810291909101015260405163f9273ffb60e01b81526001600160a01b0387169063f9273ffb90610e149030908590600190600401613a62565b60206040518083038186803b158015610e2c57600080fd5b505afa158015610e40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6491906139f4565b985050505b611004565b8181106110045760405163a95b089f60e01b815260016004820152600060248201819052604482018b9052906001600160a01b0386169063a95b089f9060640160206040518083038186803b158015610ec657600080fd5b505afa158015610eda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610efe91906139f4565b604080516002808252606080830184529394509091602083019080368337019050509050600081600081518110610f4557634e487b7160e01b600052603260045260246000fd5b6020026020010181815250508181600181518110610f7357634e487b7160e01b600052603260045260246000fd5b602090810291909101015260405163f9273ffb60e01b81526001600160a01b0387169063f9273ffb90610faf9030908590600190600401613a62565b60206040518083038186803b158015610fc757600080fd5b505afa158015610fdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fff91906139f4565b985050505b889750846001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561104057600080fd5b505afa158015611054573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107891906137d1565b9550505050505093509350939050565b6001600160a01b038416600090815260026020526040902054849060ff166110c25760405162461bcd60e51b81526004016103ad90613af0565b6103e88210156111145760405162461bcd60e51b815260206004820152601a60248201527f496e7369676e69666963616e7420696e70757420616d6f756e7400000000000060448201526064016103ad565b604051636eb1769f60e11b815233600482015230602482015282906001600160a01b0385169063dd62ed3e9060440160206040518083038186803b15801561115b57600080fd5b505afa15801561116f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119391906139f4565b10156111e15760405162461bcd60e51b815260206004820152601b60248201527f496e70757420746f6b656e206973206e6f7420617070726f766564000000000060448201526064016103ad565b6111f66001600160a01b038416333085612f82565b600061120186612d37565b60405162415c3360e91b81526000600482018190529193509091506001600160a01b038316906382b866009060240160206040518083038186803b15801561124857600080fd5b505afa15801561125c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128091906137d1565b9050846001600160a01b0316816001600160a01b0316146114c35760408051600280825260608201835260009260208301908036833701905050905085816000815181106112de57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050818160018151811061132057634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250506113648160008151811061087f57634e487b7160e01b600052603260045260246000fd5b60006040518061010001604052808360008151811061139357634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03168152602001836001815181106113ca57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03168152602001610bb862ffffff168152602001306001600160a01b031681526020014281526020018781526020016000815260200160006001600160a01b0316815250905060008054906101000a90046001600160a01b03166001600160a01b031663414bf389826040518263ffffffff1660e01b815260040161145e9190613b70565b602060405180830381600087803b15801561147857600080fd5b505af115801561148c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b091906139f4565b506114bc898985611a95565b50506114ce565b6114ce878787611a95565b50505050505050565b6001546001600160a01b031633146115315760405162461bcd60e51b815260206004820152601c60248201527f43616c6c6572206973206e6f742074686520676f7665726e616e63650000000060448201526064016103ad565b6001600160a01b03166000908152600260205260409020805460ff19169055565b6001600160a01b038316600090815260026020526040902054839060ff1661158c5760405162461bcd60e51b81526004016103ad90613af0565b6103e83410156115de5760405162461bcd60e51b815260206004820152601a60248201527f496e7369676e69666963616e7420696e70757420616d6f756e7400000000000060448201526064016103ad565b7382af49447d8a07e3bd95bd0d56f35241523fbab16001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561162d57600080fd5b505af1158015611641573d6000803e3d6000fd5b505050506001600160a01b0383167382af49447d8a07e3bd95bd0d56f35241523fbab1149050611a84576040516370a0823160e01b81523060048201526000907382af49447d8a07e3bd95bd0d56f35241523fbab1906370a082319060240160206040518083038186803b1580156116b857600080fd5b505afa1580156116cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f091906139f4565b905060006116fd86612d37565b60405162415c3360e91b81526000600482018190529193509091506001600160a01b038316906382b866009060240160206040518083038186803b15801561174457600080fd5b505afa158015611758573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177c91906137d1565b60405162415c3360e91b8152600160048201529091506000906001600160a01b038416906382b866009060240160206040518083038186803b1580156117c157600080fd5b505afa1580156117d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f991906137d1565b90506001600160a01b038281169087161480806118275750866001600160a01b0316826001600160a01b0316145b6118435760405162461bcd60e51b81526004016103ad90613b27565b6040805160028082526060820183526000926020830190803683370190505090507382af49447d8a07e3bd95bd0d56f35241523fbab18160008151811061189a57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b03168152505087816001815181106118dc57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250506119208160008151811061087f57634e487b7160e01b600052603260045260246000fd5b60006040518061010001604052808360008151811061194f57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031681526020018360018151811061198657634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03168152602001610bb862ffffff168152602001306001600160a01b031681526020014281526020018881526020016000815260200160006001600160a01b0316815250905060008054906101000a90046001600160a01b03166001600160a01b031663414bf389826040518263ffffffff1660e01b8152600401611a1a9190613b70565b602060405180830381600087803b158015611a3457600080fd5b505af1158015611a48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6c91906139f4565b50611a788b8b8b611a95565b50505050505050611a8f565b611a8f848484611a95565b50505050565b6001600160a01b038316600090815260026020526040902054839060ff16611acf5760405162461bcd60e51b81526004016103ad90613af0565b600080611adb86612d37565b60405162415c3360e91b81526000600482018190529294509092506001600160a01b038316906382b866009060240160206040518083038186803b158015611b2257600080fd5b505afa158015611b36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5a91906137d1565b60405162415c3360e91b8152600160048201529091506000906001600160a01b038416906382b866009060240160206040518083038186803b158015611b9f57600080fd5b505afa158015611bb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd791906137d1565b90506001600160a01b03828116908716148080611c055750866001600160a01b0316826001600160a01b0316145b611c215760405162461bcd60e51b81526004016103ad90613b27565b6040516391ceb3eb60e01b8152600060048201819052906001600160a01b038616906391ceb3eb9060240160206040518083038186803b158015611c6457600080fd5b505afa158015611c78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9c91906139f4565b6040516391ceb3eb60e01b8152600160048201529091506000906001600160a01b038716906391ceb3eb9060240160206040518083038186803b158015611ce257600080fd5b505afa158015611cf6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1a91906139f4565b905080821115611e42576040516370a0823160e01b81523060048201526000906001600160a01b038b16906370a082319060240160206040518083038186803b158015611d6657600080fd5b505afa158015611d7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d9e91906139f4565b9050611daa868861316b565b6040516348b4aac360e11b8152600060048201526001602482015260448101829052606481018c90524260848201526001600160a01b0388169063916955869060a401602060405180830381600087803b158015611e0757600080fd5b505af1158015611e1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3f91906139f4565b50505b6040516370a0823160e01b81523060048201526000906001600160a01b038716906370a082319060240160206040518083038186803b158015611e8457600080fd5b505afa158015611e98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ebc91906139f4565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038716906370a082319060240160206040518083038186803b158015611f0157600080fd5b505afa158015611f15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f3991906139f4565b6040805160028082526060808301845293945090916020830190803683370190505090508281600081518110611f7f57634e487b7160e01b600052603260045260246000fd5b6020026020010181815250508181600181518110611fad57634e487b7160e01b600052603260045260246000fd5b602002602001018181525050611fc3888a61316b565b611fcd878a61316b565b604051634d49e87d60e01b81526000906001600160a01b038b1690634d49e87d9061200090859085904290600401613a98565b602060405180830381600087803b15801561201a57600080fd5b505af115801561202e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205291906139f4565b90506120ce8b6001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561209057600080fd5b505afa1580156120a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c891906137d1565b8c61316b565b60405163b6b55f2560e01b8152600481018290526001600160a01b038c169063b6b55f2590602401600060405180830381600087803b15801561211057600080fd5b505af1158015612124573d6000803e3d6000fd5b50506040516370a0823160e01b81523060048201526121b692503391506001600160a01b038e16906370a082319060240160206040518083038186803b15801561216d57600080fd5b505afa158015612181573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a591906139f4565b6001600160a01b038e169190613485565b60408051600280825260608201835260009260208301908036833701905050905089816000815181106121f957634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050888160018151811061223b57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b03168152505061226481613208565b50505050505050505050505050505050565b6001600160a01b038216600090815260026020526040902054829060ff166122b05760405162461bcd60e51b81526004016103ad90613af0565b6000806122bc85612d37565b90925090506122d66001600160a01b038616333087612f82565b604051632e1a7d4d60e01b8152600481018590526001600160a01b03831690632e1a7d4d90602401600060405180830381600087803b15801561231857600080fd5b505af115801561232c573d6000803e3d6000fd5b505050506123aa826001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561236c57600080fd5b505afa158015612380573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123a491906137d1565b82612fed565b6040805160028082526060820183526000926020830190803683370190505060405162415c3360e91b8152600060048201529091506001600160a01b038316906382b866009060240160206040518083038186803b15801561240b57600080fd5b505afa15801561241f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061244391906137d1565b8160008151811061246457634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260405162415c3360e91b815260016004820152908316906382b866009060240160206040518083038186803b1580156124b257600080fd5b505afa1580156124c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ea91906137d1565b8160018151811061250b57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b03168152505061253481613208565b505050505050565b6001546001600160a01b031633146125965760405162461bcd60e51b815260206004820152601c60248201527f43616c6c6572206973206e6f742074686520676f7665726e616e63650000000060448201526064016103ad565b6001600160a01b03166000908152600260205260409020805460ff19166001179055565b6001600160a01b038416600090815260026020526040902054849060ff166125f45760405162461bcd60e51b81526004016103ad90613af0565b60008061260087612d37565b60405162415c3360e91b81526000600482018190529294509092506001600160a01b038316906382b866009060240160206040518083038186803b15801561264757600080fd5b505afa15801561265b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061267f91906137d1565b60405162415c3360e91b8152600160048201529091506000906001600160a01b038416906382b866009060240160206040518083038186803b1580156126c457600080fd5b505afa1580156126d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126fc91906137d1565b90506127136001600160a01b03851633308b612f82565b604051632e1a7d4d60e01b8152600481018990526001600160a01b03851690632e1a7d4d90602401600060405180830381600087803b15801561275557600080fd5b505af1158015612769573d6000803e3d6000fd5b505050506127a9846001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561056b57600080fd5b6127b3818461316b565b6040516370a0823160e01b81523060048201526001600160a01b03808516916391695586916001916000918616906370a082319060240160206040518083038186803b15801561280257600080fd5b505afa158015612816573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061283a91906139f4565b6040516001600160e01b031960e086901b16815260ff938416600482015292909116602483015260448201526064810189905242608482015260a401602060405180830381600087803b15801561289057600080fd5b505af11580156128a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c891906139f4565b50816001600160a01b0316876001600160a01b0316141561299757604080516002808252606082018352600092602083019080368337019050509050828160008151811061292657634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050818160018151811061296857634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b03168152505061299181613208565b50612d2c565b60408051600280825260608201835260009260208301908036833701905050905082816000815181106129da57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250508781600181518110612a1c57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050612a608160008151811061087f57634e487b7160e01b600052603260045260246000fd5b600060405180610100016040528083600081518110612a8f57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316815260200183600181518110612ac657634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03168152602001610bb862ffffff168152602001306001600160a01b0316815260200142815260200183600081518110612b1f57634e487b7160e01b600052603260045260246000fd5b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015612b6a57600080fd5b505afa158015612b7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ba291906139f4565b8152600060208201819052604091820181905254905163414bf38960e01b81529192506001600160a01b03169063414bf38990612be3908490600401613b70565b602060405180830381600087803b158015612bfd57600080fd5b505af1158015612c11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c3591906139f4565b5060408051600380825260808201909252600091602082016060803683370190505090508481600081518110612c7b57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250508381600181518110612cbd57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250508981600281518110612cff57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050612d2881613208565b5050505b505050505050505050565b600080829150816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015612d7657600080fd5b505afa158015612d8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dae91906137d1565b6001600160a01b0316638119c0656040518163ffffffff1660e01b815260040160206040518083038186803b158015612de657600080fd5b505afa158015612dfa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e1e91906137d1565b905060006001600160a01b0316826001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015612e6457600080fd5b505afa158015612e78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e9c91906137d1565b6001600160a01b0316638119c0656040518163ffffffff1660e01b815260040160206040518083038186803b158015612ed457600080fd5b505afa158015612ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f0c91906137d1565b6001600160a01b03161415612f7d5760405162461bcd60e51b815260206004820152603160248201527f4c697175696469747920706f6f6c20616464726573732063616e6e6f7420626560448201527020746865207a65726f206164647265737360781b60648201526084016103ad565b915091565b6040516001600160a01b0380851660248301528316604482015260648101829052611a8f9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526134b5565b612ff7828261316b565b604080516002808252606080830184529260208301908036833701905050905060008160008151811061303a57634e487b7160e01b600052603260045260246000fd5b60200260200101818152505060008160018151811061306957634e487b7160e01b600052603260045260246000fd5b60209081029190910101526040516370a0823160e01b81523060048201526001600160a01b03808416916331cd52b0918616906370a082319060240160206040518083038186803b1580156130bd57600080fd5b505afa1580156130d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130f591906139f4565b83426040518463ffffffff1660e01b815260040161311593929190613bd9565b600060405180830381600087803b15801561312f57600080fd5b505af1158015613143573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a8f9190810190613914565b604051636eb1769f60e11b81523060048201526001600160a01b03828116602483015283169063dd62ed3e9060440160206040518083038186803b1580156131b257600080fd5b505afa1580156131c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ea91906139f4565b613204576132046001600160a01b03831682600019613587565b5050565b6000805b82518110156134805782818151811061323557634e487b7160e01b600052603260045260246000fd5b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561328057600080fd5b505afa158015613294573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132b891906139f4565b9150811561346e577382af49447d8a07e3bd95bd0d56f35241523fbab16001600160a01b03168382815181106132fe57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316141561342957604051632e1a7d4d60e01b8152600481018390527382af49447d8a07e3bd95bd0d56f35241523fbab190632e1a7d4d90602401600060405180830381600087803b15801561336257600080fd5b505af1158015613376573d6000803e3d6000fd5b505060408051600080825260208201928390529350339250859161339a9190613a46565b60006040518083038185875af1925050503d80600081146133d7576040519150601f19603f3d011682016040523d82523d6000602084013e6133dc565b606091505b50509050806134235760405162461bcd60e51b8152602060048201526013602482015272115512081d1c985b9cd9995c8819985a5b1959606a1b60448201526064016103ad565b5061346e565b61346e338385848151811061344e57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166134859092919063ffffffff16565b8061347881613c2e565b91505061320c565b505050565b6040516001600160a01b03831660248201526044810182905261348090849063a9059cbb60e01b90606401612fb6565b600061350a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166136ab9092919063ffffffff16565b805190915015613480578080602001905181019061352891906139d4565b6134805760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103ad565b8015806136105750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156135d657600080fd5b505afa1580156135ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061360e91906139f4565b155b61367b5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b60648201526084016103ad565b6040516001600160a01b03831660248201526044810182905261348090849063095ea7b360e01b90606401612fb6565b60606136ba84846000856136c2565b949350505050565b6060843b6137125760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103ad565b600080866001600160a01b0316858760405161372e9190613a46565b60006040518083038185875af1925050503d806000811461376b576040519150601f19603f3d011682016040523d82523d6000602084013e613770565b606091505b509150915081156137845791506136ba9050565b8051156137945780518082602001fd5b8360405162461bcd60e51b81526004016103ad9190613abd565b6000602082840312156137bf578081fd5b81356137ca81613c6b565b9392505050565b6000602082840312156137e2578081fd5b81516137ca81613c6b565b600080600060608486031215613801578182fd5b833561380c81613c6b565b9250602084013561381c81613c6b565b929592945050506040919091013590565b6000806040838503121561383f578182fd5b823561384a81613c6b565b946020939093013593505050565b60008060006060848603121561386c578283fd5b833561387781613c6b565b925060208401359150604084013561388e81613c6b565b809150509250925092565b600080600080608085870312156138ae578081fd5b84356138b981613c6b565b93506020850135925060408501356138d081613c6b565b9396929550929360600135925050565b6000806000606084860312156138f4578283fd5b83356138ff81613c6b565b95602085013595506040909401359392505050565b60006020808385031215613926578182fd5b825167ffffffffffffffff8082111561393d578384fd5b818501915085601f830112613950578384fd5b81518181111561396257613962613c55565b8060051b604051601f19603f8301168101818110858211171561398757613987613c55565b604052828152858101935084860182860187018a10156139a5578788fd5b8795505b838610156139c75780518552600195909501949386019386016139a9565b5098975050505050505050565b6000602082840312156139e5578081fd5b815180151581146137ca578182fd5b600060208284031215613a05578081fd5b5051919050565b6000815180845260208085019450808401835b83811015613a3b57815187529582019590820190600101613a1f565b509495945050505050565b60008251613a58818460208701613c02565b9190910192915050565b6001600160a01b0384168152606060208201819052600090613a8690830185613a0c565b90508215156040830152949350505050565b606081526000613aab6060830186613a0c565b60208301949094525060400152919050565b6020815260008251806020840152613adc816040850160208701613c02565b601f01601f19169190910160400192915050565b60208082526018908201527f5661756c74206973206e6f742077686974656c69737465640000000000000000604082015260600190565b60208082526029908201527f496e70757420746f6b656e206e6f742070726573656e7420696e206c697175696040820152683234ba3c903830b4b960b91b606082015260800190565b81516001600160a01b03908116825260208084015182169083015260408084015162ffffff16908301526060808401518216908301526080808401519083015260a0838101519083015260c0808401519083015260e09283015116918101919091526101000190565b838152606060208201526000613bf26060830185613a0c565b9050826040830152949350505050565b60005b83811015613c1d578181015183820152602001613c05565b83811115611a8f5750506000910152565b6000600019821415613c4e57634e487b7160e01b81526011600452602481fd5b5060010190565b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114613c8057600080fd5b5056fea2646970667358221220eaa5ae89987e47ae9803bed1d22201f36d2d3e2f0f1fbd174959cc5933329ce964736f6c63430008040033

Deployed ByteCode Sourcemap

44928:7331:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38184:10;37480:42;38184:18;38177:26;;-1:-1:-1;;;38177:26:0;;;;;;;;;44928:7331;;;;;47152:1714;;;;;;;;;;-1:-1:-1;47152:1714:0;;;;;:::i;:::-;;:::i;37809:37::-;;;;;;;;;;;;37842:4;37809:37;;;;;14637:8:1;14625:21;;;14607:40;;14595:2;14580:18;37809:37:0;;;;;;;;50861:1395;;;;;;;;;;-1:-1:-1;50861:1395:0;;;;;:::i;:::-;;:::i;:::-;;;;15450:25:1;;;15506:2;15491:18;;15484:34;;;;-1:-1:-1;;;;;15554:32:1;15534:18;;;15527:60;15438:2;15423:18;50861:1395:0;15405:188:1;37449:73:0;;;;;;;;;;;;37480:42;37449:73;;;;;-1:-1:-1;;;;;5304:32:1;;;5286:51;;5274:2;5259:18;37449:73:0;5241:102:1;37638:49:0;;;;;;;;;;-1:-1:-1;37638:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7341:14:1;;7334:22;7316:41;;7304:2;7289:18;37638:49:0;7271:92:1;37529:25:0;;;;;;;;;;-1:-1:-1;37529:25:0;;;;-1:-1:-1;;;;;37529:25:0;;;41517:1572;;;;;;;;;;-1:-1:-1;41517:1572:0;;;;;:::i;:::-;;:::i;38877:121::-;;;;;;;;;;-1:-1:-1;38877:121:0;;;;;:::i;:::-;;:::i;39815:1633::-;;;;;;:::i;:::-;;:::i;48874:1979::-;;;;;;;;;;-1:-1:-1;48874:1979:0;;;;;:::i;:::-;;:::i;37696:44::-;;;;;;;;;;;;37736:4;37696:44;;;;;14804:25:1;;;14792:2;14777:18;37696:44:0;14759:76:1;44277:546:0;;;;;;;;;;-1:-1:-1;44277:546:0;;;;;:::i;:::-;;:::i;38700:115::-;;;;;;;;;;-1:-1:-1;38700:115:0;;;;;:::i;:::-;;:::i;45243:1901::-;;;;;;;;;;-1:-1:-1;45243:1901:0;;;;;:::i;:::-;;:::i;37419:21::-;;;;;;;;;;-1:-1:-1;37419:21:0;;;;-1:-1:-1;;;;;37419:21:0;;;47152:1714;-1:-1:-1;;;;;38381:24:0;;;;;;:17;:24;;;;;;47288:10;;38381:24;;38373:61;;;;-1:-1:-1;;;38373:61:0;;;;;;;:::i;:::-;;;;;;;;;47311:12:::1;47325:13:::0;47342:25:::1;47356:10;47342:13;:25::i;:::-;47399:16;::::0;-1:-1:-1;;;47399:16:0;;47381:14:::1;47399:16;::::0;::::1;7520:36:1::0;;;47310:57:0;;-1:-1:-1;47310:57:0;;-1:-1:-1;;;;;;47399:13:0;::::1;::::0;::::1;::::0;7493:18:1;;47399:16:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47445;::::0;-1:-1:-1;;;47445:16:0;;47459:1:::1;47445:16;::::0;::::1;7520:36:1::0;47380:35:0;;-1:-1:-1;47427:14:0::1;::::0;-1:-1:-1;;;;;47445:13:0;::::1;::::0;::::1;::::0;7493:18:1;;47445:16:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47426:35:::0;-1:-1:-1;47475:65:0::1;-1:-1:-1::0;;;;;47475:22:0;::::1;47498:10;47518:4;47525:14:::0;47475:22:::1;:65::i;:::-;47551:30;::::0;-1:-1:-1;;;47551:30:0;;::::1;::::0;::::1;14804:25:1::0;;;-1:-1:-1;;;;;47551:14:0;::::1;::::0;::::1;::::0;14777:18:1;;47551:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;47592:56;47617:5;-1:-1:-1::0;;;;;47617:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47642:4;47592:16;:56::i;:::-;47661:44;47683:6;47699:4;47661:21;:44::i;:::-;47776:39;::::0;-1:-1:-1;;;47776:39:0;;47809:4:::1;47776:39;::::0;::::1;5286:51:1::0;-1:-1:-1;;;;;47716:19:0;;::::1;::::0;::::1;::::0;47748:1:::1;::::0;47762::::1;::::0;47776:24;::::1;::::0;::::1;::::0;5259:18:1;;47776:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47716:169;::::0;-1:-1:-1;;;;;;47716:169:0::1;::::0;;;;;;8226:4:1;8214:17;;;47716:169:0::1;::::0;::::1;8196:36:1::0;8268:17;;;;8248:18;;;8241:45;8302:18;;;8295:34;8345:18;;;8338:34;;;47859:15:0::1;8388:19:1::0;;;8381:35;8168:19;;47716:169:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;;47901:14:0;::::1;37480:42;47901:14;47898:953;;;47953:16;::::0;;47967:1:::1;47953:16:::0;;;;;::::1;::::0;;47929:21:::1;::::0;47953:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;47953:16:0::1;47929:40;;47992:6;47982:4;47987:1;47982:7;;;;;;-1:-1:-1::0;;;47982:7:0::1;;;;;;;;;;;;;;:16;-1:-1:-1::0;;;;;47982:16:0::1;;;-1:-1:-1::0;;;;;47982:16:0::1;;;::::0;::::1;48021:6;48011:4;48016:1;48011:7;;;;;;-1:-1:-1::0;;;48011:7:0::1;;;;;;;;;;;;;;:16;-1:-1:-1::0;;;;;48011:16:0::1;;;-1:-1:-1::0;;;;;48011:16:0::1;;;::::0;::::1;48042:19;48056:4;48042:13;:19::i;:::-;47898:953;;;;48117:16;::::0;;48131:1:::1;48117:16:::0;;;;;::::1;::::0;;48093:21:::1;::::0;48117:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;48117:16:0::1;48093:40;;48156:6;48146:4;48151:1;48146:7;;;;;;-1:-1:-1::0;;;48146:7:0::1;;;;;;;;;;;;;;:16;-1:-1:-1::0;;;;;48146:16:0::1;;;-1:-1:-1::0;;;;;48146:16:0::1;;;::::0;::::1;37480:42;48175:4;48180:1;48175:7;;;;;;-1:-1:-1::0;;;48175:7:0::1;;;;;;;;;;;;;;:14;-1:-1:-1::0;;;;;48175:14:0::1;;;-1:-1:-1::0;;;;;48175:14:0::1;;;::::0;::::1;48210:47;48232:4;48237:1;48232:7;;;;;;-1:-1:-1::0;;;48232:7:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;48249:6:::1;::::0;-1:-1:-1;;;;;48249:6:0::1;48210:21;:47::i;:::-;48270:48;48321:352;;;;;;;;48380:4;48385:1;48380:7;;;;;;-1:-1:-1::0;;;48380:7:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;48321:352:0::1;;;;;48412:4;48417:1;48412:7;;;;;;-1:-1:-1::0;;;48412:7:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;48321:352:0::1;;;;;37842:4;48321:352;;;;;;48480:4;-1:-1:-1::0;;;;;48321:352:0::1;;;;;48510:15;48321:352;;;;48557:4;48562:1;48557:7;;;;;;-1:-1:-1::0;;;48557:7:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;48550:40:::1;::::0;-1:-1:-1;;;48550:40:0;;48584:4:::1;48550:40;::::0;::::1;5286:51:1::0;-1:-1:-1;;;;;48550:25:0;;::::1;::::0;::::1;::::0;5259:18:1;;48550:40:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48321:352:::0;;48623:1:::1;48321:352;::::0;::::1;::::0;;;;;;;;;;48772:6;48752:53;;-1:-1:-1;;;48752:53:0;;48270:403;;-1:-1:-1;;;;;;48772:6:0::1;::::0;48752:45:::1;::::0;:53:::1;::::0;48270:403;;48752:53:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;48820:19;48834:4;48820:13;:19::i;:::-;47898:953;;;38445:1;;;;47152:1714:::0;;;;:::o;50861:1395::-;50967:20;50989:21;51012:20;51045:12;51059:13;51076:25;51090:10;51076:13;:25::i;:::-;51130:16;;-1:-1:-1;;;51130:16:0;;51114:13;51130:16;;;7520:36:1;;;51044:57:0;;-1:-1:-1;51044:57:0;;-1:-1:-1;;;;;;51130:27:0;;;;:13;;;;;;7493:18:1;;51130:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;51130:27:0;;51114:43;;51176:8;:39;;;-1:-1:-1;51188:16:0;;-1:-1:-1;;;51188:16:0;;51202:1;51188:16;;;7520:36:1;-1:-1:-1;;;;;51188:27:0;;;;:13;;;;;;7493:18:1;;51188:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;51188:27:0;;51176:39;51168:93;;;;-1:-1:-1;;;51168:93:0;;;;;;;:::i;:::-;51295:23;;-1:-1:-1;;;51295:23:0;;51275:16;51295:23;;;7520:36:1;;;51275:16:0;-1:-1:-1;;;;;51295:20:0;;;;;7493:18:1;;51295:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51350;;-1:-1:-1;;;51350:23:0;;51371:1;51350:23;;;7520:36:1;51274:44:0;;-1:-1:-1;51330:16:0;;-1:-1:-1;;;;;51350:20:0;;;;;7493:18:1;;51350:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51329:44;;51389:8;51386:771;;;51426:8;51414;:20;51411:353;;51470:42;;-1:-1:-1;;;51470:42:0;;51450:17;51470:42;;;7781:36:1;;;51492:1:0;7833:18:1;;;7826:45;7887:18;;;7880:34;;;51450:17:0;-1:-1:-1;;;;;51470:18:0;;;;;7754::1;;51470:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51579:16;;;51593:1;51579:16;;;51530:24;51579:16;;;;;51450:62;;-1:-1:-1;51579:16:0;;;;;;;;;;;;-1:-1:-1;51579:16:0;51569:26;;51623:1;51610:7;51618:1;51610:10;;;;;;-1:-1:-1;;;51610:10:0;;;;;;;;;;;;;;:14;;;;;51652:9;51639:7;51647:1;51639:10;;;;;;-1:-1:-1;;;51639:10:0;;;;;;;;;;;;;;;;;;:22;51694:55;;-1:-1:-1;;;51694:55:0;;-1:-1:-1;;;;;51694:25:0;;;;;:55;;51728:4;;51735:7;;51744:4;;51694:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51678:71;;51411:353;;;51386:771;;;51808:8;51796;:20;51793:353;;51852:42;;-1:-1:-1;;;51852:42:0;;51871:1;51852:42;;;7781:36:1;51832:17:0;7833:18:1;;;7826:45;;;7887:18;;;7880:34;;;51832:17:0;-1:-1:-1;;;;;51852:18:0;;;;;7754::1;;51852:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51961:16;;;51975:1;51961:16;;;51912:24;51961:16;;;;;51832:62;;-1:-1:-1;51961:16:0;;;;;;;;;;;;-1:-1:-1;51961:16:0;51951:26;;52005:1;51992:7;52000:1;51992:10;;;;;;-1:-1:-1;;;51992:10:0;;;;;;;;;;;;;;:14;;;;;52034:9;52021:7;52029:1;52021:10;;;;;;-1:-1:-1;;;52021:10:0;;;;;;;;;;;;;;;;;;:22;52076:55;;-1:-1:-1;;;52076:55:0;;-1:-1:-1;;;;;52076:25:0;;;;;:55;;52110:4;;52117:7;;52126:4;;52076:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52060:71;;51793:353;;;52192:16;52177:31;;52235:5;-1:-1:-1;;;;;52235:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52220:28;;50861:1395;;;;;;;;;;;;:::o;41517:1572::-;-1:-1:-1;;;;;38381:24:0;;;;;;:17;:24;;;;;;41645:5;;38381:24;;38373:61;;;;-1:-1:-1;;;38373:61:0;;;;;;;:::i;:::-;37736:4:::1;41670:13;:30;;41662:69;;;::::0;-1:-1:-1;;;41662:69:0;;10076:2:1;41662:69:0::1;::::0;::::1;10058:21:1::0;10115:2;10095:18;;;10088:30;10154:28;10134:18;;;10127:56;10200:18;;41662:69:0::1;10048:176:1::0;41662:69:0::1;41750:52;::::0;-1:-1:-1;;;41750:52:0;;41776:10:::1;41750:52;::::0;::::1;5560:34:1::0;41796:4:0::1;5610:18:1::0;;;5603:43;41806:13:0;;-1:-1:-1;;;;;41750:25:0;::::1;::::0;::::1;::::0;5495:18:1;;41750:52:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:69;;41742:109;;;::::0;-1:-1:-1;;;41742:109:0;;12265:2:1;41742:109:0::1;::::0;::::1;12247:21:1::0;12304:2;12284:18;;;12277:30;12343:29;12323:18;;;12316:57;12390:18;;41742:109:0::1;12237:177:1::0;41742:109:0::1;41892:124;-1:-1:-1::0;;;;;41892:32:0;::::1;41939:10;41972:4;41992:13:::0;41892:32:::1;:124::i;:::-;42032:13;42049:20;42063:5;42049:13;:20::i;:::-;42105:16;::::0;-1:-1:-1;;;42105:16:0;;42081:20:::1;42105:16;::::0;::::1;7520:36:1::0;;;42029:40:0;;-1:-1:-1;42081:20:0;;-1:-1:-1;;;;;;42105:13:0;::::1;::::0;::::1;::::0;7493:18:1;;42105:16:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42080:41;;42153:7;-1:-1:-1::0;;;;;42137:23:0::1;:12;-1:-1:-1::0;;;;;42137:23:0::1;;42134:938;;42200:16;::::0;;42214:1:::1;42200:16:::0;;;;;::::1;::::0;;42176:21:::1;::::0;42200:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;42200:16:0::1;42176:40;;42241:7;42231:4;42236:1;42231:7;;;;;;-1:-1:-1::0;;;42231:7:0::1;;;;;;;;;;;;;;:17;-1:-1:-1::0;;;;;42231:17:0::1;;;-1:-1:-1::0;;;;;42231:17:0::1;;;::::0;::::1;42273:12;42263:4;42268:1;42263:7;;;;;;-1:-1:-1::0;;;42263:7:0::1;;;;;;;;;;;;;;:22;-1:-1:-1::0;;;;;42263:22:0::1;;;-1:-1:-1::0;;;;;42263:22:0::1;;;::::0;::::1;42302:47;42324:4;42329:1;42324:7;;;;;;-1:-1:-1::0;;;42324:7:0::1;;;;;;;;42302:47;42364:48;42415:359;;;;;;;;42478:4;42483:1;42478:7;;;;;;-1:-1:-1::0;;;42478:7:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;42415:359:0::1;;;;;42514:4;42519:1;42514:7;;;;;;-1:-1:-1::0;;;42514:7:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;42415:359:0::1;;;;;37842:4;42415:359;;;;;;42590:4;-1:-1:-1::0;;;;;42415:359:0::1;;;;;42624:15;42415:359;;;;42668:13;42415:359;;;;42718:1;42415:359;;;;42757:1;-1:-1:-1::0;;;;;42415:359:0::1;;;::::0;42364:410:::1;;42877:6;::::0;::::1;;;;;;-1:-1:-1::0;;;;;42877:6:0::1;-1:-1:-1::0;;;;;42857:45:0::1;;42903:6;42857:53;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;42925;42939:5;42946:17;42965:12;42925:13;:53::i;:::-;42134:938;;;;;43012:48;43026:5;43033:17;43052:7;43012:13;:48::i;:::-;38445:1;;41517:1572:::0;;;;;:::o;38877:121::-;38576:10;;-1:-1:-1;;;;;38576:10:0;38562;:24;38554:65;;;;-1:-1:-1;;;38554:65:0;;10431:2:1;38554:65:0;;;10413:21:1;10470:2;10450:18;;;10443:30;10509;10489:18;;;10482:58;10557:18;;38554:65:0;10403:178:1;38554:65:0;-1:-1:-1;;;;;38957:25:0::1;38985:5;38957:25:::0;;;:17:::1;:25;::::0;;;;:33;;-1:-1:-1;;38957:33:0::1;::::0;;38877:121::o;39815:1633::-;-1:-1:-1;;;;;38381:24:0;;;;;;:17;:24;;;;;;39931:5;;38381:24;;38373:61;;;;-1:-1:-1;;;38373:61:0;;;;;;;:::i;:::-;37736:4:::1;39956:9;:26;;39948:65;;;::::0;-1:-1:-1;;;39948:65:0;;10076:2:1;39948:65:0::1;::::0;::::1;10058:21:1::0;10115:2;10095:18;;;10088:30;10154:28;10134:18;;;10127:56;10200:18;;39948:65:0::1;10048:176:1::0;39948:65:0::1;37480:42;-1:-1:-1::0;;;;;40026:18:0::1;;40052:9;40026:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;;;;;;;40151:15:0;::::1;37480:42;40151:15;::::0;-1:-1:-1;40147:1294:0::1;;40200:37;::::0;-1:-1:-1;;;40200:37:0;;40231:4:::1;40200:37;::::0;::::1;5286:51:1::0;40182:15:0::1;::::0;37480:42:::1;::::0;40200:22:::1;::::0;5259:18:1;;40200:37:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40182:55;;40257:13;40274:20;40288:5;40274:13;:20::i;:::-;40330:16;::::0;-1:-1:-1;;;40330:16:0;;40312:14:::1;40330:16;::::0;::::1;7520:36:1::0;;;40254:40:0;;-1:-1:-1;40312:14:0;;-1:-1:-1;;;;;;40330:13:0;::::1;::::0;::::1;::::0;7493:18:1;;40330:16:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40380;::::0;-1:-1:-1;;;40380:16:0;;40394:1:::1;40380:16;::::0;::::1;7520:36:1::0;40311:35:0;;-1:-1:-1;40362:14:0::1;::::0;-1:-1:-1;;;;;40380:13:0;::::1;::::0;::::1;::::0;7493:18:1;;40380:16:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40361:35:::0;-1:-1:-1;;;;;;40430:17:0;;::::1;::::0;;::::1;;::::0;;40470:29:::1;;;40492:7;-1:-1:-1::0;;;;;40482:17:0::1;:6;-1:-1:-1::0;;;;;40482:17:0::1;;40470:29;40462:83;;;;-1:-1:-1::0;;;40462:83:0::1;;;;;;;:::i;:::-;40586:16;::::0;;40600:1:::1;40586:16:::0;;;;;::::1;::::0;;40562:21:::1;::::0;40586:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;40586:16:0::1;40562:40;;37480:42;40617:4;40622:1;40617:7;;;;;;-1:-1:-1::0;;;40617:7:0::1;;;;;;;;;;;;;;:14;-1:-1:-1::0;;;;;40617:14:0::1;;;-1:-1:-1::0;;;;;40617:14:0::1;;;::::0;::::1;40656:7;40646:4;40651:1;40646:7;;;;;;-1:-1:-1::0;;;40646:7:0::1;;;;;;;;;;;;;;:17;-1:-1:-1::0;;;;;40646:17:0::1;;;-1:-1:-1::0;;;;;40646:17:0::1;;;::::0;::::1;40687:47;40709:4;40714:1;40709:7;;;;;;-1:-1:-1::0;;;40709:7:0::1;;;;;;;;40687:47;40749:48;40800:337;;;;;;;;40861:4;40866:1;40861:7;;;;;;-1:-1:-1::0;;;40861:7:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;40800:337:0::1;;;;;40895:4;40900:1;40895:7;;;;;;-1:-1:-1::0;;;40895:7:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;40800:337:0::1;;;;;37842:4;40800:337;;;;;;40967:4;-1:-1:-1::0;;;;;40800:337:0::1;;;;;40999:15;40800:337;;;;41041:7;40800:337;;;;41083:1;40800:337;;;;41120:1;-1:-1:-1::0;;;;;40800:337:0::1;;;::::0;40749:388:::1;;41240:6;::::0;::::1;;;;;;-1:-1:-1::0;;;;;41240:6:0::1;-1:-1:-1::0;;;;;41220:45:0::1;;41266:6;41220:53;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41302:48;41316:5;41323:17;41342:7;41302:13;:48::i;:::-;40147:1294;;;;;;;;;;41381:48;41395:5;41402:17;41421:7;41381:13;:48::i;:::-;39815:1633:::0;;;;:::o;48874:1979::-;-1:-1:-1;;;;;38381:24:0;;;;;;:17;:24;;;;;;48999:10;;38381:24;;38373:61;;;;-1:-1:-1;;;38373:61:0;;;;;;;:::i;:::-;49022:12:::1;49036:13:::0;49053:25:::1;49067:10;49053:13;:25::i;:::-;49110:16;::::0;-1:-1:-1;;;49110:16:0;;49092:14:::1;49110:16;::::0;::::1;7520:36:1::0;;;49021:57:0;;-1:-1:-1;49021:57:0;;-1:-1:-1;;;;;;49110:13:0;::::1;::::0;::::1;::::0;7493:18:1;;49110:16:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49156;::::0;-1:-1:-1;;;49156:16:0;;49170:1:::1;49156:16;::::0;::::1;7520:36:1::0;49091:35:0;;-1:-1:-1;49138:14:0::1;::::0;-1:-1:-1;;;;;49156:13:0;::::1;::::0;::::1;::::0;7493:18:1;;49156:16:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49137:35:::0;-1:-1:-1;;;;;;49202:17:0;;::::1;::::0;;::::1;;::::0;;49238:29:::1;;;49260:7;-1:-1:-1::0;;;;;49250:17:0::1;:6;-1:-1:-1::0;;;;;49250:17:0::1;;49238:29;49230:83;;;;-1:-1:-1::0;;;49230:83:0::1;;;;;;;:::i;:::-;49353:33;::::0;-1:-1:-1;;;49353:33:0;;49327:22:::1;49353:33;::::0;::::1;7520:36:1::0;;;49327:22:0;-1:-1:-1;;;;;49353:30:0;::::1;::::0;::::1;::::0;7493:18:1;;49353:33:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49424;::::0;-1:-1:-1;;;49424:33:0;;49455:1:::1;49424:33;::::0;::::1;7520:36:1::0;49326:60:0;;-1:-1:-1;49398:22:0::1;::::0;-1:-1:-1;;;;;49424:30:0;::::1;::::0;::::1;::::0;7493:18:1;;49424:33:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49397:60;;49490:14;49473;:31;49470:368;;;49543:40;::::0;-1:-1:-1;;;49543:40:0;;49577:4:::1;49543:40;::::0;::::1;5286:51:1::0;49518:22:0::1;::::0;-1:-1:-1;;;;;49543:25:0;::::1;::::0;::::1;::::0;5259:18:1;;49543:40:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49518:65;;49596:44;49618:6;49634:4;49596:21;:44::i;:::-;49656:169;::::0;-1:-1:-1;;;49656:169:0;;49692:1:::1;49656:169;::::0;::::1;8196:36:1::0;49711:1:0::1;8248:18:1::0;;;8241:45;8302:18;;;8295:34;;;8345:18;;;8338:34;;;49797:15:0::1;8388:19:1::0;;;8381:35;-1:-1:-1;;;;;49656:19:0;::::1;::::0;::::1;::::0;8168::1;;49656:169:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;49470:368;;49916:39;::::0;-1:-1:-1;;;49916:39:0;;49949:4:::1;49916:39;::::0;::::1;5286:51:1::0;49898:15:0::1;::::0;-1:-1:-1;;;;;49916:24:0;::::1;::::0;::::1;::::0;5259:18:1;;49916:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49984;::::0;-1:-1:-1;;;49984:39:0;;50017:4:::1;49984:39;::::0;::::1;5286:51:1::0;49898:57:0;;-1:-1:-1;49966:15:0::1;::::0;-1:-1:-1;;;;;49984:24:0;::::1;::::0;::::1;::::0;5259:18:1;;49984:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50081:16;::::0;;50095:1:::1;50081:16:::0;;;50036:24:::1;50081:16:::0;;::::1;::::0;;49966:57;;-1:-1:-1;50081:16:0;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;50081:16:0::1;50071:26;;50121:7;50108;50116:1;50108:10;;;;;;-1:-1:-1::0;;;50108:10:0::1;;;;;;;;;;;;;;:20;;;::::0;::::1;50152:7;50139;50147:1;50139:10;;;;;;-1:-1:-1::0;;;50139:10:0::1;;;;;;;;;;;;;;:20;;;::::0;::::1;50180:44;50202:6;50218:4;50180:21;:44::i;:::-;50235;50257:6;50273:4;50235:21;:44::i;:::-;50318:108;::::0;-1:-1:-1;;;50318:108:0;;50292:23:::1;::::0;-1:-1:-1;;;;;50318:27:0;::::1;::::0;::::1;::::0;:108:::1;::::0;50360:7;;50292:23;;50400:15:::1;::::0;50318:108:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50292:134;;50439:61;50469:5;-1:-1:-1::0;;;;;50469:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50493:5;50439:21;:61::i;:::-;50511:30;::::0;-1:-1:-1;;;50511:30:0;;::::1;::::0;::::1;14804:25:1::0;;;-1:-1:-1;;;;;50511:13:0;::::1;::::0;::::1;::::0;14777:18:1;;50511:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;50675:30:0::1;::::0;-1:-1:-1;;;50675:30:0;;50699:4:::1;50675:30;::::0;::::1;5286:51:1::0;50644:62:0::1;::::0;-1:-1:-1;50663:10:0::1;::::0;-1:-1:-1;;;;;;50675:15:0;::::1;::::0;::::1;::::0;5259:18:1;;50675:30:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;50644:18:0;::::1;::::0;:62;:18:::1;:62::i;:::-;50743:16;::::0;;50757:1:::1;50743:16:::0;;;;;::::1;::::0;;50719:21:::1;::::0;50743:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;50743:16:0::1;50719:40;;50780:6;50770:4;50775:1;50770:7;;;;;;-1:-1:-1::0;;;50770:7:0::1;;;;;;;;;;;;;;:16;-1:-1:-1::0;;;;;50770:16:0::1;;;-1:-1:-1::0;;;;;50770:16:0::1;;;::::0;::::1;50807:6;50797:4;50802:1;50797:7;;;;;;-1:-1:-1::0;;;50797:7:0::1;;;;;;;;;;;;;;:16;-1:-1:-1::0;;;;;50797:16:0::1;;;-1:-1:-1::0;;;;;50797:16:0::1;;;::::0;::::1;50826:19;50840:4;50826:13;:19::i;:::-;38445:1;;;;;;;;;;;;48874:1979:::0;;;;:::o;44277:546::-;-1:-1:-1;;;;;38381:24:0;;;;;;:17;:24;;;;;;44368:10;;38381:24;;38373:61;;;;-1:-1:-1;;;38373:61:0;;;;;;;:::i;:::-;44391:12:::1;44405:13:::0;44422:25:::1;44436:10;44422:13;:25::i;:::-;44390:57:::0;;-1:-1:-1;44390:57:0;-1:-1:-1;44460:78:0::1;-1:-1:-1::0;;;;;44460:35:0;::::1;44496:10;44516:4;44523:14:::0;44460:35:::1;:78::i;:::-;44549:30;::::0;-1:-1:-1;;;44549:30:0;;::::1;::::0;::::1;14804:25:1::0;;;-1:-1:-1;;;;;44549:14:0;::::1;::::0;::::1;::::0;14777:18:1;;44549:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;44592:56;44617:5;-1:-1:-1::0;;;;;44617:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44642:4;44592:16;:56::i;:::-;44687:16;::::0;;44701:1:::1;44687:16:::0;;;;;::::1;::::0;;44661:23:::1;::::0;44687:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;;44726:16:0::1;::::0;-1:-1:-1;;;44726:16:0;;44740:1:::1;44726:16;::::0;::::1;7520:36:1::0;44661:42:0;;-1:-1:-1;;;;;;44726:13:0;::::1;::::0;::::1;::::0;7493:18:1;;44726:16:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44714:6;44721:1;44714:9;;;;;;-1:-1:-1::0;;;44714:9:0::1;;;;;;;;;-1:-1:-1::0;;;;;44714:28:0;;::::1;:9;::::0;;::::1;::::0;;;;;:28;44765:16:::1;::::0;-1:-1:-1;;;44765:16:0;;44779:1:::1;44765:16;::::0;::::1;7520:36:1::0;44765:13:0;;::::1;::::0;::::1;::::0;7493:18:1;;44765:16:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44753:6;44760:1;44753:9;;;;;;-1:-1:-1::0;;;44753:9:0::1;;;;;;;;;;;;;;:28;-1:-1:-1::0;;;;;44753:28:0::1;;;-1:-1:-1::0;;;;;44753:28:0::1;;;::::0;::::1;44794:21;44808:6;44794:13;:21::i;:::-;38445:1;;;44277:546:::0;;;:::o;38700:115::-;38576:10;;-1:-1:-1;;;;;38576:10:0;38562;:24;38554:65;;;;-1:-1:-1;;;38554:65:0;;10431:2:1;38554:65:0;;;10413:21:1;10470:2;10450:18;;;10443:30;10509;10489:18;;;10482:58;10557:18;;38554:65:0;10403:178:1;38554:65:0;-1:-1:-1;;;;;38775:25:0::1;;::::0;;;:17:::1;:25;::::0;;;;:32;;-1:-1:-1;;38775:32:0::1;38803:4;38775:32;::::0;;38700:115::o;45243:1901::-;-1:-1:-1;;;;;38381:24:0;;;;;;:17;:24;;;;;;45398:10;;38381:24;;38373:61;;;;-1:-1:-1;;;38373:61:0;;;;;;;:::i;:::-;45421:12:::1;45435:13:::0;45452:25:::1;45466:10;45452:13;:25::i;:::-;45507:16;::::0;-1:-1:-1;;;45507:16:0;;45489:14:::1;45507:16;::::0;::::1;7520:36:1::0;;;45420:57:0;;-1:-1:-1;45420:57:0;;-1:-1:-1;;;;;;45507:13:0;::::1;::::0;::::1;::::0;7493:18:1;;45507:16:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45553;::::0;-1:-1:-1;;;45553:16:0;;45567:1:::1;45553:16;::::0;::::1;7520:36:1::0;45488:35:0;;-1:-1:-1;45535:14:0::1;::::0;-1:-1:-1;;;;;45553:13:0;::::1;::::0;::::1;::::0;7493:18:1;;45553:16:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45534:35:::0;-1:-1:-1;45583:65:0::1;-1:-1:-1::0;;;;;45583:22:0;::::1;45606:10;45626:4;45633:14:::0;45583:22:::1;:65::i;:::-;45659:30;::::0;-1:-1:-1;;;45659:30:0;;::::1;::::0;::::1;14804:25:1::0;;;-1:-1:-1;;;;;45659:14:0;::::1;::::0;::::1;::::0;14777:18:1;;45659:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;45700:56;45725:5;-1:-1:-1::0;;;;;45725:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;45700:56;45769:44;45791:6;45807:4;45769:21;:44::i;:::-;45884:39;::::0;-1:-1:-1;;;45884:39:0;;45917:4:::1;45884:39;::::0;::::1;5286:51:1::0;-1:-1:-1;;;;;45824:19:0;;::::1;::::0;::::1;::::0;45856:1:::1;::::0;45870::::1;::::0;45884:24;::::1;::::0;::::1;::::0;5259:18:1;;45884:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45824:169;::::0;-1:-1:-1;;;;;;45824:169:0::1;::::0;;;;;;8226:4:1;8214:17;;;45824:169:0::1;::::0;::::1;8196:36:1::0;8268:17;;;;8248:18;;;8241:45;8302:18;;;8295:34;8345:18;;;8338:34;;;45967:15:0::1;8388:19:1::0;;;8381:35;8168:19;;45824:169:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;46025:6;-1:-1:-1::0;;;;;46009:22:0::1;:12;-1:-1:-1::0;;;;;46009:22:0::1;;46006:1121;;;46069:16;::::0;;46083:1:::1;46069:16:::0;;;;;::::1;::::0;;46045:21:::1;::::0;46069:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;46069:16:0::1;46045:40;;46108:6;46098:4;46103:1;46098:7;;;;;;-1:-1:-1::0;;;46098:7:0::1;;;;;;;;;;;;;;:16;-1:-1:-1::0;;;;;46098:16:0::1;;;-1:-1:-1::0;;;;;46098:16:0::1;;;::::0;::::1;46137:6;46127:4;46132:1;46127:7;;;;;;-1:-1:-1::0;;;46127:7:0::1;;;;;;;;;;;;;;:16;-1:-1:-1::0;;;;;46127:16:0::1;;;-1:-1:-1::0;;;;;46127:16:0::1;;;::::0;::::1;46158:19;46172:4;46158:13;:19::i;:::-;46006:1121;;;;46231:16;::::0;;46245:1:::1;46231:16:::0;;;;;::::1;::::0;;46207:21:::1;::::0;46231:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;46231:16:0::1;46207:40;;46270:6;46260:4;46265:1;46260:7;;;;;;-1:-1:-1::0;;;46260:7:0::1;;;;;;;;;;;;;;:16;-1:-1:-1::0;;;;;46260:16:0::1;;;-1:-1:-1::0;;;;;46260:16:0::1;;;::::0;::::1;46299:12;46289:4;46294:1;46289:7;;;;;;-1:-1:-1::0;;;46289:7:0::1;;;;;;;;;;;;;;:22;-1:-1:-1::0;;;;;46289:22:0::1;;;-1:-1:-1::0;;;;;46289:22:0::1;;;::::0;::::1;46332:47;46354:4;46359:1;46354:7;;;;;;-1:-1:-1::0;;;46354:7:0::1;;;;;;;;46332:47;46392:48;46443:352;;;;;;;;46502:4;46507:1;46502:7;;;;;;-1:-1:-1::0;;;46502:7:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;46443:352:0::1;;;;;46534:4;46539:1;46534:7;;;;;;-1:-1:-1::0;;;46534:7:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;46443:352:0::1;;;;;37842:4;46443:352;;;;;;46602:4;-1:-1:-1::0;;;;;46443:352:0::1;;;;;46632:15;46443:352;;;;46679:4;46684:1;46679:7;;;;;;-1:-1:-1::0;;;46679:7:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;46672:40:::1;::::0;-1:-1:-1;;;46672:40:0;;46706:4:::1;46672:40;::::0;::::1;5286:51:1::0;-1:-1:-1;;;;;46672:25:0;;::::1;::::0;::::1;::::0;5259:18:1;;46672:40:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46443:352:::0;;46745:1:::1;46443:352;::::0;::::1;::::0;;;;;;;;;;46894:6;46874:53;;-1:-1:-1;;;46874:53:0;;46392:403;;-1:-1:-1;;;;;;46894:6:0::1;::::0;46874:45:::1;::::0;:53:::1;::::0;46392:403;;46874:53:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;46967:16:0::1;::::0;;46981:1:::1;46967:16:::0;;;;;::::1;::::0;;;46942:22:::1;::::0;46967:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;46967:16:0::1;46942:41;;47007:6;46996:5;47002:1;46996:8;;;;;;-1:-1:-1::0;;;46996:8:0::1;;;;;;;;;;;;;;:17;-1:-1:-1::0;;;;;46996:17:0::1;;;-1:-1:-1::0;;;;;46996:17:0::1;;;::::0;::::1;47037:6;47026:5;47032:1;47026:8;;;;;;-1:-1:-1::0;;;47026:8:0::1;;;;;;;;;;;;;;:17;-1:-1:-1::0;;;;;47026:17:0::1;;;-1:-1:-1::0;;;;;47026:17:0::1;;;::::0;::::1;47068:12;47057:5;47063:1;47057:8;;;;;;-1:-1:-1::0;;;47057:8:0::1;;;;;;;;;;;;;;:23;-1:-1:-1::0;;;;;47057:23:0::1;;;-1:-1:-1::0;;;;;47057:23:0::1;;;::::0;::::1;47095:20;47109:5;47095:13;:20::i;:::-;46006:1121;;;;38445:1;;;;45243:1901:::0;;;;;:::o;43717:316::-;43783:12;43797:13;43837:10;43822:26;;43884:5;-1:-1:-1;;;;;43884:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;43875:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43859:47;;43969:1;-1:-1:-1;;;;;43927:44:0;43936:5;-1:-1:-1;;;;;43936:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;43927:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;43927:44:0;;;43919:106;;;;-1:-1:-1;;;43919:106:0;;10788:2:1;43919:106:0;;;10770:21:1;10827:2;10807:18;;;10800:30;10866:34;10846:18;;;10839:62;-1:-1:-1;;;10917:18:1;;;10910:47;10974:19;;43919:106:0;10760:239:1;43919:106:0;43717:316;;;:::o;27020:205::-;27148:68;;-1:-1:-1;;;;;5915:15:1;;;27148:68:0;;;5897:34:1;5967:15;;5947:18;;;5940:43;5999:18;;;5992:34;;;27121:96:0;;27141:5;;-1:-1:-1;;;27171:27:0;5832:18:1;;27148:68:0;;;;-1:-1:-1;;27148:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;27148:68:0;-1:-1:-1;;;;;;27148:68:0;;;;;;;;;;27121:19;:96::i;43348:361::-;43424:43;43446:5;43461:4;43424:21;:43::i;:::-;43525:16;;;43539:1;43525:16;;;43480:24;43525:16;;;;;43480:24;43525:16;;;;;;;;;;-1:-1:-1;43525:16:0;43515:26;;43565:1;43552:7;43560:1;43552:10;;;;;;-1:-1:-1;;;43552:10:0;;;;;;;;;;;;;;:14;;;;;43590:1;43577:7;43585:1;43577:10;;;;;;-1:-1:-1;;;43577:10:0;;;;;;;;;;;;;;;;;;:14;43633:38;;-1:-1:-1;;;43633:38:0;;43665:4;43633:38;;;5286:51:1;-1:-1:-1;;;;;43602:30:0;;;;;;43633:23;;;;;5259:18:1;;43633:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43673:7;43682:15;43602:96;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43602:96:0;;;;;;;;;;;;:::i;44041:228::-;44128:47;;-1:-1:-1;;;44128:47:0;;44160:4;44128:47;;;5560:34:1;-1:-1:-1;;;;;5630:15:1;;;5610:18;;;5603:43;44128:23:0;;;;;5495:18:1;;44128:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44124:138;;44197:53;-1:-1:-1;;;;;44197:25:0;;44223:7;-1:-1:-1;;44197:25:0;:53::i;:::-;44041:228;;:::o;39026:676::-;39094:15;39125:9;39120:575;39140:6;:13;39136:1;:17;39120:575;;;39192:6;39199:1;39192:9;;;;;;-1:-1:-1;;;39192:9:0;;;;;;;;;;;;;;;;;;;39185:42;;-1:-1:-1;;;39185:42:0;;39221:4;39185:42;;;5286:51:1;-1:-1:-1;;;;;39185:27:0;;;;;;5259:18:1;;39185:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39175:52;-1:-1:-1;39246:11:0;;39242:442;;37480:42;-1:-1:-1;;;;;39282:17:0;:6;39289:1;39282:9;;;;;;-1:-1:-1;;;39282:9:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;39282:17:0;;39278:391;;;39324:28;;-1:-1:-1;;;39324:28:0;;;;;14804:25:1;;;37480:42:0;;39324:19;;14777:18:1;;39324:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39452:12:0;;;39376;39452;;;;;;;;;;39376;-1:-1:-1;39394:10:0;;-1:-1:-1;39417:7:0;;39394:93;;39452:12;39394:93;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39375:112;;;39518:7;39510:39;;;;-1:-1:-1;;;39510:39:0;;11206:2:1;39510:39:0;;;11188:21:1;11245:2;11225:18;;;11218:30;-1:-1:-1;;;11264:18:1;;;11257:49;11323:18;;39510:39:0;11178:169:1;39510:39:0;39278:391;;;;39598:51;39629:10;39641:7;39605:6;39612:1;39605:9;;;;;;-1:-1:-1;;;39605:9:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;39598:30:0;;;:51;;;;;:::i;:::-;39155:3;;;;:::i;:::-;;;;39120:575;;;;39026:676;;:::o;26835:177::-;26945:58;;-1:-1:-1;;;;;6673:32:1;;26945:58:0;;;6655:51:1;6722:18;;;6715:34;;;26918:86:0;;26938:5;;-1:-1:-1;;;26968:23:0;6628:18:1;;26945:58:0;6610:145:1;29140:761:0;29564:23;29590:69;29618:4;29590:69;;;;;;;;;;;;;;;;;29598:5;-1:-1:-1;;;;;29590:27:0;;;:69;;;;;:::i;:::-;29674:17;;29564:95;;-1:-1:-1;29674:21:0;29670:224;;29816:10;29805:30;;;;;;;;;;;;:::i;:::-;29797:85;;;;-1:-1:-1;;;29797:85:0;;12621:2:1;29797:85:0;;;12603:21:1;12660:2;12640:18;;;12633:30;12699:34;12679:18;;;12672:62;-1:-1:-1;;;12750:18:1;;;12743:40;12800:19;;29797:85:0;12593:232:1;27494:622:0;27864:10;;;27863:62;;-1:-1:-1;27880:39:0;;-1:-1:-1;;;27880:39:0;;27904:4;27880:39;;;5560:34:1;-1:-1:-1;;;;;5630:15:1;;;5610:18;;;5603:43;27880:15:0;;;;;5495:18:1;;27880:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;27863:62;27855:152;;;;-1:-1:-1;;;27855:152:0;;13032:2:1;27855:152:0;;;13014:21:1;13071:2;13051:18;;;13044:30;13110:34;13090:18;;;13083:62;-1:-1:-1;;;13161:18:1;;;13154:52;13223:19;;27855:152:0;13004:244:1;27855:152:0;28045:62;;-1:-1:-1;;;;;6673:32:1;;28045:62:0;;;6655:51:1;6722:18;;;6715:34;;;28018:90:0;;28038:5;;-1:-1:-1;;;28068:22:0;6628:18:1;;28045:62:0;6610:145:1;12964:196:0;13067:12;13099:53;13122:6;13130:4;13136:1;13139:12;13099:22;:53::i;:::-;13092:60;12964:196;-1:-1:-1;;;;12964:196:0:o;14341:979::-;14471:12;10413:20;;14496:60;;;;-1:-1:-1;;;14496:60:0;;11554:2:1;14496:60:0;;;11536:21:1;11593:2;11573:18;;;11566:30;11632:31;11612:18;;;11605:59;11681:18;;14496:60:0;11526:179:1;14496:60:0;14630:12;14644:23;14671:6;-1:-1:-1;;;;;14671:11:0;14691:8;14702:4;14671:36;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14629:78;;;;14722:7;14718:595;;;14753:10;-1:-1:-1;14746:17:0;;-1:-1:-1;14746:17:0;14718:595;14867:17;;:21;14863:439;;15130:10;15124:17;15191:15;15178:10;15174:2;15170:19;15163:44;15078:148;15273:12;15266:20;;-1:-1:-1;;;15266:20:0;;;;;;;;:::i;14:257:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:31;235:5;210:31;:::i;:::-;260:5;84:187;-1:-1:-1;;;84:187:1:o;276:261::-;346:6;399:2;387:9;378:7;374:23;370:32;367:2;;;420:6;412;405:22;367:2;457:9;451:16;476:31;501:5;476:31;:::i;542:466::-;619:6;627;635;688:2;676:9;667:7;663:23;659:32;656:2;;;709:6;701;694:22;656:2;753:9;740:23;772:31;797:5;772:31;:::i;:::-;822:5;-1:-1:-1;879:2:1;864:18;;851:32;892:33;851:32;892:33;:::i;:::-;646:362;;944:7;;-1:-1:-1;;;998:2:1;983:18;;;;970:32;;646:362::o;1013:325::-;1081:6;1089;1142:2;1130:9;1121:7;1117:23;1113:32;1110:2;;;1163:6;1155;1148:22;1110:2;1207:9;1194:23;1226:31;1251:5;1226:31;:::i;:::-;1276:5;1328:2;1313:18;;;;1300:32;;-1:-1:-1;;;1100:238:1:o;1343:466::-;1420:6;1428;1436;1489:2;1477:9;1468:7;1464:23;1460:32;1457:2;;;1510:6;1502;1495:22;1457:2;1554:9;1541:23;1573:31;1598:5;1573:31;:::i;:::-;1623:5;-1:-1:-1;1675:2:1;1660:18;;1647:32;;-1:-1:-1;1731:2:1;1716:18;;1703:32;1744:33;1703:32;1744:33;:::i;:::-;1796:7;1786:17;;;1447:362;;;;;:::o;1814:535::-;1900:6;1908;1916;1924;1977:3;1965:9;1956:7;1952:23;1948:33;1945:2;;;1999:6;1991;1984:22;1945:2;2043:9;2030:23;2062:31;2087:5;2062:31;:::i;:::-;2112:5;-1:-1:-1;2164:2:1;2149:18;;2136:32;;-1:-1:-1;2220:2:1;2205:18;;2192:32;2233:33;2192:32;2233:33;:::i;:::-;1935:414;;;;-1:-1:-1;2285:7:1;;2339:2;2324:18;2311:32;;-1:-1:-1;;1935:414:1:o;2354:393::-;2431:6;2439;2447;2500:2;2488:9;2479:7;2475:23;2471:32;2468:2;;;2521:6;2513;2506:22;2468:2;2565:9;2552:23;2584:31;2609:5;2584:31;:::i;:::-;2634:5;2686:2;2671:18;;2658:32;;-1:-1:-1;2737:2:1;2722:18;;;2709:32;;2458:289;-1:-1:-1;;;2458:289:1:o;2752:1161::-;2847:6;2878:2;2921;2909:9;2900:7;2896:23;2892:32;2889:2;;;2942:6;2934;2927:22;2889:2;2980:9;2974:16;3009:18;3050:2;3042:6;3039:14;3036:2;;;3071:6;3063;3056:22;3036:2;3114:6;3103:9;3099:22;3089:32;;3159:7;3152:4;3148:2;3144:13;3140:27;3130:2;;3186:6;3178;3171:22;3130:2;3220;3214:9;3242:2;3238;3235:10;3232:2;;;3248:18;;:::i;:::-;3294:2;3291:1;3287:10;3326:2;3320:9;3389:2;3385:7;3380:2;3376;3372:11;3368:25;3360:6;3356:38;3444:6;3432:10;3429:22;3424:2;3412:10;3409:18;3406:46;3403:2;;;3455:18;;:::i;:::-;3491:2;3484:22;3541:18;;;3575:15;;;;-1:-1:-1;3610:11:1;;;3640;;;3636:20;;3633:33;-1:-1:-1;3630:2:1;;;3684:6;3676;3669:22;3630:2;3711:6;3702:15;;3726:156;3740:2;3737:1;3734:9;3726:156;;;3797:10;;3785:23;;3758:1;3751:9;;;;;3828:12;;;;3860;;3726:156;;;-1:-1:-1;3901:6:1;2858:1055;-1:-1:-1;;;;;;;;2858:1055:1:o;3918:297::-;3985:6;4038:2;4026:9;4017:7;4013:23;4009:32;4006:2;;;4059:6;4051;4044:22;4006:2;4096:9;4090:16;4149:5;4142:13;4135:21;4128:5;4125:32;4115:2;;4176:6;4168;4161:22;4220:194;4290:6;4343:2;4331:9;4322:7;4318:23;4314:32;4311:2;;;4364:6;4356;4349:22;4311:2;-1:-1:-1;4392:16:1;;4301:113;-1:-1:-1;4301:113:1:o;4419:437::-;4472:3;4510:5;4504:12;4537:6;4532:3;4525:19;4563:4;4592:2;4587:3;4583:12;4576:19;;4629:2;4622:5;4618:14;4650:3;4662:169;4676:6;4673:1;4670:13;4662:169;;;4737:13;;4725:26;;4771:12;;;;4806:15;;;;4698:1;4691:9;4662:169;;;-1:-1:-1;4847:3:1;;4480:376;-1:-1:-1;;;;;4480:376:1:o;4861:274::-;4990:3;5028:6;5022:13;5044:53;5090:6;5085:3;5078:4;5070:6;5066:17;5044:53;:::i;:::-;5113:16;;;;;4998:137;-1:-1:-1;;4998:137:1:o;6037:439::-;-1:-1:-1;;;;;6266:32:1;;6248:51;;6335:2;6330;6315:18;;6308:30;;;-1:-1:-1;;6355:56:1;;6392:18;;6384:6;6355:56;:::i;:::-;6347:64;;6461:6;6454:14;6447:22;6442:2;6431:9;6427:18;6420:50;6238:238;;;;;;:::o;6760:411::-;7003:2;6992:9;6985:21;6966:4;7023:56;7075:2;7064:9;7060:18;7052:6;7023:56;:::i;:::-;7110:2;7095:18;;7088:34;;;;-1:-1:-1;7153:2:1;7138:18;7131:34;7015:64;6975:196;-1:-1:-1;6975:196:1:o;9486:383::-;9635:2;9624:9;9617:21;9598:4;9667:6;9661:13;9710:6;9705:2;9694:9;9690:18;9683:34;9726:66;9785:6;9780:2;9769:9;9765:18;9760:2;9752:6;9748:15;9726:66;:::i;:::-;9853:2;9832:15;-1:-1:-1;;9828:29:1;9813:45;;;;9860:2;9809:54;;9607:262;-1:-1:-1;;9607:262:1:o;11710:348::-;11912:2;11894:21;;;11951:2;11931:18;;;11924:30;11990:26;11985:2;11970:18;;11963:54;12049:2;12034:18;;11884:174::o;13253:405::-;13455:2;13437:21;;;13494:2;13474:18;;;13467:30;13533:34;13528:2;13513:18;;13506:62;-1:-1:-1;;;13599:2:1;13584:18;;13577:39;13648:3;13633:19;;13427:231::o;13663:795::-;13950:13;;-1:-1:-1;;;;;13946:22:1;;;13928:41;;14029:4;14017:17;;;14011:24;14007:33;;13985:20;;;13978:63;14101:4;14089:17;;;14083:24;14109:8;14079:39;14057:20;;;14050:69;14179:4;14167:17;;;14161:24;14157:33;;14135:20;;;14128:63;14247:4;14235:17;;;14229:24;14207:20;;;14200:54;13908:3;14298:17;;;14292:24;14270:20;;;14263:54;14373:4;14361:17;;;14355:24;14333:20;;;14326:54;14440:4;14428:17;;;14422:24;14418:33;14396:20;;;14389:63;;;;13877:3;13862:19;;13844:614::o;14840:403::-;15075:6;15064:9;15057:25;15118:2;15113;15102:9;15098:18;15091:30;15038:4;15138:56;15190:2;15179:9;15175:18;15167:6;15138:56;:::i;:::-;15130:64;;15230:6;15225:2;15214:9;15210:18;15203:34;15047:196;;;;;;:::o;15598:258::-;15670:1;15680:113;15694:6;15691:1;15688:13;15680:113;;;15770:11;;;15764:18;15751:11;;;15744:39;15716:2;15709:10;15680:113;;;15811:6;15808:1;15805:13;15802:2;;;-1:-1:-1;;15846:1:1;15828:16;;15821:27;15651:205::o;15861:236::-;15900:3;-1:-1:-1;;15921:17:1;;15918:2;;;-1:-1:-1;;;15961:33:1;;16017:4;16014:1;16007:15;16047:4;15968:3;16035:17;15918:2;-1:-1:-1;16089:1:1;16078:13;;15908:189::o;16102:127::-;16163:10;16158:3;16154:20;16151:1;16144:31;16194:4;16191:1;16184:15;16218:4;16215:1;16208:15;16234:131;-1:-1:-1;;;;;16309:31:1;;16299:42;;16289:2;;16355:1;16352;16345:12;16289:2;16279:86;:::o

Metadata Hash

eaa5ae89987e47ae9803bed1d22201f36d2d3e2f0f1fbd174959cc5933329ce9
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.