Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 6,716 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim | 13455755 | 1227 days ago | IN | 0 ETH | 0.00489216 | ||||
Claim | 13455754 | 1227 days ago | IN | 0 ETH | 0.00984894 | ||||
Claim | 13257800 | 1258 days ago | IN | 0 ETH | 0.00366551 | ||||
Claim | 13257773 | 1258 days ago | IN | 0 ETH | 0.00181804 | ||||
Claim | 12830924 | 1324 days ago | IN | 0 ETH | 0.00117844 | ||||
Claim | 12787210 | 1331 days ago | IN | 0 ETH | 0.00178552 | ||||
Claim | 12767905 | 1334 days ago | IN | 0 ETH | 0.00089902 | ||||
Claim | 12754237 | 1336 days ago | IN | 0 ETH | 0.00089228 | ||||
Claim | 12728585 | 1340 days ago | IN | 0 ETH | 0.00062493 | ||||
Claim | 12727979 | 1340 days ago | IN | 0 ETH | 0.0007142 | ||||
Fill_pool | 12726818 | 1340 days ago | IN | 0 ETH | 0.00481722 | ||||
Claim | 12726566 | 1340 days ago | IN | 0 ETH | 0.00062493 | ||||
Claim | 12726556 | 1340 days ago | IN | 0 ETH | 0.00073652 | ||||
Claim | 12715791 | 1342 days ago | IN | 0 ETH | 0.00044638 | ||||
Claim | 12704415 | 1344 days ago | IN | 0 ETH | 0.0022319 | ||||
Claim | 12702141 | 1344 days ago | IN | 0 ETH | 0.00042921 | ||||
Claim | 12696153 | 1345 days ago | IN | 0 ETH | 0.00051198 | ||||
Swap | 12695691 | 1345 days ago | IN | 0 ETH | 0.00208738 | ||||
Fill_pool | 12695689 | 1345 days ago | IN | 0 ETH | 0.0050718 | ||||
Destruct | 12695441 | 1345 days ago | IN | 0 ETH | 0.00096123 | ||||
Destruct | 12695441 | 1345 days ago | IN | 0 ETH | 0.00117013 | ||||
Destruct | 12695439 | 1345 days ago | IN | 0 ETH | 0.00096123 | ||||
Destruct | 12695434 | 1345 days ago | IN | 0 ETH | 0.00114572 | ||||
Swap | 12695383 | 1345 days ago | IN | 0 ETH | 0.00138011 | ||||
Fill_pool | 12695373 | 1345 days ago | IN | 0 ETH | 0.00283036 |
Advanced mode: Intended for advanced users or developers and will display all Internal Transactions including zero value transfers. Name tag integration is not available in advanced view.
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
||||
---|---|---|---|---|---|---|---|
13455754 | 1227 days ago | 0 ETH | |||||
13455754 | 1227 days ago | 0 ETH | |||||
13257800 | 1258 days ago | 0 ETH | |||||
13257800 | 1258 days ago | 0 ETH | |||||
12830924 | 1324 days ago | 0 ETH | |||||
12830924 | 1324 days ago | 0 ETH | |||||
12787210 | 1331 days ago | 0 ETH | |||||
12787210 | 1331 days ago | 0 ETH | |||||
12767905 | 1334 days ago | 0 ETH | |||||
12767905 | 1334 days ago | 0 ETH | |||||
12767905 | 1334 days ago | 0 ETH | |||||
12767905 | 1334 days ago | 0 ETH | |||||
12754237 | 1336 days ago | 0 ETH | |||||
12754237 | 1336 days ago | 0 ETH | |||||
12728585 | 1340 days ago | 0 ETH | |||||
12728585 | 1340 days ago | 0 ETH | |||||
12727979 | 1340 days ago | 0 ETH | |||||
12727979 | 1340 days ago | 0 ETH | |||||
12726818 | 1340 days ago | 0 ETH | |||||
12726818 | 1340 days ago | 0 ETH | |||||
12726566 | 1340 days ago | 0 ETH | |||||
12726566 | 1340 days ago | 0 ETH | |||||
12726556 | 1340 days ago | 0 ETH | |||||
12726556 | 1340 days ago | 0 ETH | |||||
12715791 | 1342 days ago | 0 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
HappyTokenPool
Compiler Version
v0.8.1+commit.df193b15
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-05-28 */ // SPDX-License-Identifier: MIT /** * @author Yisi Liu * @contact [email protected] * @author_time 01/06/2021 * @maintainer Hancheng Zhou, Yisi Liu * @maintain_time 04/15/2021 **/ pragma solidity >= 0.8.0; /** * @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); } /** * @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"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @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 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) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _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"); } } } // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // 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 (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @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) { return a + b; } /** * @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 a - b; } /** * @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) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting 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 a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting 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) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * 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) { unchecked { require(b > 0, errorMessage); return a % b; } } } /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } abstract contract IQLF is IERC165 { /** * @dev Returns if the given address is qualified, implemented on demand. */ function ifQualified (address account) virtual external view returns (bool); /** * @dev Logs if the given address is qualified, implemented on demand. */ function logQualified (address account, uint256 ito_start_time) virtual external returns (bool); /** * @dev Ensure that custom contract implements `ifQualified` amd `logQualified` correctly. */ function supportsInterface(bytes4 interfaceId) virtual external override pure returns (bool) { return interfaceId == this.supportsInterface.selector || interfaceId == (this.ifQualified.selector ^ this.logQualified.selector); } /** * @dev Emit when `ifQualified` is called to decide if the given `address` * is `qualified` according to the preset rule by the contract creator and * the current block `number` and the current block `timestamp`. */ event Qualification(address account, bool qualified, uint256 blockNumber, uint256 timestamp); } contract HappyTokenPool { struct Pool { uint256 packed1; // qualification_address(160) the smart contract address to verify qualification // hash(40) start_time_delta(28) // expiration_time_delta(28) BIG ENDIAN uint256 packed2; // total_tokens(128) limit(128) uint48 unlock_time; // unlock_time + base_time = real_time address creator; address token_address; // the target token address address[] exchange_addrs; // a list of ERC20 addresses for swapping uint128[] exchanged_tokens; // a list of amounts of swapped tokens uint128[] ratios; // a list of swap ratios // length = 2 * exchange_addrs.length // [address1, target, address2, target, ...] // e.g. [1, 10] // represents 1 tokenA to swap 10 target token // note: each ratio pair needs to be coprime mapping(address => uint256) swapped_map; // swapped amount of an address } struct Packed { uint256 packed1; uint256 packed2; } // swap pool filling success event event FillSuccess ( uint256 total, bytes32 id, address creator, uint256 creation_time, address token_address, string message ); // swap success event event SwapSuccess ( bytes32 id, address swapper, address from_address, address to_address, uint256 from_value, uint256 to_value ); // claim success event event ClaimSuccess ( bytes32 id, address claimer, uint256 timestamp, uint256 to_value, address token_address ); // swap pool destruct success event event DestructSuccess ( bytes32 id, address token_address, uint256 remaining_balance, uint128[] exchanged_values ); // single token withdrawl from a swap pool success even event WithdrawSuccess ( bytes32 id, address token_address, uint256 withdraw_balance ); modifier creatorOnly { require(msg.sender == contract_creator, "Contract Creator Only"); _; } using SafeERC20 for IERC20; uint32 nonce; uint224 base_time; // timestamp = base_time + delta to save gas address public contract_creator; mapping(bytes32 => Pool) pool_by_id; // maps an id to a Pool instance string constant private magic = "Prince Philip, Queen Elizabeth II's husband, has died aged 99, \ Buckingham Palace has announced. A statement issued by the palace just after midday spoke of the \ Queen's deep sorrow following his death at Windsor Castle on Friday morning. The Duke of Edinbur"; bytes32 private seed; address DEFAULT_ADDRESS = 0x0000000000000000000000000000000000000000; // a universal address constructor() { contract_creator = msg.sender; seed = keccak256(abi.encodePacked(magic, block.timestamp, contract_creator)); base_time = 1616976000; // 00:00:00 03/30/2021 GMT(UTC+0) } /** * @dev * fill_pool() creates a swap pool with specific parameters from input * _hash sha3-256(password) * _start start time delta, real start time = base_time + _start * _end end time delta, real end time = base_time + _end * message swap pool creation message, only stored in FillSuccess event * _exchange_addrs swap token list (0x0 for ETH, only supports ETH and ERC20 now) * _ratios swap pair ratio list * _unlock_time unlock time delta real unlock time = base_time + _unlock_time * _token_addr swap target token address * _total_tokens target token total swap amount * _limit target token single swap limit * _qualification the qualification contract address based on IQLF to determine qualification * This function takes the above parameters and creates the pool. _total_tokens of the target token * will be successfully transferred to this contract securely on a successful run of this function. **/ function fill_pool (bytes32 _hash, uint256 _start, uint256 _end, string memory message, address[] memory _exchange_addrs, uint128[] memory _ratios, uint256 _unlock_time, address _token_addr, uint256 _total_tokens, uint256 _limit, address _qualification) public payable { nonce ++; require(_start < _end, "Start time should be earlier than end time."); require(_end < _unlock_time || _unlock_time == 0, "End time should be earlier than unlock time"); require(_limit <= _total_tokens, "Limit needs to be less than or equal to the total supply"); require(_total_tokens < 2 ** 128, "No more than 2^128 tokens(incluidng decimals) allowed"); require(IERC20(_token_addr).allowance(msg.sender, address(this)) >= _total_tokens, "Insuffcient allowance"); require(_exchange_addrs.length > 0, "Exchange token addresses need to be set"); require(_ratios.length == 2 * _exchange_addrs.length, "Size of ratios = 2 * size of exchange_addrs"); bytes32 _id = keccak256(abi.encodePacked(msg.sender, block.timestamp, nonce, seed)); Pool storage pool = pool_by_id[_id]; pool.packed1 = wrap1(_qualification, _hash, _start, _end); // 256 bytes detail in wrap1() pool.packed2 = wrap2(_total_tokens, _limit); // 256 bytes detail in wrap2() pool.unlock_time = uint48(_unlock_time); // 48 bytes unlock_time 0 -> unlocked pool.creator = msg.sender; // 160 bytes pool creator pool.exchange_addrs = _exchange_addrs; // 160 bytes target token pool.token_address = _token_addr; // 160 bytes target token address // Init each token swapped amount to 0 for (uint256 i = 0; i < _exchange_addrs.length; i++) { if (_exchange_addrs[i] != DEFAULT_ADDRESS) { // TODO: Is there a better way to validate an ERC20? require(IERC20(_exchange_addrs[i]).totalSupply() > 0, "Not a valid ERC20"); } pool.exchanged_tokens.push(0); } // Make sure each ratio is co-prime to prevent overflow for (uint256 i = 0; i < _ratios.length; i+= 2) { uint256 divA = SafeMath.div(_ratios[i], _ratios[i+1]); // Non-zero checked by SafteMath.div uint256 divB = SafeMath.div(_ratios[i+1], _ratios[i]); // Non-zero checked by SafteMath.div if (_ratios[i] == 1) { require(divB == _ratios[i+1]); } else if (_ratios[i+1] == 1) { require(divA == _ratios[i]); } else { // if a and b are co-prime, then a / b * b != a and b / a * a != b require(divA * _ratios[i+1] != _ratios[i]); require(divB * _ratios[i] != _ratios[i+1]); } } pool.ratios = _ratios; // 256 * k IERC20(_token_addr).safeTransferFrom(msg.sender, address(this), _total_tokens); emit FillSuccess(_total_tokens, _id, msg.sender, block.timestamp, _token_addr, message); } /** * @dev * swap() allows users to swap tokens in a swap pool * id swap pool id * verification sha3-256(sha3-256(password)[:40]+swapper_address) * validation sha3-256(swapper_address) * exchange_addr_i the index of the exchange address of the list * input_total the input amount of the specific token * This function is called by the swapper who approves the specific ERC20 or directly transfer the ETH * first and wants to swap the desired amount of the target token. The swapped amount is calculated * based on the pool ratio. After swap successfully, the same account can not swap the same pool again. **/ function swap (bytes32 id, bytes32 verification, bytes32 validation, uint256 exchange_addr_i, uint128 input_total) public payable returns (uint256 swapped) { Pool storage pool = pool_by_id[id]; Packed memory packed = Packed(pool.packed1, pool.packed2); require ( IQLF( address( uint160(unbox(packed.packed1, 0, 160))) ).logQualified(msg.sender, uint256(unbox(packed.packed1, 200, 28) + base_time) ) == true, "Not Qualified" ); require (unbox(packed.packed1, 200, 28) + base_time < block.timestamp, "Not started."); require (unbox(packed.packed1, 228, 28) + base_time > block.timestamp, "Expired."); // sha3(sha3(passowrd)[:40] + msg.sender) so that the raw password will never appear in the contract require (verification == keccak256(abi.encodePacked(unbox(packed.packed1, 160, 40), msg.sender)), 'Wrong Password'); // sha3(msg.sender) to protect from front runs (but this is kinda naive since the contract is open sourced) require (validation == keccak256(abi.encodePacked(msg.sender)), "Validation Failed"); uint256 total_tokens = unbox(packed.packed2, 0, 128); // revert if the pool is empty require (total_tokens > 0, "Out of Stock"); address exchange_addr = pool.exchange_addrs[exchange_addr_i]; uint256 ratioA = pool.ratios[exchange_addr_i*2]; uint256 ratioB = pool.ratios[exchange_addr_i*2 + 1]; // check if the input is enough for the desired transfer if (exchange_addr == DEFAULT_ADDRESS) { require(msg.value == input_total, 'No enough ether.'); } else { uint256 allowance = IERC20(exchange_addr).allowance(msg.sender, address(this)); require(allowance >= input_total, 'No enough allowance.'); } uint256 swapped_tokens; // this calculation won't be overflow thanks to the SafeMath and the co-prime test swapped_tokens = SafeMath.div(SafeMath.mul(input_total, ratioB), ratioA); // 2^256=10e77 >> 10e18 * 10e18 require(swapped_tokens > 0, "Better not draw water with a sieve"); uint256 limit = unbox(packed.packed2, 128, 128); if (swapped_tokens > limit) { // don't be greedy - you can only get at most limit tokens swapped_tokens = limit; input_total = uint128(SafeMath.div(SafeMath.mul(limit, ratioA), ratioB)); // Update input_total } else if (swapped_tokens > total_tokens) { // if the left tokens are not enough swapped_tokens = total_tokens; input_total = uint128(SafeMath.div(SafeMath.mul(total_tokens, ratioA), ratioB)); // Update input_total // return the eth if (exchange_addr == DEFAULT_ADDRESS) payable(msg.sender).transfer(msg.value - input_total); } require(swapped_tokens <= limit); // make sure again pool.exchanged_tokens[exchange_addr_i] = uint128(SafeMath.add(pool.exchanged_tokens[exchange_addr_i], input_total)); // update exchanged // penalize greedy attackers by placing duplication check at the very last require (pool.swapped_map[msg.sender] == 0, "Already swapped"); // update the remaining tokens and swapped token mapping pool.packed2 = rewriteBox(packed.packed2, 0, 128, SafeMath.sub(total_tokens, swapped_tokens)); pool.swapped_map[msg.sender] = swapped_tokens; // transfer the token after state changing // ETH comes with the tx, but ERC20 does not - INPUT if (exchange_addr != DEFAULT_ADDRESS) { IERC20(exchange_addr).safeTransferFrom(msg.sender, address(this), input_total); } // Swap success event emit SwapSuccess(id, msg.sender, exchange_addr, pool.token_address, input_total, swapped_tokens); // if unlock_time == 0, transfer the swapped tokens to the recipient address (msg.sender) - OUTPUT // if not, claim() needs to be called to get the token if (pool.unlock_time == 0) { transfer_token(pool.token_address, address(this), msg.sender, swapped_tokens); emit ClaimSuccess(id, msg.sender, block.timestamp, swapped_tokens, pool.token_address); } return swapped_tokens; } /** * check_availability() returns a bunch of pool info given a pool id * id swap pool id * this function returns 1. exchange_addrs that can be used to determine the index * 2. remaining target tokens * 3. if started * 4. if ended * 5. swapped amount of the query address * 5. exchanged amount of each token **/ function check_availability (bytes32 id) external view returns (address[] memory exchange_addrs, uint256 remaining, bool started, bool expired, bool unlocked, uint256 unlock_time, uint256 swapped, uint128[] memory exchanged_tokens) { Pool storage pool = pool_by_id[id]; return ( pool.exchange_addrs, // exchange_addrs 0x0 means destructed unbox(pool.packed2, 0, 128), // remaining block.timestamp > unbox(pool.packed1, 200, 28) + base_time, // started block.timestamp > unbox(pool.packed1, 228, 28) + base_time, // expired block.timestamp > pool.unlock_time + base_time, // unlocked pool.unlock_time + base_time, // unlock_time pool.swapped_map[msg.sender], // swapped number pool.exchanged_tokens // exchanged tokens ); } function claim(bytes32[] memory ito_ids) public { uint256 claimed_amount; for (uint256 i = 0; i < ito_ids.length; i++) { Pool storage pool = pool_by_id[ito_ids[i]]; if (pool.unlock_time == 0) continue; if (pool.unlock_time + base_time > block.timestamp) continue; claimed_amount = pool.swapped_map[msg.sender]; if (claimed_amount == 0) continue; pool.swapped_map[msg.sender] = 0; transfer_token(pool.token_address, address(this), msg.sender, claimed_amount); emit ClaimSuccess(ito_ids[i], msg.sender, block.timestamp, claimed_amount, pool.token_address); } } function setUnlockTime(bytes32 id, uint256 _unlock_time) public { Pool storage pool = pool_by_id[id]; require(pool.creator == msg.sender, "Pool Creator Only"); require(block.timestamp < pool.unlock_time, "Too Late"); require(pool.unlock_time != 0, "Not eligible when unlock_time is 0"); require(_unlock_time != 0, "Cannot set to 0"); pool.unlock_time = uint48(_unlock_time); } /** * destruct() destructs the given pool given the pool id * id swap pool id * this function can only be called by the pool creator. after validation, it transfers all the remaining token * (if any) and all the swapped tokens to the pool creator. it will then destruct the pool by reseting almost * all the variables to zero to get the gas refund. * note that this function may not work if a pool needs to transfer over ~200 tokens back to the address due to * the block gas limit. we have another function withdraw() to help the pool creator to withdraw a single token **/ function destruct (bytes32 id) public { Pool storage pool = pool_by_id[id]; require(msg.sender == pool.creator, "Only the pool creator can destruct."); uint256 expiration = unbox(pool.packed1, 228, 28) + base_time; uint256 remaining_tokens = unbox(pool.packed2, 0, 128); // only after expiration or the pool is empty require(expiration <= block.timestamp || remaining_tokens == 0, "Not expired yet"); // if any left in the pool if (remaining_tokens != 0) { transfer_token(pool.token_address, address(this), msg.sender, remaining_tokens); } // transfer the swapped tokens accordingly // note this loop may exceed the block gas limit so if >200 exchange_addrs this may not work for (uint256 i = 0; i < pool.exchange_addrs.length; i++) { if (pool.exchanged_tokens[i] > 0) { // ERC20 if (pool.exchange_addrs[i] != DEFAULT_ADDRESS) transfer_token(pool.exchange_addrs[i], address(this), msg.sender, pool.exchanged_tokens[i]); // ETH else payable(msg.sender).transfer(pool.exchanged_tokens[i]); } } emit DestructSuccess(id, pool.token_address, remaining_tokens, pool.exchanged_tokens); // Gas Refund pool.packed1 = 0; pool.packed2 = 0; for (uint256 i = 0; i < pool.exchange_addrs.length; i++) { pool.exchange_addrs[i] = DEFAULT_ADDRESS; pool.exchanged_tokens[i] = 0; pool.ratios[i*2] = 0; pool.ratios[i*2+1] = 0; } } /** * withdraw() transfers out a single token after a pool is expired or empty * id swap pool id * addr_i withdraw token index * this function can only be called by the pool creator. after validation, it transfers the addr_i th token * out to the pool creator address. **/ function withdraw (bytes32 id, uint256 addr_i) public { Pool storage pool = pool_by_id[id]; require(msg.sender == pool.creator, "Only the pool creator can withdraw."); uint256 withdraw_balance = pool.exchanged_tokens[addr_i]; require(withdraw_balance > 0, "None of this token left"); uint256 expiration = unbox(pool.packed1, 228, 28) + base_time; uint256 remaining_tokens = unbox(pool.packed2, 0, 128); // only after expiration or the pool is empty require(expiration <= block.timestamp || remaining_tokens == 0, "Not expired yet"); address token_address = pool.exchange_addrs[addr_i]; // ERC20 if (token_address != DEFAULT_ADDRESS) transfer_token(token_address, address(this), msg.sender, withdraw_balance); // ETH else payable(msg.sender).transfer(withdraw_balance); // clear the record pool.exchanged_tokens[addr_i] = 0; emit WithdrawSuccess(id, token_address, withdraw_balance); } // helper functions TODO: migrate this to a helper file /** * _qualification the smart contract address to verify qualification 160 * _hash sha3-256(password) 40 * _start start time delta 28 * _end end time delta 28 * wrap1() inserts the above variables into a 32-word block **/ function wrap1 (address _qualification, bytes32 _hash, uint256 _start, uint256 _end) internal pure returns (uint256 packed1) { uint256 _packed1 = 0; _packed1 |= box(0, 160, uint256(uint160(_qualification))); // _qualification = 160 bits _packed1 |= box(160, 40, uint256(_hash) >> 216); // hash = 40 bits (safe?) _packed1 |= box(200, 28, _start); // start_time = 28 bits _packed1 |= box(228, 28, _end); // expiration_time = 28 bits return _packed1; } /** * _total_tokens target remaining 128 * _limit single swap limit 128 * wrap2() inserts the above variables into a 32-word block **/ function wrap2 (uint256 _total_tokens, uint256 _limit) internal pure returns (uint256 packed2) { uint256 _packed2 = 0; _packed2 |= box(0, 128, _total_tokens); // total_tokens = 128 bits ~= 3.4e38 _packed2 |= box(128, 128, _limit); // limit = 128 bits return _packed2; } /** * position position in a memory block * size data size * data data * box() inserts the data in a 256bit word with the given position and returns it * data is checked by validRange() to make sure it is not over size **/ function box (uint16 position, uint16 size, uint256 data) internal pure returns (uint256 boxed) { require(validRange(size, data), "Value out of range BOX"); assembly { // data << position boxed := shl(position, data) } } /** * position position in a memory block * size data size * base base data * unbox() extracts the data out of a 256bit word with the given position and returns it * base is checked by validRange() to make sure it is not over size **/ function unbox (uint256 base, uint16 position, uint16 size) internal pure returns (uint256 unboxed) { require(validRange(256, base), "Value out of range UNBOX"); assembly { // (((1 << size) - 1) & base >> position) unboxed := and(sub(shl(size, 1), 1), shr(position, base)) } } /** * size data size * data data * validRange() checks if the given data is over the specified data size **/ function validRange (uint16 size, uint256 data) internal pure returns(bool ifValid) { assembly { // 2^size > data or size ==256 ifValid := or(eq(size, 256), gt(shl(size, 1), data)) } } /** * _box 32byte data to be modified * position position in a memory block * size data size * data data to be inserted * rewriteBox() updates a 32byte word with a data at the given position with the specified size **/ function rewriteBox (uint256 _box, uint16 position, uint16 size, uint256 data) internal pure returns (uint256 boxed) { assembly { // mask = ~((1 << size - 1) << position) // _box = (mask & _box) | ()data << position) boxed := or( and(_box, not(shl(position, sub(shl(size, 1), 1)))), shl(position, data)) } } /** * token_address ERC20 address * sender_address sender address * recipient_address recipient address * amount transfer amount * transfer_token() transfers a given amount of ERC20 from the sender address to the recipient address **/ function transfer_token (address token_address, address sender_address, address recipient_address, uint256 amount) internal { require(IERC20(token_address).balanceOf(sender_address) >= amount, "Balance not enough"); IERC20(token_address).safeTransfer(recipient_address, amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"address","name":"claimer","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"to_value","type":"uint256"},{"indexed":false,"internalType":"address","name":"token_address","type":"address"}],"name":"ClaimSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"address","name":"token_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"remaining_balance","type":"uint256"},{"indexed":false,"internalType":"uint128[]","name":"exchanged_values","type":"uint128[]"}],"name":"DestructSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"uint256","name":"creation_time","type":"uint256"},{"indexed":false,"internalType":"address","name":"token_address","type":"address"},{"indexed":false,"internalType":"string","name":"message","type":"string"}],"name":"FillSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"address","name":"swapper","type":"address"},{"indexed":false,"internalType":"address","name":"from_address","type":"address"},{"indexed":false,"internalType":"address","name":"to_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"from_value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"to_value","type":"uint256"}],"name":"SwapSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"address","name":"token_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"withdraw_balance","type":"uint256"}],"name":"WithdrawSuccess","type":"event"},{"inputs":[{"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"check_availability","outputs":[{"internalType":"address[]","name":"exchange_addrs","type":"address[]"},{"internalType":"uint256","name":"remaining","type":"uint256"},{"internalType":"bool","name":"started","type":"bool"},{"internalType":"bool","name":"expired","type":"bool"},{"internalType":"bool","name":"unlocked","type":"bool"},{"internalType":"uint256","name":"unlock_time","type":"uint256"},{"internalType":"uint256","name":"swapped","type":"uint256"},{"internalType":"uint128[]","name":"exchanged_tokens","type":"uint128[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"ito_ids","type":"bytes32[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contract_creator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"destruct","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_hash","type":"bytes32"},{"internalType":"uint256","name":"_start","type":"uint256"},{"internalType":"uint256","name":"_end","type":"uint256"},{"internalType":"string","name":"message","type":"string"},{"internalType":"address[]","name":"_exchange_addrs","type":"address[]"},{"internalType":"uint128[]","name":"_ratios","type":"uint128[]"},{"internalType":"uint256","name":"_unlock_time","type":"uint256"},{"internalType":"address","name":"_token_addr","type":"address"},{"internalType":"uint256","name":"_total_tokens","type":"uint256"},{"internalType":"uint256","name":"_limit","type":"uint256"},{"internalType":"address","name":"_qualification","type":"address"}],"name":"fill_pool","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"uint256","name":"_unlock_time","type":"uint256"}],"name":"setUnlockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"bytes32","name":"verification","type":"bytes32"},{"internalType":"bytes32","name":"validation","type":"bytes32"},{"internalType":"uint256","name":"exchange_addr_i","type":"uint256"},{"internalType":"uint128","name":"input_total","type":"uint128"}],"name":"swap","outputs":[{"internalType":"uint256","name":"swapped","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"uint256","name":"addr_i","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200005357600080fd5b5033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604051806101400160405280610108815260200162005aca610108913942600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051602001620000ea93929190620001ce565b604051602081830303815290604052805190602001206003819055506360611880600060046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550620002d6565b62000176620001708262000223565b62000297565b82525050565b600062000189826200020d565b62000195818562000218565b9350620001a781856020860162000261565b80840191505092915050565b620001c8620001c28262000257565b620002bf565b82525050565b6000620001dc82866200017c565b9150620001ea8285620001b3565b602082019150620001fc828462000161565b601482019150819050949350505050565b600081519050919050565b600081905092915050565b6000620002308262000237565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200028157808201518184015260208101905062000264565b8381111562000291576000848401525b50505050565b6000620002a482620002ab565b9050919050565b6000620002b882620002c9565b9050919050565b6000819050919050565b60008160601b9050919050565b6157e480620002e66000396000f3fe60806040526004361061007b5760003560e01c8063c6d898341161004e578063c6d8983414610141578063cc0cab4c14610171578063ec0e3d9a1461019a578063ef65dc7e146101c35761007b565b8063040cf020146100805780636bfdaece146100a9578063b391c508146100ed578063bf5c292014610116575b600080fd5b34801561008c57600080fd5b506100a760048036038101906100a2919061398d565b6101df565b005b3480156100b557600080fd5b506100d060048036038101906100cb91906138ed565b6105ff565b6040516100e49897969594939291906143d9565b60405180910390f35b3480156100f957600080fd5b50610114600480360381019061010f9190613883565b61096d565b005b34801561012257600080fd5b5061012b610c08565b6040516101389190614335565b60405180910390f35b61015b60048036038101906101569190613916565b610c2e565b60405161016891906149be565b60405180910390f35b34801561017d57600080fd5b50610198600480360381019061019391906138ed565b6118c4565b005b3480156101a657600080fd5b506101c160048036038101906101bc919061398d565b6120a1565b005b6101dd60048036038101906101d891906139c9565b61227c565b005b60006002600084815260200190815260200160002090508060020160069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610288576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027f906148fe565b60405180910390fd5b60008160050183815481106102c6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010029054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000811161034f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610346906146fe565b60405180910390fd5b60008060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166103aa846000015460e4601c612e02565b6103b49190614c31565b905060006103c9846001015460006080612e02565b905042821115806103da5750600081145b610419576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104109061469e565b60405180910390fd5b6000846004018681548110610457577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146104ea576104e581303387612e62565b610532565b3373ffffffffffffffffffffffffffffffffffffffff166108fc859081150290604051600060405180830381858888f19350505050158015610530573d6000803e3d6000fd5b505b6000856005018781548110610570577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010026101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055507fab5315d16ef405a1f4e8c34017af486f59f27097e003d2a1981ae682c2f367318782866040516105ee939291906144c6565b60405180910390a150505050505050565b606060008060008060008060606000600260008b8152602001908152602001600020905080600401610638826001015460006080612e02565b600060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610692846000015460c8601c612e02565b61069c9190614c31565b4211600060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166106f8856000015460e4601c612e02565b6107029190614c31565b4211600060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168560020160009054906101000a900465ffffffffffff1665ffffffffffff166107589190614bdf565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff164211600060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168660020160009054906101000a900465ffffffffffff1665ffffffffffff166107cc9190614bdf565b8660070160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054876005018780548060200260200160405190810160405280929190818152602001828054801561089357602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610849575b50505050509750827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1692508080548060200260200160405190810160405280929190818152602001828054801561094a57602002820191906000526020600020906000905b82829054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020019060100190602082600f010492830192600103820291508084116108f55790505b505050505090509850985098509850985098509850985050919395975091939597565b600080600090505b8251811015610c03576000600260008584815181106109bd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518152602001908152602001600020905060008160020160009054906101000a900465ffffffffffff1665ffffffffffff161415610a025750610bf0565b42600060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168260020160009054906101000a900465ffffffffffff1665ffffffffffff16610a579190614bdf565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff161115610a815750610bf0565b8060070160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205492506000831415610ad45750610bf0565b60008160070160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610b4b8160030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16303386612e62565b7f0b8bdb11ddec1f8dd879bd98afac7c33c30ce590fcbc26ed559df98f9a381119848381518110610ba5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101513342868560030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051610be6959493929190614549565b60405180910390a1505b8080610bfb90614ec1565b915050610975565b505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060026000888152602001908152602001600020905060006040518060400160405280836000015481526020018360010154815250905060011515610c7c8260000151600060a0612e02565b73ffffffffffffffffffffffffffffffffffffffff16637938037233600060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610cf2866000015160c8601c612e02565b610cfc9190614c31565b6040518363ffffffff1660e01b8152600401610d199291906143b0565b602060405180830381600087803b158015610d3357600080fd5b505af1158015610d47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6b91906138c4565b151514610dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da49061493e565b60405180910390fd5b42600060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610e08836000015160c8601c612e02565b610e129190614c31565b10610e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e499061489e565b60405180910390fd5b42600060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610ead836000015160e4601c612e02565b610eb79190614c31565b11610ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eee9061485e565b60405180910390fd5b610f08816000015160a06028612e02565b33604051602001610f1a929190614309565b604051602081830303815290604052805190602001208714610f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f689061471e565b60405180910390fd5b33604051602001610f829190614289565b604051602081830303815290604052805190602001208614610fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd09061497e565b60405180910390fd5b6000610fec826020015160006080612e02565b905060008111611031576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110289061477e565b60405180910390fd5b600083600401878154811061106f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000846006016002896110af9190614cb8565b815481106110e6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010029054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600085600601600160028b6111419190614cb8565b61114b9190614c31565b81548110611182577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010029054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561127757876fffffffffffffffffffffffffffffffff163414611272576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112699061491e565b60405180910390fd5b61135d565b60008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b81526004016112b4929190614350565b60206040518083038186803b1580156112cc57600080fd5b505afa1580156112e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113049190613b01565b9050886fffffffffffffffffffffffffffffffff1681101561135b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611352906147be565b60405180910390fd5b505b600061138461137e8a6fffffffffffffffffffffffffffffffff1684612f5e565b84612f74565b9050600081116113c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c0906145de565b60405180910390fd5b60006113db8760200151608080612e02565b905080821115611402578091506113fb6113f58286612f5e565b84612f74565b99506114df565b858211156114de5785915061142061141a8786612f5e565b84612f74565b9950600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156114dd573373ffffffffffffffffffffffffffffffffffffffff166108fc8b6fffffffffffffffffffffffffffffffff16346114b09190614d12565b9081150290604051600060405180830381858888f193505050501580156114db573d6000803e3d6000fd5b505b5b5b808211156114ec57600080fd5b611587886005018c8154811061152b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010029054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168b6fffffffffffffffffffffffffffffffff16612f8a565b886005018c815481106115c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010026101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060008860070160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611692576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116899061467e565b60405180910390fd5b6116ad8760200151600060806116a88a87612fa0565b612fb6565b8860010181905550818860070160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146117905761178f33308c6fffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16612fd1909392919063ffffffff16565b5b7fa6a9350e3cb78ab6117ff3f716716cb2a1c40e92008df3c4f60e976ee6d56edc8e33878b60030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168e876040516117ed96959493929190614465565b60405180910390a160008860020160009054906101000a900465ffffffffffff1665ffffffffffff1614156118b05761184c8860030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16303385612e62565b7f0b8bdb11ddec1f8dd879bd98afac7c33c30ce590fcbc26ed559df98f9a3811198e3342858c60030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040516118a7959493929190614549565b60405180910390a15b819850505050505050505095945050505050565b60006002600083815260200190815260200160002090508060020160069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461196d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611964906145fe565b60405180910390fd5b60008060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166119c8836000015460e4601c612e02565b6119d29190614c31565b905060006119e7836001015460006080612e02565b905042821115806119f85750600081145b611a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2e9061469e565b60405180910390fd5b60008114611a7057611a6f8360030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16303384612e62565b5b60005b8360040180549050811015611d96576000846005018281548110611ac0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010029054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff161115611d8357600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16846004018281548110611b7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611cbb57611cb6846004018281548110611c04577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163033876005018581548110611c6d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010029054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16612e62565b611d82565b3373ffffffffffffffffffffffffffffffffffffffff166108fc856005018381548110611d11577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010029054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169081150290604051600060405180830381858888f19350505050158015611d80573d6000803e3d6000fd5b505b5b8080611d8e90614ec1565b915050611a73565b507f01a1fd9d8a4231d7bd8926ce16b753ba03e0310e0a776f13eba8e0c3cba7ea89848460030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168386600501604051611df394939291906144fd565b60405180910390a1600083600001819055506000836001018190555060005b836004018054905081101561209a57600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846004018281548110611e80577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000846005018281548110611f06577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010026101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550600084600601600283611f649190614cb8565b81548110611f9b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010026101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506000846006016001600284611ffb9190614cb8565b6120059190614c31565b8154811061203c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010026101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550808061209290614ec1565b915050611e12565b5050505050565b60006002600084815260200190815260200160002090503373ffffffffffffffffffffffffffffffffffffffff168160020160069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461214a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121419061483e565b60405180910390fd5b8060020160009054906101000a900465ffffffffffff1665ffffffffffff1642106121aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a1906147de565b60405180910390fd5b60008160020160009054906101000a900465ffffffffffff1665ffffffffffff16141561220c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122039061475e565b60405180910390fd5b6000821415612250576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612247906146be565b60405180910390fd5b818160020160006101000a81548165ffffffffffff021916908365ffffffffffff160217905550505050565b60008081819054906101000a900463ffffffff168092919061229d90614f0a565b91906101000a81548163ffffffff021916908363ffffffff16021790555050888a106122fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f5906146de565b60405180910390fd5b8489108061230c5750600085145b61234b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123429061499e565b60405180910390fd5b8282111561238e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612385906148de565b60405180910390fd5b70010000000000000000000000000000000083106123e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d89061463e565b60405180910390fd5b828473ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b815260040161241d929190614350565b60206040518083038186803b15801561243557600080fd5b505afa158015612449573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061246d9190613b01565b10156124ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a59061479e565b60405180910390fd5b60008751116124f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e99061461e565b60405180910390fd5b865160026125009190614cb8565b865114612542576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612539906147fe565b60405180910390fd5b6000334260008054906101000a900463ffffffff1660035460405160200161256d94939291906142a4565b60405160208183030381529060405280519060200120905060006002600083815260200190815260200160002090506125a8838e8e8e61305a565b81600001819055506125ba85856130ce565b8160010181905550868160020160006101000a81548165ffffffffffff021916908365ffffffffffff160217905550338160020160066101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088816004019080519060200190612644929190613460565b50858160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060005b89518110156128a657600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168a8281518110612706577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161461282a5760008a8281518110612764577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156127b157600080fd5b505afa1580156127c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e99190613b01565b11612829576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128209061481e565b60405180910390fd5b5b81600501600090806001815401808255809150506001900390600052602060002090600291828204019190066010029091909190916101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550808061289e90614ec1565b91505061268b565b5060005b8851811015612d6b57600061296f8a83815181106128f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff168b6001856129199190614c31565b81518110612950577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff16612f74565b90506000612a2d8b6001856129849190614c31565b815181106129bb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff168c8581518110612a0e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff16612f74565b905060018b8481518110612a6a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff161415612af9578a600184612a989190614c31565b81518110612acf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff168114612af457600080fd5b612d55565b60018b600185612b099190614c31565b81518110612b40577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff161415612bc3578a8381518110612b99577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff168214612bbe57600080fd5b612d54565b8a8381518110612bfc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff168b600185612c249190614c31565b81518110612c5b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff1683612c809190614cb8565b1415612c8b57600080fd5b8a600184612c999190614c31565b81518110612cd0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff168b8481518110612d23577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff1682612d489190614cb8565b1415612d5357600080fd5b5b5b5050600281612d649190614c31565b90506128aa565b5087816006019080519060200190612d849291906134ea565b50612db23330878973ffffffffffffffffffffffffffffffffffffffff16612fd1909392919063ffffffff16565b7f67851705247ee2eaa9bf5ce64c064ee80704743e80b401abb46b36318f7be5cf858333428a8f604051612deb969594939291906149d9565b60405180910390a150505050505050505050505050565b6000612e1061010085613100565b612e4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e46906145be565b60405180910390fd5b83831c600180841b031690509392505050565b808473ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401612e9c9190614335565b60206040518083038186803b158015612eb457600080fd5b505afa158015612ec8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eec9190613b01565b1015612f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f249061465e565b60405180910390fd5b612f5882828673ffffffffffffffffffffffffffffffffffffffff166131169092919063ffffffff16565b50505050565b60008183612f6c9190614cb8565b905092915050565b60008183612f829190614c87565b905092915050565b60008183612f989190614c31565b905092915050565b60008183612fae9190614d12565b905092915050565b600081841b600180851b03851b198616179050949350505050565b613054846323b872dd60e01b858585604051602401612ff293929190614379565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061319c565b50505050565b60008060009050613084600060a08873ffffffffffffffffffffffffffffffffffffffff16613263565b8117905061309c60a0602860d88860001c901c613263565b811790506130ad60c8601c86613263565b811790506130be60e4601c85613263565b8117905080915050949350505050565b600080600090506130e26000608086613263565b811790506130f260808085613263565b811790508091505092915050565b6000816001841b11610100841417905092915050565b6131978363a9059cbb60e01b84846040516024016131359291906143b0565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061319c565b505050565b60006131fe826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166132ba9092919063ffffffff16565b905060008151111561325e578080602001905181019061321e91906138c4565b61325d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132549061495e565b60405180910390fd5b5b505050565b600061326f8383613100565b6132ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a59061487e565b60405180910390fd5b81841b90509392505050565b60606132c984846000856132d2565b90509392505050565b606082471015613317576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330e9061473e565b60405180910390fd5b613320856133e6565b61335f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613356906148be565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161338891906142f2565b60006040518083038185875af1925050503d80600081146133c5576040519150601f19603f3d011682016040523d82523d6000602084013e6133ca565b606091505b50915091506133da8282866133f9565b92505050949350505050565b600080823b905060008111915050919050565b6060831561340957829050613459565b60008351111561341c5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613450919061459c565b60405180910390fd5b9392505050565b8280548282559060005260206000209081019282156134d9579160200282015b828111156134d85782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613480565b5b5090506134e691906135be565b5090565b828054828255906000526020600020906001016002900481019282156135ad5791602002820160005b8382111561356f57835183826101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055509260200192601001602081600f01049283019260010302613513565b80156135ab5782816101000a8154906fffffffffffffffffffffffffffffffff0219169055601001602081600f0104928301926001030261356f565b505b5090506135ba91906135be565b5090565b5b808211156135d75760008160009055506001016135bf565b5090565b60006135ee6135e984614a66565b614a41565b9050808382526020820190508285602086028201111561360d57600080fd5b60005b8581101561363d5781613623888261375d565b845260208401935060208301925050600181019050613610565b5050509392505050565b600061365a61365584614a92565b614a41565b9050808382526020820190508285602086028201111561367957600080fd5b60005b858110156136a9578161368f8882613805565b84526020840193506020830192505060018101905061367c565b5050509392505050565b60006136c66136c184614abe565b614a41565b905080838252602082019050828560208602820111156136e557600080fd5b60005b8581101561371557816136fb8882613844565b8452602084019350602083019250506001810190506136e8565b5050509392505050565b600061373261372d84614aea565b614a41565b90508281526020810184848401111561374a57600080fd5b613755848285614e1a565b509392505050565b60008135905061376c8161573b565b92915050565b600082601f83011261378357600080fd5b81356137938482602086016135db565b91505092915050565b600082601f8301126137ad57600080fd5b81356137bd848260208601613647565b91505092915050565b600082601f8301126137d757600080fd5b81356137e78482602086016136b3565b91505092915050565b6000815190506137ff81615752565b92915050565b60008135905061381481615769565b92915050565b600082601f83011261382b57600080fd5b813561383b84826020860161371f565b91505092915050565b60008135905061385381615780565b92915050565b60008135905061386881615797565b92915050565b60008151905061387d81615797565b92915050565b60006020828403121561389557600080fd5b600082013567ffffffffffffffff8111156138af57600080fd5b6138bb8482850161379c565b91505092915050565b6000602082840312156138d657600080fd5b60006138e4848285016137f0565b91505092915050565b6000602082840312156138ff57600080fd5b600061390d84828501613805565b91505092915050565b600080600080600060a0868803121561392e57600080fd5b600061393c88828901613805565b955050602061394d88828901613805565b945050604061395e88828901613805565b935050606061396f88828901613859565b925050608061398088828901613844565b9150509295509295909350565b600080604083850312156139a057600080fd5b60006139ae85828601613805565b92505060206139bf85828601613859565b9150509250929050565b60008060008060008060008060008060006101608c8e0312156139eb57600080fd5b60006139f98e828f01613805565b9b50506020613a0a8e828f01613859565b9a50506040613a1b8e828f01613859565b99505060608c013567ffffffffffffffff811115613a3857600080fd5b613a448e828f0161381a565b98505060808c013567ffffffffffffffff811115613a6157600080fd5b613a6d8e828f01613772565b97505060a08c013567ffffffffffffffff811115613a8a57600080fd5b613a968e828f016137c6565b96505060c0613aa78e828f01613859565b95505060e0613ab88e828f0161375d565b945050610100613aca8e828f01613859565b935050610120613adc8e828f01613859565b925050610140613aee8e828f0161375d565b9150509295989b509295989b9093969950565b600060208284031215613b1357600080fd5b6000613b218482850161386e565b91505092915050565b6000613b368383613b5a565b60208301905092915050565b6000613b4e838361422e565b60208301905092915050565b613b6381614d62565b82525050565b613b7281614d62565b82525050565b613b89613b8482614d62565b614f37565b82525050565b6000613b9a82614b50565b613ba48185614ba1565b9350613baf83614b1b565b8060005b83811015613be0578151613bc78882613b2a565b9750613bd283614b87565b925050600181019050613bb3565b5085935050505092915050565b6000613bf882614b5b565b613c028185614bb2565b9350613c0d83614b2b565b8060005b83811015613c3e578151613c258882613b42565b9750613c3083614b94565b925050600181019050613c11565b5085935050505092915050565b6000613c5682614b66565b613c608185614bb2565b935083613c6c84614b3b565b6000600115613cc9575b83600160020382011015613cc8578154613c9888613c9383614e5c565b61422e565b602088019750613cb088613cab83614e76565b61422e565b60208801975060018301925050600281019050613c76565b5b600115613d2257815484821015613cf957613cec88613ce783614e5c565b61422e565b6020880197506001820191505b84821015613d2057613d1388613d0e83614e76565b61422e565b6020880197506001820191505b505b8694505050505092915050565b613d3881614d74565b82525050565b613d4781614d80565b82525050565b613d5e613d5982614d80565b614f49565b82525050565b6000613d6f82614b71565b613d798185614bc3565b9350613d89818560208601614e29565b80840191505092915050565b6000613da082614b7c565b613daa8185614bce565b9350613dba818560208601614e29565b613dc38161500e565b840191505092915050565b6000613ddb601883614bce565b9150613de682615053565b602082019050919050565b6000613dfe602283614bce565b9150613e098261507c565b604082019050919050565b6000613e21602383614bce565b9150613e2c826150cb565b604082019050919050565b6000613e44602783614bce565b9150613e4f8261511a565b604082019050919050565b6000613e67603583614bce565b9150613e7282615169565b604082019050919050565b6000613e8a601283614bce565b9150613e95826151b8565b602082019050919050565b6000613ead600f83614bce565b9150613eb8826151e1565b602082019050919050565b6000613ed0600f83614bce565b9150613edb8261520a565b602082019050919050565b6000613ef3600f83614bce565b9150613efe82615233565b602082019050919050565b6000613f16602b83614bce565b9150613f218261525c565b604082019050919050565b6000613f39601783614bce565b9150613f44826152ab565b602082019050919050565b6000613f5c600e83614bce565b9150613f67826152d4565b602082019050919050565b6000613f7f602683614bce565b9150613f8a826152fd565b604082019050919050565b6000613fa2602283614bce565b9150613fad8261534c565b604082019050919050565b6000613fc5600c83614bce565b9150613fd08261539b565b602082019050919050565b6000613fe8601583614bce565b9150613ff3826153c4565b602082019050919050565b600061400b601483614bce565b9150614016826153ed565b602082019050919050565b600061402e600883614bce565b915061403982615416565b602082019050919050565b6000614051602b83614bce565b915061405c8261543f565b604082019050919050565b6000614074601183614bce565b915061407f8261548e565b602082019050919050565b6000614097601183614bce565b91506140a2826154b7565b602082019050919050565b60006140ba600883614bce565b91506140c5826154e0565b602082019050919050565b60006140dd601683614bce565b91506140e882615509565b602082019050919050565b6000614100600c83614bce565b915061410b82615532565b602082019050919050565b6000614123601d83614bce565b915061412e8261555b565b602082019050919050565b6000614146603883614bce565b915061415182615584565b604082019050919050565b6000614169602383614bce565b9150614174826155d3565b604082019050919050565b600061418c601083614bce565b915061419782615622565b602082019050919050565b60006141af600d83614bce565b91506141ba8261564b565b602082019050919050565b60006141d2602a83614bce565b91506141dd82615674565b604082019050919050565b60006141f5601183614bce565b9150614200826156c3565b602082019050919050565b6000614218602b83614bce565b9150614223826156ec565b604082019050919050565b61423781614d8a565b82525050565b61424681614e08565b82525050565b61425581614dee565b82525050565b61426c61426782614dee565b614f65565b82525050565b61428361427e82614df8565b614f6f565b82525050565b60006142958284613b78565b60148201915081905092915050565b60006142b08287613b78565b6014820191506142c0828661425b565b6020820191506142d08285614272565b6004820191506142e08284613d4d565b60208201915081905095945050505050565b60006142fe8284613d64565b915081905092915050565b6000614315828561425b565b6020820191506143258284613b78565b6014820191508190509392505050565b600060208201905061434a6000830184613b69565b92915050565b60006040820190506143656000830185613b69565b6143726020830184613b69565b9392505050565b600060608201905061438e6000830186613b69565b61439b6020830185613b69565b6143a8604083018461424c565b949350505050565b60006040820190506143c56000830185613b69565b6143d2602083018461424c565b9392505050565b60006101008201905081810360008301526143f4818b613b8f565b9050614403602083018a61424c565b6144106040830189613d2f565b61441d6060830188613d2f565b61442a6080830187613d2f565b61443760a083018661424c565b61444460c083018561424c565b81810360e08301526144568184613bed565b90509998505050505050505050565b600060c08201905061447a6000830189613d3e565b6144876020830188613b69565b6144946040830187613b69565b6144a16060830186613b69565b6144ae608083018561423d565b6144bb60a083018461424c565b979650505050505050565b60006060820190506144db6000830186613d3e565b6144e86020830185613b69565b6144f5604083018461424c565b949350505050565b60006080820190506145126000830187613d3e565b61451f6020830186613b69565b61452c604083018561424c565b818103606083015261453e8184613c4b565b905095945050505050565b600060a08201905061455e6000830188613d3e565b61456b6020830187613b69565b614578604083018661424c565b614585606083018561424c565b6145926080830184613b69565b9695505050505050565b600060208201905081810360008301526145b68184613d95565b905092915050565b600060208201905081810360008301526145d781613dce565b9050919050565b600060208201905081810360008301526145f781613df1565b9050919050565b6000602082019050818103600083015261461781613e14565b9050919050565b6000602082019050818103600083015261463781613e37565b9050919050565b6000602082019050818103600083015261465781613e5a565b9050919050565b6000602082019050818103600083015261467781613e7d565b9050919050565b6000602082019050818103600083015261469781613ea0565b9050919050565b600060208201905081810360008301526146b781613ec3565b9050919050565b600060208201905081810360008301526146d781613ee6565b9050919050565b600060208201905081810360008301526146f781613f09565b9050919050565b6000602082019050818103600083015261471781613f2c565b9050919050565b6000602082019050818103600083015261473781613f4f565b9050919050565b6000602082019050818103600083015261475781613f72565b9050919050565b6000602082019050818103600083015261477781613f95565b9050919050565b6000602082019050818103600083015261479781613fb8565b9050919050565b600060208201905081810360008301526147b781613fdb565b9050919050565b600060208201905081810360008301526147d781613ffe565b9050919050565b600060208201905081810360008301526147f781614021565b9050919050565b6000602082019050818103600083015261481781614044565b9050919050565b6000602082019050818103600083015261483781614067565b9050919050565b600060208201905081810360008301526148578161408a565b9050919050565b60006020820190508181036000830152614877816140ad565b9050919050565b60006020820190508181036000830152614897816140d0565b9050919050565b600060208201905081810360008301526148b7816140f3565b9050919050565b600060208201905081810360008301526148d781614116565b9050919050565b600060208201905081810360008301526148f781614139565b9050919050565b600060208201905081810360008301526149178161415c565b9050919050565b600060208201905081810360008301526149378161417f565b9050919050565b60006020820190508181036000830152614957816141a2565b9050919050565b60006020820190508181036000830152614977816141c5565b9050919050565b60006020820190508181036000830152614997816141e8565b9050919050565b600060208201905081810360008301526149b78161420b565b9050919050565b60006020820190506149d3600083018461424c565b92915050565b600060c0820190506149ee600083018961424c565b6149fb6020830188613d3e565b614a086040830187613b69565b614a15606083018661424c565b614a226080830185613b69565b81810360a0830152614a348184613d95565b9050979650505050505050565b6000614a4b614a5c565b9050614a578282614e90565b919050565b6000604051905090565b600067ffffffffffffffff821115614a8157614a80614fdf565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614aad57614aac614fdf565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614ad957614ad8614fdf565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614b0557614b04614fdf565b5b614b0e8261500e565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081549050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000614bea82614dc6565b9150614bf583614dc6565b9250827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c2657614c25614f81565b5b828201905092915050565b6000614c3c82614dee565b9150614c4783614dee565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c7c57614c7b614f81565b5b828201905092915050565b6000614c9282614dee565b9150614c9d83614dee565b925082614cad57614cac614fb0565b5b828204905092915050565b6000614cc382614dee565b9150614cce83614dee565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d0757614d06614f81565b5b828202905092915050565b6000614d1d82614dee565b9150614d2883614dee565b925082821015614d3b57614d3a614f81565b5b828203905092915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6000614d6d82614da6565b9050919050565b60008115159050919050565b6000819050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b6000614e1382614d8a565b9050919050565b82818337600083830152505050565b60005b83811015614e47578082015181840152602081019050614e2c565b83811115614e56576000848401525b50505050565b6000614e6f614e6a83615039565b614d46565b9050919050565b6000614e89614e8483615046565b614d46565b9050919050565b614e998261500e565b810181811067ffffffffffffffff82111715614eb857614eb7614fdf565b5b80604052505050565b6000614ecc82614dee565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614eff57614efe614f81565b5b600182019050919050565b6000614f1582614df8565b915063ffffffff821415614f2c57614f2b614f81565b5b600182019050919050565b6000614f4282614f53565b9050919050565b6000819050919050565b6000614f5e8261502c565b9050919050565b6000819050919050565b6000614f7a8261501f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160e01b9050919050565b60008160601b9050919050565b60008160001c9050919050565b60008160801c9050919050565b7f56616c7565206f7574206f662072616e676520554e424f580000000000000000600082015250565b7f426574746572206e6f742064726177207761746572207769746820612073696560008201527f7665000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f6e6c792074686520706f6f6c2063726561746f722063616e2064657374727560008201527f63742e0000000000000000000000000000000000000000000000000000000000602082015250565b7f45786368616e676520746f6b656e20616464726573736573206e65656420746f60008201527f2062652073657400000000000000000000000000000000000000000000000000602082015250565b7f4e6f206d6f7265207468616e20325e31323820746f6b656e7328696e636c756960008201527f646e6720646563696d616c732920616c6c6f7765640000000000000000000000602082015250565b7f42616c616e6365206e6f7420656e6f7567680000000000000000000000000000600082015250565b7f416c726561647920737761707065640000000000000000000000000000000000600082015250565b7f4e6f742065787069726564207965740000000000000000000000000000000000600082015250565b7f43616e6e6f742073657420746f20300000000000000000000000000000000000600082015250565b7f53746172742074696d652073686f756c64206265206561726c6965722074686160008201527f6e20656e642074696d652e000000000000000000000000000000000000000000602082015250565b7f4e6f6e65206f66207468697320746f6b656e206c656674000000000000000000600082015250565b7f57726f6e672050617373776f7264000000000000000000000000000000000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656c696769626c65207768656e20756e6c6f636b5f74696d6520697360008201527f2030000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f7574206f662053746f636b0000000000000000000000000000000000000000600082015250565b7f496e737566666369656e7420616c6c6f77616e63650000000000000000000000600082015250565b7f4e6f20656e6f75676820616c6c6f77616e63652e000000000000000000000000600082015250565b7f546f6f204c617465000000000000000000000000000000000000000000000000600082015250565b7f53697a65206f6620726174696f73203d2032202a2073697a65206f662065786360008201527f68616e67655f6164647273000000000000000000000000000000000000000000602082015250565b7f4e6f7420612076616c6964204552433230000000000000000000000000000000600082015250565b7f506f6f6c2043726561746f72204f6e6c79000000000000000000000000000000600082015250565b7f457870697265642e000000000000000000000000000000000000000000000000600082015250565b7f56616c7565206f7574206f662072616e676520424f5800000000000000000000600082015250565b7f4e6f7420737461727465642e0000000000000000000000000000000000000000600082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f4c696d6974206e6565647320746f206265206c657373207468616e206f72206560008201527f7175616c20746f2074686520746f74616c20737570706c790000000000000000602082015250565b7f4f6e6c792074686520706f6f6c2063726561746f722063616e2077697468647260008201527f61772e0000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f20656e6f7567682065746865722e00000000000000000000000000000000600082015250565b7f4e6f74205175616c696669656400000000000000000000000000000000000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f56616c69646174696f6e204661696c6564000000000000000000000000000000600082015250565b7f456e642074696d652073686f756c64206265206561726c696572207468616e2060008201527f756e6c6f636b2074696d65000000000000000000000000000000000000000000602082015250565b61574481614d62565b811461574f57600080fd5b50565b61575b81614d74565b811461576657600080fd5b50565b61577281614d80565b811461577d57600080fd5b50565b61578981614d8a565b811461579457600080fd5b50565b6157a081614dee565b81146157ab57600080fd5b5056fea2646970667358221220abec04e7d9691f60de44d91ac9eed4f21450b1a3ae2e6436074a0545fd556a5064736f6c634300080100335072696e6365205068696c69702c20517565656e20456c697a616265746820494927732068757362616e642c20686173206469656420616765642039392c20202020204275636b696e6768616d2050616c6163652068617320616e6e6f756e6365642e20412073746174656d656e7420697373756564206279207468652070616c616365206a757374206166746572206d69646461792073706f6b65206f66207468652020202020517565656e2773206465657020736f72726f7720666f6c6c6f77696e67206869732064656174682061742057696e64736f7220436173746c65206f6e20467269646179206d6f726e696e672e205468652044756b65206f66204564696e627572
Deployed Bytecode
0x60806040526004361061007b5760003560e01c8063c6d898341161004e578063c6d8983414610141578063cc0cab4c14610171578063ec0e3d9a1461019a578063ef65dc7e146101c35761007b565b8063040cf020146100805780636bfdaece146100a9578063b391c508146100ed578063bf5c292014610116575b600080fd5b34801561008c57600080fd5b506100a760048036038101906100a2919061398d565b6101df565b005b3480156100b557600080fd5b506100d060048036038101906100cb91906138ed565b6105ff565b6040516100e49897969594939291906143d9565b60405180910390f35b3480156100f957600080fd5b50610114600480360381019061010f9190613883565b61096d565b005b34801561012257600080fd5b5061012b610c08565b6040516101389190614335565b60405180910390f35b61015b60048036038101906101569190613916565b610c2e565b60405161016891906149be565b60405180910390f35b34801561017d57600080fd5b50610198600480360381019061019391906138ed565b6118c4565b005b3480156101a657600080fd5b506101c160048036038101906101bc919061398d565b6120a1565b005b6101dd60048036038101906101d891906139c9565b61227c565b005b60006002600084815260200190815260200160002090508060020160069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610288576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027f906148fe565b60405180910390fd5b60008160050183815481106102c6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010029054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000811161034f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610346906146fe565b60405180910390fd5b60008060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166103aa846000015460e4601c612e02565b6103b49190614c31565b905060006103c9846001015460006080612e02565b905042821115806103da5750600081145b610419576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104109061469e565b60405180910390fd5b6000846004018681548110610457577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146104ea576104e581303387612e62565b610532565b3373ffffffffffffffffffffffffffffffffffffffff166108fc859081150290604051600060405180830381858888f19350505050158015610530573d6000803e3d6000fd5b505b6000856005018781548110610570577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010026101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055507fab5315d16ef405a1f4e8c34017af486f59f27097e003d2a1981ae682c2f367318782866040516105ee939291906144c6565b60405180910390a150505050505050565b606060008060008060008060606000600260008b8152602001908152602001600020905080600401610638826001015460006080612e02565b600060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610692846000015460c8601c612e02565b61069c9190614c31565b4211600060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166106f8856000015460e4601c612e02565b6107029190614c31565b4211600060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168560020160009054906101000a900465ffffffffffff1665ffffffffffff166107589190614bdf565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff164211600060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168660020160009054906101000a900465ffffffffffff1665ffffffffffff166107cc9190614bdf565b8660070160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054876005018780548060200260200160405190810160405280929190818152602001828054801561089357602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610849575b50505050509750827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1692508080548060200260200160405190810160405280929190818152602001828054801561094a57602002820191906000526020600020906000905b82829054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020019060100190602082600f010492830192600103820291508084116108f55790505b505050505090509850985098509850985098509850985050919395975091939597565b600080600090505b8251811015610c03576000600260008584815181106109bd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518152602001908152602001600020905060008160020160009054906101000a900465ffffffffffff1665ffffffffffff161415610a025750610bf0565b42600060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168260020160009054906101000a900465ffffffffffff1665ffffffffffff16610a579190614bdf565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff161115610a815750610bf0565b8060070160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205492506000831415610ad45750610bf0565b60008160070160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610b4b8160030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16303386612e62565b7f0b8bdb11ddec1f8dd879bd98afac7c33c30ce590fcbc26ed559df98f9a381119848381518110610ba5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101513342868560030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051610be6959493929190614549565b60405180910390a1505b8080610bfb90614ec1565b915050610975565b505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060026000888152602001908152602001600020905060006040518060400160405280836000015481526020018360010154815250905060011515610c7c8260000151600060a0612e02565b73ffffffffffffffffffffffffffffffffffffffff16637938037233600060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610cf2866000015160c8601c612e02565b610cfc9190614c31565b6040518363ffffffff1660e01b8152600401610d199291906143b0565b602060405180830381600087803b158015610d3357600080fd5b505af1158015610d47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6b91906138c4565b151514610dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da49061493e565b60405180910390fd5b42600060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610e08836000015160c8601c612e02565b610e129190614c31565b10610e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e499061489e565b60405180910390fd5b42600060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610ead836000015160e4601c612e02565b610eb79190614c31565b11610ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eee9061485e565b60405180910390fd5b610f08816000015160a06028612e02565b33604051602001610f1a929190614309565b604051602081830303815290604052805190602001208714610f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f689061471e565b60405180910390fd5b33604051602001610f829190614289565b604051602081830303815290604052805190602001208614610fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd09061497e565b60405180910390fd5b6000610fec826020015160006080612e02565b905060008111611031576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110289061477e565b60405180910390fd5b600083600401878154811061106f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000846006016002896110af9190614cb8565b815481106110e6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010029054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600085600601600160028b6111419190614cb8565b61114b9190614c31565b81548110611182577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010029054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561127757876fffffffffffffffffffffffffffffffff163414611272576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112699061491e565b60405180910390fd5b61135d565b60008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b81526004016112b4929190614350565b60206040518083038186803b1580156112cc57600080fd5b505afa1580156112e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113049190613b01565b9050886fffffffffffffffffffffffffffffffff1681101561135b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611352906147be565b60405180910390fd5b505b600061138461137e8a6fffffffffffffffffffffffffffffffff1684612f5e565b84612f74565b9050600081116113c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c0906145de565b60405180910390fd5b60006113db8760200151608080612e02565b905080821115611402578091506113fb6113f58286612f5e565b84612f74565b99506114df565b858211156114de5785915061142061141a8786612f5e565b84612f74565b9950600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156114dd573373ffffffffffffffffffffffffffffffffffffffff166108fc8b6fffffffffffffffffffffffffffffffff16346114b09190614d12565b9081150290604051600060405180830381858888f193505050501580156114db573d6000803e3d6000fd5b505b5b5b808211156114ec57600080fd5b611587886005018c8154811061152b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010029054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168b6fffffffffffffffffffffffffffffffff16612f8a565b886005018c815481106115c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010026101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060008860070160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611692576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116899061467e565b60405180910390fd5b6116ad8760200151600060806116a88a87612fa0565b612fb6565b8860010181905550818860070160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146117905761178f33308c6fffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16612fd1909392919063ffffffff16565b5b7fa6a9350e3cb78ab6117ff3f716716cb2a1c40e92008df3c4f60e976ee6d56edc8e33878b60030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168e876040516117ed96959493929190614465565b60405180910390a160008860020160009054906101000a900465ffffffffffff1665ffffffffffff1614156118b05761184c8860030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16303385612e62565b7f0b8bdb11ddec1f8dd879bd98afac7c33c30ce590fcbc26ed559df98f9a3811198e3342858c60030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040516118a7959493929190614549565b60405180910390a15b819850505050505050505095945050505050565b60006002600083815260200190815260200160002090508060020160069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461196d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611964906145fe565b60405180910390fd5b60008060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166119c8836000015460e4601c612e02565b6119d29190614c31565b905060006119e7836001015460006080612e02565b905042821115806119f85750600081145b611a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2e9061469e565b60405180910390fd5b60008114611a7057611a6f8360030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16303384612e62565b5b60005b8360040180549050811015611d96576000846005018281548110611ac0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010029054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff161115611d8357600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16846004018281548110611b7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611cbb57611cb6846004018281548110611c04577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163033876005018581548110611c6d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010029054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16612e62565b611d82565b3373ffffffffffffffffffffffffffffffffffffffff166108fc856005018381548110611d11577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010029054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169081150290604051600060405180830381858888f19350505050158015611d80573d6000803e3d6000fd5b505b5b8080611d8e90614ec1565b915050611a73565b507f01a1fd9d8a4231d7bd8926ce16b753ba03e0310e0a776f13eba8e0c3cba7ea89848460030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168386600501604051611df394939291906144fd565b60405180910390a1600083600001819055506000836001018190555060005b836004018054905081101561209a57600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846004018281548110611e80577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000846005018281548110611f06577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010026101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550600084600601600283611f649190614cb8565b81548110611f9b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010026101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506000846006016001600284611ffb9190614cb8565b6120059190614c31565b8154811061203c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010026101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550808061209290614ec1565b915050611e12565b5050505050565b60006002600084815260200190815260200160002090503373ffffffffffffffffffffffffffffffffffffffff168160020160069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461214a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121419061483e565b60405180910390fd5b8060020160009054906101000a900465ffffffffffff1665ffffffffffff1642106121aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a1906147de565b60405180910390fd5b60008160020160009054906101000a900465ffffffffffff1665ffffffffffff16141561220c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122039061475e565b60405180910390fd5b6000821415612250576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612247906146be565b60405180910390fd5b818160020160006101000a81548165ffffffffffff021916908365ffffffffffff160217905550505050565b60008081819054906101000a900463ffffffff168092919061229d90614f0a565b91906101000a81548163ffffffff021916908363ffffffff16021790555050888a106122fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f5906146de565b60405180910390fd5b8489108061230c5750600085145b61234b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123429061499e565b60405180910390fd5b8282111561238e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612385906148de565b60405180910390fd5b70010000000000000000000000000000000083106123e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d89061463e565b60405180910390fd5b828473ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b815260040161241d929190614350565b60206040518083038186803b15801561243557600080fd5b505afa158015612449573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061246d9190613b01565b10156124ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a59061479e565b60405180910390fd5b60008751116124f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e99061461e565b60405180910390fd5b865160026125009190614cb8565b865114612542576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612539906147fe565b60405180910390fd5b6000334260008054906101000a900463ffffffff1660035460405160200161256d94939291906142a4565b60405160208183030381529060405280519060200120905060006002600083815260200190815260200160002090506125a8838e8e8e61305a565b81600001819055506125ba85856130ce565b8160010181905550868160020160006101000a81548165ffffffffffff021916908365ffffffffffff160217905550338160020160066101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088816004019080519060200190612644929190613460565b50858160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060005b89518110156128a657600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168a8281518110612706577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161461282a5760008a8281518110612764577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156127b157600080fd5b505afa1580156127c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e99190613b01565b11612829576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128209061481e565b60405180910390fd5b5b81600501600090806001815401808255809150506001900390600052602060002090600291828204019190066010029091909190916101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550808061289e90614ec1565b91505061268b565b5060005b8851811015612d6b57600061296f8a83815181106128f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff168b6001856129199190614c31565b81518110612950577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff16612f74565b90506000612a2d8b6001856129849190614c31565b815181106129bb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff168c8581518110612a0e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff16612f74565b905060018b8481518110612a6a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff161415612af9578a600184612a989190614c31565b81518110612acf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff168114612af457600080fd5b612d55565b60018b600185612b099190614c31565b81518110612b40577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff161415612bc3578a8381518110612b99577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff168214612bbe57600080fd5b612d54565b8a8381518110612bfc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff168b600185612c249190614c31565b81518110612c5b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff1683612c809190614cb8565b1415612c8b57600080fd5b8a600184612c999190614c31565b81518110612cd0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff168b8481518110612d23577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff1682612d489190614cb8565b1415612d5357600080fd5b5b5b5050600281612d649190614c31565b90506128aa565b5087816006019080519060200190612d849291906134ea565b50612db23330878973ffffffffffffffffffffffffffffffffffffffff16612fd1909392919063ffffffff16565b7f67851705247ee2eaa9bf5ce64c064ee80704743e80b401abb46b36318f7be5cf858333428a8f604051612deb969594939291906149d9565b60405180910390a150505050505050505050505050565b6000612e1061010085613100565b612e4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e46906145be565b60405180910390fd5b83831c600180841b031690509392505050565b808473ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401612e9c9190614335565b60206040518083038186803b158015612eb457600080fd5b505afa158015612ec8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eec9190613b01565b1015612f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f249061465e565b60405180910390fd5b612f5882828673ffffffffffffffffffffffffffffffffffffffff166131169092919063ffffffff16565b50505050565b60008183612f6c9190614cb8565b905092915050565b60008183612f829190614c87565b905092915050565b60008183612f989190614c31565b905092915050565b60008183612fae9190614d12565b905092915050565b600081841b600180851b03851b198616179050949350505050565b613054846323b872dd60e01b858585604051602401612ff293929190614379565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061319c565b50505050565b60008060009050613084600060a08873ffffffffffffffffffffffffffffffffffffffff16613263565b8117905061309c60a0602860d88860001c901c613263565b811790506130ad60c8601c86613263565b811790506130be60e4601c85613263565b8117905080915050949350505050565b600080600090506130e26000608086613263565b811790506130f260808085613263565b811790508091505092915050565b6000816001841b11610100841417905092915050565b6131978363a9059cbb60e01b84846040516024016131359291906143b0565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061319c565b505050565b60006131fe826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166132ba9092919063ffffffff16565b905060008151111561325e578080602001905181019061321e91906138c4565b61325d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132549061495e565b60405180910390fd5b5b505050565b600061326f8383613100565b6132ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a59061487e565b60405180910390fd5b81841b90509392505050565b60606132c984846000856132d2565b90509392505050565b606082471015613317576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330e9061473e565b60405180910390fd5b613320856133e6565b61335f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613356906148be565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161338891906142f2565b60006040518083038185875af1925050503d80600081146133c5576040519150601f19603f3d011682016040523d82523d6000602084013e6133ca565b606091505b50915091506133da8282866133f9565b92505050949350505050565b600080823b905060008111915050919050565b6060831561340957829050613459565b60008351111561341c5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613450919061459c565b60405180910390fd5b9392505050565b8280548282559060005260206000209081019282156134d9579160200282015b828111156134d85782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613480565b5b5090506134e691906135be565b5090565b828054828255906000526020600020906001016002900481019282156135ad5791602002820160005b8382111561356f57835183826101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055509260200192601001602081600f01049283019260010302613513565b80156135ab5782816101000a8154906fffffffffffffffffffffffffffffffff0219169055601001602081600f0104928301926001030261356f565b505b5090506135ba91906135be565b5090565b5b808211156135d75760008160009055506001016135bf565b5090565b60006135ee6135e984614a66565b614a41565b9050808382526020820190508285602086028201111561360d57600080fd5b60005b8581101561363d5781613623888261375d565b845260208401935060208301925050600181019050613610565b5050509392505050565b600061365a61365584614a92565b614a41565b9050808382526020820190508285602086028201111561367957600080fd5b60005b858110156136a9578161368f8882613805565b84526020840193506020830192505060018101905061367c565b5050509392505050565b60006136c66136c184614abe565b614a41565b905080838252602082019050828560208602820111156136e557600080fd5b60005b8581101561371557816136fb8882613844565b8452602084019350602083019250506001810190506136e8565b5050509392505050565b600061373261372d84614aea565b614a41565b90508281526020810184848401111561374a57600080fd5b613755848285614e1a565b509392505050565b60008135905061376c8161573b565b92915050565b600082601f83011261378357600080fd5b81356137938482602086016135db565b91505092915050565b600082601f8301126137ad57600080fd5b81356137bd848260208601613647565b91505092915050565b600082601f8301126137d757600080fd5b81356137e78482602086016136b3565b91505092915050565b6000815190506137ff81615752565b92915050565b60008135905061381481615769565b92915050565b600082601f83011261382b57600080fd5b813561383b84826020860161371f565b91505092915050565b60008135905061385381615780565b92915050565b60008135905061386881615797565b92915050565b60008151905061387d81615797565b92915050565b60006020828403121561389557600080fd5b600082013567ffffffffffffffff8111156138af57600080fd5b6138bb8482850161379c565b91505092915050565b6000602082840312156138d657600080fd5b60006138e4848285016137f0565b91505092915050565b6000602082840312156138ff57600080fd5b600061390d84828501613805565b91505092915050565b600080600080600060a0868803121561392e57600080fd5b600061393c88828901613805565b955050602061394d88828901613805565b945050604061395e88828901613805565b935050606061396f88828901613859565b925050608061398088828901613844565b9150509295509295909350565b600080604083850312156139a057600080fd5b60006139ae85828601613805565b92505060206139bf85828601613859565b9150509250929050565b60008060008060008060008060008060006101608c8e0312156139eb57600080fd5b60006139f98e828f01613805565b9b50506020613a0a8e828f01613859565b9a50506040613a1b8e828f01613859565b99505060608c013567ffffffffffffffff811115613a3857600080fd5b613a448e828f0161381a565b98505060808c013567ffffffffffffffff811115613a6157600080fd5b613a6d8e828f01613772565b97505060a08c013567ffffffffffffffff811115613a8a57600080fd5b613a968e828f016137c6565b96505060c0613aa78e828f01613859565b95505060e0613ab88e828f0161375d565b945050610100613aca8e828f01613859565b935050610120613adc8e828f01613859565b925050610140613aee8e828f0161375d565b9150509295989b509295989b9093969950565b600060208284031215613b1357600080fd5b6000613b218482850161386e565b91505092915050565b6000613b368383613b5a565b60208301905092915050565b6000613b4e838361422e565b60208301905092915050565b613b6381614d62565b82525050565b613b7281614d62565b82525050565b613b89613b8482614d62565b614f37565b82525050565b6000613b9a82614b50565b613ba48185614ba1565b9350613baf83614b1b565b8060005b83811015613be0578151613bc78882613b2a565b9750613bd283614b87565b925050600181019050613bb3565b5085935050505092915050565b6000613bf882614b5b565b613c028185614bb2565b9350613c0d83614b2b565b8060005b83811015613c3e578151613c258882613b42565b9750613c3083614b94565b925050600181019050613c11565b5085935050505092915050565b6000613c5682614b66565b613c608185614bb2565b935083613c6c84614b3b565b6000600115613cc9575b83600160020382011015613cc8578154613c9888613c9383614e5c565b61422e565b602088019750613cb088613cab83614e76565b61422e565b60208801975060018301925050600281019050613c76565b5b600115613d2257815484821015613cf957613cec88613ce783614e5c565b61422e565b6020880197506001820191505b84821015613d2057613d1388613d0e83614e76565b61422e565b6020880197506001820191505b505b8694505050505092915050565b613d3881614d74565b82525050565b613d4781614d80565b82525050565b613d5e613d5982614d80565b614f49565b82525050565b6000613d6f82614b71565b613d798185614bc3565b9350613d89818560208601614e29565b80840191505092915050565b6000613da082614b7c565b613daa8185614bce565b9350613dba818560208601614e29565b613dc38161500e565b840191505092915050565b6000613ddb601883614bce565b9150613de682615053565b602082019050919050565b6000613dfe602283614bce565b9150613e098261507c565b604082019050919050565b6000613e21602383614bce565b9150613e2c826150cb565b604082019050919050565b6000613e44602783614bce565b9150613e4f8261511a565b604082019050919050565b6000613e67603583614bce565b9150613e7282615169565b604082019050919050565b6000613e8a601283614bce565b9150613e95826151b8565b602082019050919050565b6000613ead600f83614bce565b9150613eb8826151e1565b602082019050919050565b6000613ed0600f83614bce565b9150613edb8261520a565b602082019050919050565b6000613ef3600f83614bce565b9150613efe82615233565b602082019050919050565b6000613f16602b83614bce565b9150613f218261525c565b604082019050919050565b6000613f39601783614bce565b9150613f44826152ab565b602082019050919050565b6000613f5c600e83614bce565b9150613f67826152d4565b602082019050919050565b6000613f7f602683614bce565b9150613f8a826152fd565b604082019050919050565b6000613fa2602283614bce565b9150613fad8261534c565b604082019050919050565b6000613fc5600c83614bce565b9150613fd08261539b565b602082019050919050565b6000613fe8601583614bce565b9150613ff3826153c4565b602082019050919050565b600061400b601483614bce565b9150614016826153ed565b602082019050919050565b600061402e600883614bce565b915061403982615416565b602082019050919050565b6000614051602b83614bce565b915061405c8261543f565b604082019050919050565b6000614074601183614bce565b915061407f8261548e565b602082019050919050565b6000614097601183614bce565b91506140a2826154b7565b602082019050919050565b60006140ba600883614bce565b91506140c5826154e0565b602082019050919050565b60006140dd601683614bce565b91506140e882615509565b602082019050919050565b6000614100600c83614bce565b915061410b82615532565b602082019050919050565b6000614123601d83614bce565b915061412e8261555b565b602082019050919050565b6000614146603883614bce565b915061415182615584565b604082019050919050565b6000614169602383614bce565b9150614174826155d3565b604082019050919050565b600061418c601083614bce565b915061419782615622565b602082019050919050565b60006141af600d83614bce565b91506141ba8261564b565b602082019050919050565b60006141d2602a83614bce565b91506141dd82615674565b604082019050919050565b60006141f5601183614bce565b9150614200826156c3565b602082019050919050565b6000614218602b83614bce565b9150614223826156ec565b604082019050919050565b61423781614d8a565b82525050565b61424681614e08565b82525050565b61425581614dee565b82525050565b61426c61426782614dee565b614f65565b82525050565b61428361427e82614df8565b614f6f565b82525050565b60006142958284613b78565b60148201915081905092915050565b60006142b08287613b78565b6014820191506142c0828661425b565b6020820191506142d08285614272565b6004820191506142e08284613d4d565b60208201915081905095945050505050565b60006142fe8284613d64565b915081905092915050565b6000614315828561425b565b6020820191506143258284613b78565b6014820191508190509392505050565b600060208201905061434a6000830184613b69565b92915050565b60006040820190506143656000830185613b69565b6143726020830184613b69565b9392505050565b600060608201905061438e6000830186613b69565b61439b6020830185613b69565b6143a8604083018461424c565b949350505050565b60006040820190506143c56000830185613b69565b6143d2602083018461424c565b9392505050565b60006101008201905081810360008301526143f4818b613b8f565b9050614403602083018a61424c565b6144106040830189613d2f565b61441d6060830188613d2f565b61442a6080830187613d2f565b61443760a083018661424c565b61444460c083018561424c565b81810360e08301526144568184613bed565b90509998505050505050505050565b600060c08201905061447a6000830189613d3e565b6144876020830188613b69565b6144946040830187613b69565b6144a16060830186613b69565b6144ae608083018561423d565b6144bb60a083018461424c565b979650505050505050565b60006060820190506144db6000830186613d3e565b6144e86020830185613b69565b6144f5604083018461424c565b949350505050565b60006080820190506145126000830187613d3e565b61451f6020830186613b69565b61452c604083018561424c565b818103606083015261453e8184613c4b565b905095945050505050565b600060a08201905061455e6000830188613d3e565b61456b6020830187613b69565b614578604083018661424c565b614585606083018561424c565b6145926080830184613b69565b9695505050505050565b600060208201905081810360008301526145b68184613d95565b905092915050565b600060208201905081810360008301526145d781613dce565b9050919050565b600060208201905081810360008301526145f781613df1565b9050919050565b6000602082019050818103600083015261461781613e14565b9050919050565b6000602082019050818103600083015261463781613e37565b9050919050565b6000602082019050818103600083015261465781613e5a565b9050919050565b6000602082019050818103600083015261467781613e7d565b9050919050565b6000602082019050818103600083015261469781613ea0565b9050919050565b600060208201905081810360008301526146b781613ec3565b9050919050565b600060208201905081810360008301526146d781613ee6565b9050919050565b600060208201905081810360008301526146f781613f09565b9050919050565b6000602082019050818103600083015261471781613f2c565b9050919050565b6000602082019050818103600083015261473781613f4f565b9050919050565b6000602082019050818103600083015261475781613f72565b9050919050565b6000602082019050818103600083015261477781613f95565b9050919050565b6000602082019050818103600083015261479781613fb8565b9050919050565b600060208201905081810360008301526147b781613fdb565b9050919050565b600060208201905081810360008301526147d781613ffe565b9050919050565b600060208201905081810360008301526147f781614021565b9050919050565b6000602082019050818103600083015261481781614044565b9050919050565b6000602082019050818103600083015261483781614067565b9050919050565b600060208201905081810360008301526148578161408a565b9050919050565b60006020820190508181036000830152614877816140ad565b9050919050565b60006020820190508181036000830152614897816140d0565b9050919050565b600060208201905081810360008301526148b7816140f3565b9050919050565b600060208201905081810360008301526148d781614116565b9050919050565b600060208201905081810360008301526148f781614139565b9050919050565b600060208201905081810360008301526149178161415c565b9050919050565b600060208201905081810360008301526149378161417f565b9050919050565b60006020820190508181036000830152614957816141a2565b9050919050565b60006020820190508181036000830152614977816141c5565b9050919050565b60006020820190508181036000830152614997816141e8565b9050919050565b600060208201905081810360008301526149b78161420b565b9050919050565b60006020820190506149d3600083018461424c565b92915050565b600060c0820190506149ee600083018961424c565b6149fb6020830188613d3e565b614a086040830187613b69565b614a15606083018661424c565b614a226080830185613b69565b81810360a0830152614a348184613d95565b9050979650505050505050565b6000614a4b614a5c565b9050614a578282614e90565b919050565b6000604051905090565b600067ffffffffffffffff821115614a8157614a80614fdf565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614aad57614aac614fdf565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614ad957614ad8614fdf565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614b0557614b04614fdf565b5b614b0e8261500e565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081549050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000614bea82614dc6565b9150614bf583614dc6565b9250827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c2657614c25614f81565b5b828201905092915050565b6000614c3c82614dee565b9150614c4783614dee565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c7c57614c7b614f81565b5b828201905092915050565b6000614c9282614dee565b9150614c9d83614dee565b925082614cad57614cac614fb0565b5b828204905092915050565b6000614cc382614dee565b9150614cce83614dee565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d0757614d06614f81565b5b828202905092915050565b6000614d1d82614dee565b9150614d2883614dee565b925082821015614d3b57614d3a614f81565b5b828203905092915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6000614d6d82614da6565b9050919050565b60008115159050919050565b6000819050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b6000614e1382614d8a565b9050919050565b82818337600083830152505050565b60005b83811015614e47578082015181840152602081019050614e2c565b83811115614e56576000848401525b50505050565b6000614e6f614e6a83615039565b614d46565b9050919050565b6000614e89614e8483615046565b614d46565b9050919050565b614e998261500e565b810181811067ffffffffffffffff82111715614eb857614eb7614fdf565b5b80604052505050565b6000614ecc82614dee565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614eff57614efe614f81565b5b600182019050919050565b6000614f1582614df8565b915063ffffffff821415614f2c57614f2b614f81565b5b600182019050919050565b6000614f4282614f53565b9050919050565b6000819050919050565b6000614f5e8261502c565b9050919050565b6000819050919050565b6000614f7a8261501f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160e01b9050919050565b60008160601b9050919050565b60008160001c9050919050565b60008160801c9050919050565b7f56616c7565206f7574206f662072616e676520554e424f580000000000000000600082015250565b7f426574746572206e6f742064726177207761746572207769746820612073696560008201527f7665000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f6e6c792074686520706f6f6c2063726561746f722063616e2064657374727560008201527f63742e0000000000000000000000000000000000000000000000000000000000602082015250565b7f45786368616e676520746f6b656e20616464726573736573206e65656420746f60008201527f2062652073657400000000000000000000000000000000000000000000000000602082015250565b7f4e6f206d6f7265207468616e20325e31323820746f6b656e7328696e636c756960008201527f646e6720646563696d616c732920616c6c6f7765640000000000000000000000602082015250565b7f42616c616e6365206e6f7420656e6f7567680000000000000000000000000000600082015250565b7f416c726561647920737761707065640000000000000000000000000000000000600082015250565b7f4e6f742065787069726564207965740000000000000000000000000000000000600082015250565b7f43616e6e6f742073657420746f20300000000000000000000000000000000000600082015250565b7f53746172742074696d652073686f756c64206265206561726c6965722074686160008201527f6e20656e642074696d652e000000000000000000000000000000000000000000602082015250565b7f4e6f6e65206f66207468697320746f6b656e206c656674000000000000000000600082015250565b7f57726f6e672050617373776f7264000000000000000000000000000000000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656c696769626c65207768656e20756e6c6f636b5f74696d6520697360008201527f2030000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f7574206f662053746f636b0000000000000000000000000000000000000000600082015250565b7f496e737566666369656e7420616c6c6f77616e63650000000000000000000000600082015250565b7f4e6f20656e6f75676820616c6c6f77616e63652e000000000000000000000000600082015250565b7f546f6f204c617465000000000000000000000000000000000000000000000000600082015250565b7f53697a65206f6620726174696f73203d2032202a2073697a65206f662065786360008201527f68616e67655f6164647273000000000000000000000000000000000000000000602082015250565b7f4e6f7420612076616c6964204552433230000000000000000000000000000000600082015250565b7f506f6f6c2043726561746f72204f6e6c79000000000000000000000000000000600082015250565b7f457870697265642e000000000000000000000000000000000000000000000000600082015250565b7f56616c7565206f7574206f662072616e676520424f5800000000000000000000600082015250565b7f4e6f7420737461727465642e0000000000000000000000000000000000000000600082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f4c696d6974206e6565647320746f206265206c657373207468616e206f72206560008201527f7175616c20746f2074686520746f74616c20737570706c790000000000000000602082015250565b7f4f6e6c792074686520706f6f6c2063726561746f722063616e2077697468647260008201527f61772e0000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f20656e6f7567682065746865722e00000000000000000000000000000000600082015250565b7f4e6f74205175616c696669656400000000000000000000000000000000000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f56616c69646174696f6e204661696c6564000000000000000000000000000000600082015250565b7f456e642074696d652073686f756c64206265206561726c696572207468616e2060008201527f756e6c6f636b2074696d65000000000000000000000000000000000000000000602082015250565b61574481614d62565b811461574f57600080fd5b50565b61575b81614d74565b811461576657600080fd5b50565b61577281614d80565b811461577d57600080fd5b50565b61578981614d8a565b811461579457600080fd5b50565b6157a081614dee565b81146157ab57600080fd5b5056fea2646970667358221220abec04e7d9691f60de44d91ac9eed4f21450b1a3ae2e6436074a0545fd556a5064736f6c63430008010033
Deployed Bytecode Sourcemap
23294:24542:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42169:1063;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37100:1150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;38258:747;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25927:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31928:4663;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40108:1702;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39013:435;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27877:3312;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42169:1063;42234:17;42254:10;:14;42265:2;42254:14;;;;;;;;;;;42234:34;;42301:4;:12;;;;;;;;;;;;42287:26;;:10;:26;;;42279:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;42366:24;42393:4;:21;;42415:6;42393:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42366:56;;;;42460:1;42441:16;:20;42433:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;42500:18;42552:9;;;;;;;;;;;42521:40;;:28;42527:4;:12;;;42541:3;42546:2;42521:5;:28::i;:::-;:40;;;;:::i;:::-;42500:61;;42572:24;42599:27;42605:4;:12;;;42619:1;42622:3;42599:5;:27::i;:::-;42572:54;;42714:15;42700:10;:29;;:54;;;;42753:1;42733:16;:21;42700:54;42692:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;42785:21;42809:4;:19;;42829:6;42809:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42785:51;;42888:15;;;;;;;;;;;42871:32;;:13;:32;;;42867:216;;42918:74;42933:13;42956:4;42963:10;42975:16;42918:14;:74::i;:::-;42867:216;;;43045:10;43037:28;;:46;43066:16;43037:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42867:216;43155:1;43123:4;:21;;43145:6;43123:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;43172:52;43188:2;43192:13;43207:16;43172:52;;;;;;;;:::i;:::-;;;;;;;;42169:1063;;;;;;;:::o;37100:1150::-;37174:31;37207:17;37245:12;37259;37273:13;37288:19;37327:15;37344:33;37390:17;37410:10;:14;37421:2;37410:14;;;;;;;;;;;37390:34;;37457:4;:19;;37577:27;37583:4;:12;;;37597:1;37600:3;37577:5;:27::i;:::-;37720:9;;;;;;;;;;;37689:40;;:28;37695:4;:12;;;37709:3;37714:2;37689:5;:28::i;:::-;:40;;;;:::i;:::-;37671:15;:58;37812:9;;;;;;;;;;;37781:40;;:28;37787:4;:12;;;37801:3;37806:2;37781:5;:28::i;:::-;:40;;;;:::i;:::-;37763:15;:58;37892:9;;;;;;;;;;;37873:4;:16;;;;;;;;;;;;:28;;;;;;:::i;:::-;37855:46;;:15;:46;37967:9;;;;;;;;;;;37948:4;:16;;;;;;;;;;;;:28;;;;;;:::i;:::-;38044:4;:16;;:28;38061:10;38044:28;;;;;;;;;;;;;;;;38144:4;:21;;37435:807;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37100:1150;;;;;;;;;:::o;38258:747::-;38317:22;38355:9;38367:1;38355:13;;38350:648;38374:7;:14;38370:1;:18;38350:648;;;38410:17;38430:10;:22;38441:7;38449:1;38441:10;;;;;;;;;;;;;;;;;;;;;;38430:22;;;;;;;;;;;38410:42;;38491:1;38471:4;:16;;;;;;;;;;;;:21;;;38467:52;;;38511:8;;;38467:52;38569:15;38557:9;;;;;;;;;;;38538:4;:16;;;;;;;;;;;;:28;;;;;;:::i;:::-;:46;;;38534:77;;;38603:8;;;38534:77;38643:4;:16;;:28;38660:10;38643:28;;;;;;;;;;;;;;;;38626:45;;38708:1;38690:14;:19;38686:50;;;38728:8;;;38686:50;38782:1;38751:4;:16;;:28;38768:10;38751:28;;;;;;;;;;;;;;;:32;;;;38798:77;38813:4;:18;;;;;;;;;;;;38841:4;38848:10;38860:14;38798;:77::i;:::-;38897:89;38910:7;38918:1;38910:10;;;;;;;;;;;;;;;;;;;;;;38922;38934:15;38951:14;38967:4;:18;;;;;;;;;;;;38897:89;;;;;;;;;;:::i;:::-;;;;;;;;38350:648;;38390:3;;;;;:::i;:::-;;;;38350:648;;;;38258:747;;:::o;25927:31::-;;;;;;;;;;;;;:::o;31928:4663::-;32094:15;32124:17;32144:10;:14;32155:2;32144:14;;;;;;;;;;;32124:34;;32169:20;32192:34;;;;;;;;32199:4;:12;;;32192:34;;;;32213:4;:12;;;32192:34;;;32169:57;;32467:4;32260:211;;32321:29;32327:6;:14;;;32343:1;32346:3;32321:5;:29::i;:::-;32260:124;;;32385:10;32438:9;;;;;;;;;;;32405:42;;:30;32411:6;:14;;;32427:3;32432:2;32405:5;:30::i;:::-;:42;;;;:::i;:::-;32260:203;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:211;;;32237:276;;;;;;;;;;;;:::i;:::-;;;;;;;;;32578:15;32566:9;;;;;;;;;;;32533:42;;:30;32539:6;:14;;;32555:3;32560:2;32533:5;:30::i;:::-;:42;;;;:::i;:::-;:60;32524:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;32675:15;32663:9;;;;;;;;;;;32630:42;;:30;32636:6;:14;;;32652:3;32657:2;32630:5;:30::i;:::-;:42;;;;:::i;:::-;:60;32621:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;32876:30;32882:6;:14;;;32898:3;32903:2;32876:5;:30::i;:::-;32908:10;32859:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32849:71;;;;;;32833:12;:87;32824:134;;;;;;;;;;;;:::i;:::-;;;;;;;;;33136:10;33119:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;33109:39;;;;;;33095:10;:53;33086:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;33183:20;33206:29;33212:6;:14;;;33228:1;33231:3;33206:5;:29::i;:::-;33183:52;;33310:1;33295:12;:16;33286:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;33341:21;33365:4;:19;;33385:15;33365:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33341:60;;33412:14;33429:4;:11;;33457:1;33441:15;:17;;;;:::i;:::-;33429:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33412:47;;;;33470:14;33487:4;:11;;33519:1;33515;33499:15;:17;;;;:::i;:::-;:21;;;;:::i;:::-;33487:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33470:51;;;;33619:15;;;;;;;;;;;33602:32;;:13;:32;;;33598:301;;;33672:11;33659:24;;:9;:24;33651:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;33598:301;;;33737:17;33764:13;33757:31;;;33789:10;33809:4;33757:58;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33737:78;;33851:11;33838:24;;:9;:24;;33830:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;33598:301;;33911:22;34053:55;34066:33;34079:11;34066:33;;34092:6;34066:12;:33::i;:::-;34101:6;34053:12;:55::i;:::-;34036:72;;34182:1;34165:14;:18;34157:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34235:13;34251:31;34257:6;:14;;;34273:3;34278;34251:5;:31::i;:::-;34235:47;;34314:5;34297:14;:22;34293:688;;;34425:5;34408:22;;34467:49;34480:27;34493:5;34500:6;34480:12;:27::i;:::-;34509:6;34467:12;:49::i;:::-;34445:72;;34293:688;;;34588:12;34571:14;:29;34567:414;;;34684:12;34667:29;;34733:56;34746:34;34759:12;34773:6;34746:12;:34::i;:::-;34782:6;34733:12;:56::i;:::-;34711:79;;34882:15;;;;;;;;;;;34865:32;;:13;:32;;;34861:108;;;34924:10;34916:28;;:53;34957:11;34945:23;;:9;:23;;;;:::i;:::-;34916:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34861:108;34567:414;34293:688;35017:5;34999:14;:23;;34991:32;;;;;;35156:137;35169:4;:21;;35191:15;35169:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35156:137;;35281:11;35156:137;;:12;:137::i;:::-;35107:4;:21;;35129:15;35107:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:187;;;;;;;;;;;;;;;;;;35463:1;35431:4;:16;;:28;35448:10;35431:28;;;;;;;;;;;;;;;;:33;35422:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;35578:78;35589:6;:14;;;35605:1;35608:3;35613:42;35626:12;35640:14;35613:12;:42::i;:::-;35578:10;:78::i;:::-;35563:4;:12;;:93;;;;35698:14;35667:4;:16;;:28;35684:10;35667:28;;;;;;;;;;;;;;;:45;;;;35860:15;;;;;;;;;;;35843:32;;:13;:32;;;35839:143;;35892:78;35931:10;35951:4;35958:11;35892:78;;35899:13;35892:38;;;;:78;;;;;;:::i;:::-;35839:143;36030:91;36042:2;36046:10;36058:13;36073:4;:18;;;;;;;;;;;;36093:11;36106:14;36030:91;;;;;;;;;;;:::i;:::-;;;;;;;;36330:1;36310:4;:16;;;;;;;;;;;;:21;;;36306:232;;;36348:77;36363:4;:18;;;;;;;;;;;;36391:4;36398:10;36410:14;36348;:77::i;:::-;36445:81;36458:2;36462:10;36474:15;36491:14;36507:4;:18;;;;;;;;;;;;36445:81;;;;;;;;;;:::i;:::-;;;;;;;;36306:232;36569:14;36562:21;;;;;;;;;;31928:4663;;;;;;;:::o;40108:1702::-;40157:17;40177:10;:14;40188:2;40177:14;;;;;;;;;;;40157:34;;40224:4;:12;;;;;;;;;;;;40210:26;;:10;:26;;;40202:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;40289:18;40341:9;;;;;;;;;;;40310:40;;:28;40316:4;:12;;;40330:3;40335:2;40310:5;:28::i;:::-;:40;;;;:::i;:::-;40289:61;;40361:24;40388:27;40394:4;:12;;;40408:1;40411:3;40388:5;:27::i;:::-;40361:54;;40503:15;40489:10;:29;;:54;;;;40542:1;40522:16;:21;40489:54;40481:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;40636:1;40616:16;:21;40612:133;;40654:79;40669:4;:18;;;;;;;;;;;;40697:4;40704:10;40716:16;40654:14;:79::i;:::-;40612:133;40924:9;40919:460;40943:4;:19;;:26;;;;40939:1;:30;40919:460;;;41022:1;40995:4;:21;;41017:1;40995:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:28;;;40991:377;;;41100:15;;;;;;;;;;;41074:41;;:4;:19;;41094:1;41074:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:41;;;41070:282;;41138:91;41153:4;:19;;41173:1;41153:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41185:4;41192:10;41204:4;:21;;41226:1;41204:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41138:91;;:14;:91::i;:::-;41070:282;;;41306:10;41298:28;;:54;41327:4;:21;;41349:1;41327:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41298:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41070:282;40991:377;40971:3;;;;;:::i;:::-;;;;40919:460;;;;41394:80;41410:2;41414:4;:18;;;;;;;;;;;;41434:16;41452:4;:21;;41394:80;;;;;;;;;:::i;:::-;;;;;;;;41525:1;41510:4;:12;;:16;;;;41552:1;41537:4;:12;;:16;;;;41569:9;41564:239;41588:4;:19;;:26;;;;41584:1;:30;41564:239;;;41661:15;;;;;;;;;;;41636:4;:19;;41656:1;41636:22;;;;;;;;;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;41718:1;41691:4;:21;;41713:1;41691:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;41753:1;41734:4;:11;;41748:1;41746;:3;;;;:::i;:::-;41734:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;41790:1;41769:4;:11;;41785:1;41783;41781;:3;;;;:::i;:::-;:5;;;;:::i;:::-;41769:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;41616:3;;;;;:::i;:::-;;;;41564:239;;;;40108:1702;;;;:::o;39013:435::-;39088:17;39108:10;:14;39119:2;39108:14;;;;;;;;;;;39088:34;;39157:10;39141:26;;:4;:12;;;;;;;;;;;;:26;;;39133:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;39226:4;:16;;;;;;;;;;;;39208:34;;:15;:34;39200:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;39294:1;39274:4;:16;;;;;;;;;;;;:21;;;;39266:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39369:1;39353:12;:17;;39345:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;39427:12;39401:4;:16;;;:39;;;;;;;;;;;;;;;;;;39013:435;;;:::o;27877:3312::-;28212:5;;:8;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;28248:4;28239:6;:13;28231:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;28326:12;28319:4;:19;:40;;;;28358:1;28342:12;:17;28319:40;28311:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;28436:13;28426:6;:23;;28418:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;28545:8;28529:13;:24;28521:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;28690:13;28637:11;28630:29;;;28660:10;28680:4;28630:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:73;;28622:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;28773:1;28748:15;:22;:26;28740:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;28859:15;:22;28855:1;:26;;;;:::i;:::-;28837:7;:14;:44;28829:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;28942:11;28983:10;28995:15;29012:5;;;;;;;;;;29019:4;;28966:58;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28956:69;;;;;;28942:83;;29036:17;29056:10;:15;29067:3;29056:15;;;;;;;;;;;29036:35;;29097:42;29103:14;29119:5;29126:6;29134:4;29097:5;:42::i;:::-;29082:4;:12;;:57;;;;29204:28;29210:13;29225:6;29204:5;:28::i;:::-;29189:4;:12;;:43;;;;29322:12;29296:4;:16;;;:39;;;;;;;;;;;;;;;;;;29426:10;29411:4;:12;;;:25;;;;;;;;;;;;;;;;;;29535:15;29513:4;:19;;:37;;;;;;;;;;;;:::i;:::-;;29636:11;29615:4;:18;;;:32;;;;;;;;;;;;;;;;;;29780:9;29775:346;29799:15;:22;29795:1;:26;29775:346;;;29869:15;;;;;;;;;;;29847:37;;:15;29863:1;29847:18;;;;;;;;;;;;;;;;;;;;;;:37;;;29843:222;;30026:1;29990:15;30006:1;29990:18;;;;;;;;;;;;;;;;;;;;;;29983:38;;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;29975:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;29843:222;30079:4;:21;;30106:1;30079:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29823:3;;;;;:::i;:::-;;;;29775:346;;;;30203:9;30198:711;30222:7;:14;30218:1;:18;30198:711;;;30260:12;30275:38;30288:7;30296:1;30288:10;;;;;;;;;;;;;;;;;;;;;;30275:38;;30300:7;30310:1;30308;:3;;;;:::i;:::-;30300:12;;;;;;;;;;;;;;;;;;;;;;30275:38;;:12;:38::i;:::-;30260:53;;30370:12;30385:38;30398:7;30408:1;30406;:3;;;;:::i;:::-;30398:12;;;;;;;;;;;;;;;;;;;;;;30385:38;;30412:7;30420:1;30412:10;;;;;;;;;;;;;;;;;;;;;;30385:38;;:12;:38::i;:::-;30370:53;;30512:1;30498:7;30506:1;30498:10;;;;;;;;;;;;;;;;;;;;;;:15;;;30494:404;;;30550:7;30560:1;30558;:3;;;;:::i;:::-;30550:12;;;;;;;;;;;;;;;;;;;;;;30542:20;;:4;:20;30534:29;;;;;;30494:404;;;30605:1;30589:7;30599:1;30597;:3;;;;:::i;:::-;30589:12;;;;;;;;;;;;;;;;;;;;;;:17;;;30585:313;;;30643:7;30651:1;30643:10;;;;;;;;;;;;;;;;;;;;;;30635:18;;:4;:18;30627:27;;;;;;30585:313;;;30810:7;30818:1;30810:10;;;;;;;;;;;;;;;;;;;;;;30787:33;;30794:7;30804:1;30802;:3;;;;:::i;:::-;30794:12;;;;;;;;;;;;;;;;;;;;;;30787:19;;:4;:19;;;;:::i;:::-;:33;;30779:42;;;;;;30869:7;30879:1;30877;:3;;;;:::i;:::-;30869:12;;;;;;;;;;;;;;;;;;;;;;30848:33;;30855:7;30863:1;30855:10;;;;;;;;;;;;;;;;;;;;;;30848:17;;:4;:17;;;;:::i;:::-;:33;;30840:42;;;;;;30585:313;30494:404;30198:711;;30242:1;30238:5;;;;;:::i;:::-;;;30198:711;;;;30933:7;30919:4;:11;;:21;;;;;;;;;;;;:::i;:::-;;31003:78;31040:10;31060:4;31067:13;31010:11;31003:36;;;;:78;;;;;;:::i;:::-;31099:82;31111:13;31126:3;31131:10;31143:15;31160:11;31173:7;31099:82;;;;;;;;;;;:::i;:::-;;;;;;;;27877:3312;;;;;;;;;;;;;:::o;45752:336::-;45835:15;45871:21;45882:3;45887:4;45871:10;:21::i;:::-;45863:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;46062:4;46052:8;46048:19;46044:1;46040;46034:4;46030:12;46026:20;46022:46;46011:57;;45941:140;;;;;:::o;47494:333::-;47718:6;47674:13;47667:31;;;47699:14;47667:47;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;;47659:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;47758:61;47793:17;47812:6;47765:13;47758:34;;;;:61;;;;;:::i;:::-;47494:333;;;;:::o;18074:98::-;18132:7;18163:1;18159;:5;;;;:::i;:::-;18152:12;;18074:98;;;;:::o;18473:::-;18531:7;18562:1;18558;:5;;;;:::i;:::-;18551:12;;18473:98;;;;:::o;17336:::-;17394:7;17425:1;17421;:5;;;;:::i;:::-;17414:12;;17336:98;;;;:::o;17717:::-;17775:7;17806:1;17802;:5;;;;:::i;:::-;17795:12;;17717:98;;;;:::o;46789:395::-;46917:13;47160:4;47150:8;47146:19;47139:1;47135;47129:4;47125:12;47121:20;47111:8;47107:35;47103:40;47097:4;47093:51;47089:77;47080:86;;46952:225;;;;;;:::o;11618:205::-;11719:96;11739:5;11769:27;;;11798:4;11804:2;11808:5;11746:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11719:19;:96::i;:::-;11618:205;;;;:::o;43717:613::-;43847:15;43875:16;43894:1;43875:20;;43918:46;43922:1;43925:3;43947:14;43931:32;;43918:3;:46::i;:::-;43906:58;;;;44020:35;44024:3;44029:2;44051:3;44041:5;44033:14;;:21;;44020:3;:35::i;:::-;44008:47;;;;44119:20;44123:3;44128:2;44132:6;44119:3;:20::i;:::-;44107:32;;;;44217:18;44221:3;44226:2;44230:4;44217:3;:18::i;:::-;44205:30;;;;44314:8;44307:15;;;43717:613;;;;;;:::o;44529:339::-;44607:15;44635:16;44654:1;44635:20;;44678:26;44682:1;44685:3;44690:13;44678:3;:26::i;:::-;44666:38;;;;44776:21;44780:3;44785;44790:6;44776:3;:21::i;:::-;44764:33;;;;44852:8;44845:15;;;44529:339;;;;:::o;46254:234::-;46324:12;46464:4;46460:1;46454:4;46450:12;46447:22;46441:3;46435:4;46432:13;46429:41;46418:52;;46359:122;;;;:::o;11433:177::-;11516:86;11536:5;11566:23;;;11591:2;11595:5;11543:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11516:19;:86::i;:::-;11433:177;;;:::o;13867:761::-;14291:23;14317:69;14345:4;14317:69;;;;;;;;;;;;;;;;;14325:5;14317:27;;;;:69;;;;;:::i;:::-;14291:95;;14421:1;14401:10;:17;:21;14397:224;;;14543:10;14532:30;;;;;;;;;;;;:::i;:::-;14524:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;14397:224;13867:761;;;:::o;45165:278::-;45246:13;45280:22;45291:4;45297;45280:10;:22::i;:::-;45272:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;45420:4;45410:8;45406:19;45397:28;;45349:87;;;;;:::o;6566:195::-;6669:12;6701:52;6723:6;6731:4;6737:1;6740:12;6701:21;:52::i;:::-;6694:59;;6566:195;;;;;:::o;7618:530::-;7745:12;7803:5;7778:21;:30;;7770:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;7870:18;7881:6;7870:10;:18::i;:::-;7862:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;7996:12;8010:23;8037:6;:11;;8057:5;8065:4;8037:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7995:75;;;;8088:52;8106:7;8115:10;8127:12;8088:17;:52::i;:::-;8081:59;;;;7618:530;;;;;;:::o;3648:422::-;3708:4;3916:12;4027:7;4015:20;4007:28;;4061:1;4054:4;:8;4047:15;;;3648:422;;;:::o;10158:742::-;10273:12;10302:7;10298:595;;;10333:10;10326:17;;;;10298:595;10467:1;10447:10;:17;:21;10443:439;;;10710:10;10704:17;10771:15;10758:10;10754:2;10750:19;10743:44;10658:148;10853:12;10846:20;;;;;;;;;;;:::i;:::-;;;;;;;;10158:742;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:623:1:-;;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;274:6;267:5;260:21;300:4;293:5;289:16;282:23;;325:6;375:3;367:4;359:6;355:17;350:3;346:27;343:36;340:2;;;392:1;389;382:12;340:2;420:1;405:236;430:6;427:1;424:13;405:236;;;497:3;525:37;558:3;546:10;525:37;:::i;:::-;520:3;513:50;592:4;587:3;583:14;576:21;;626:4;621:3;617:14;610:21;;465:176;452:1;449;445:9;440:14;;405:236;;;409:14;126:521;;;;;;;:::o;670:623::-;;791:81;807:64;864:6;807:64;:::i;:::-;791:81;:::i;:::-;782:90;;892:5;920:6;913:5;906:21;946:4;939:5;935:16;928:23;;971:6;1021:3;1013:4;1005:6;1001:17;996:3;992:27;989:36;986:2;;;1038:1;1035;1028:12;986:2;1066:1;1051:236;1076:6;1073:1;1070:13;1051:236;;;1143:3;1171:37;1204:3;1192:10;1171:37;:::i;:::-;1166:3;1159:50;1238:4;1233:3;1229:14;1222:21;;1272:4;1267:3;1263:14;1256:21;;1111:176;1098:1;1095;1091:9;1086:14;;1051:236;;;1055:14;772:521;;;;;;;:::o;1316:623::-;;1437:81;1453:64;1510:6;1453:64;:::i;:::-;1437:81;:::i;:::-;1428:90;;1538:5;1566:6;1559:5;1552:21;1592:4;1585:5;1581:16;1574:23;;1617:6;1667:3;1659:4;1651:6;1647:17;1642:3;1638:27;1635:36;1632:2;;;1684:1;1681;1674:12;1632:2;1712:1;1697:236;1722:6;1719:1;1716:13;1697:236;;;1789:3;1817:37;1850:3;1838:10;1817:37;:::i;:::-;1812:3;1805:50;1884:4;1879:3;1875:14;1868:21;;1918:4;1913:3;1909:14;1902:21;;1757:176;1744:1;1741;1737:9;1732:14;;1697:236;;;1701:14;1418:521;;;;;;;:::o;1945:345::-;;2048:66;2064:49;2106:6;2064:49;:::i;:::-;2048:66;:::i;:::-;2039:75;;2137:6;2130:5;2123:21;2175:4;2168:5;2164:16;2213:3;2204:6;2199:3;2195:16;2192:25;2189:2;;;2230:1;2227;2220:12;2189:2;2243:41;2277:6;2272:3;2267;2243:41;:::i;:::-;2029:261;;;;;;:::o;2296:139::-;;2380:6;2367:20;2358:29;;2396:33;2423:5;2396:33;:::i;:::-;2348:87;;;;:::o;2458:303::-;;2578:3;2571:4;2563:6;2559:17;2555:27;2545:2;;2596:1;2593;2586:12;2545:2;2636:6;2623:20;2661:94;2751:3;2743:6;2736:4;2728:6;2724:17;2661:94;:::i;:::-;2652:103;;2535:226;;;;;:::o;2784:303::-;;2904:3;2897:4;2889:6;2885:17;2881:27;2871:2;;2922:1;2919;2912:12;2871:2;2962:6;2949:20;2987:94;3077:3;3069:6;3062:4;3054:6;3050:17;2987:94;:::i;:::-;2978:103;;2861:226;;;;;:::o;3110:303::-;;3230:3;3223:4;3215:6;3211:17;3207:27;3197:2;;3248:1;3245;3238:12;3197:2;3288:6;3275:20;3313:94;3403:3;3395:6;3388:4;3380:6;3376:17;3313:94;:::i;:::-;3304:103;;3187:226;;;;;:::o;3419:137::-;;3504:6;3498:13;3489:22;;3520:30;3544:5;3520:30;:::i;:::-;3479:77;;;;:::o;3562:139::-;;3646:6;3633:20;3624:29;;3662:33;3689:5;3662:33;:::i;:::-;3614:87;;;;:::o;3721:273::-;;3826:3;3819:4;3811:6;3807:17;3803:27;3793:2;;3844:1;3841;3834:12;3793:2;3884:6;3871:20;3909:79;3984:3;3976:6;3969:4;3961:6;3957:17;3909:79;:::i;:::-;3900:88;;3783:211;;;;;:::o;4000:139::-;;4084:6;4071:20;4062:29;;4100:33;4127:5;4100:33;:::i;:::-;4052:87;;;;:::o;4145:139::-;;4229:6;4216:20;4207:29;;4245:33;4272:5;4245:33;:::i;:::-;4197:87;;;;:::o;4290:143::-;;4378:6;4372:13;4363:22;;4394:33;4421:5;4394:33;:::i;:::-;4353:80;;;;:::o;4439:405::-;;4572:2;4560:9;4551:7;4547:23;4543:32;4540:2;;;4588:1;4585;4578:12;4540:2;4659:1;4648:9;4644:17;4631:31;4689:18;4681:6;4678:30;4675:2;;;4721:1;4718;4711:12;4675:2;4749:78;4819:7;4810:6;4799:9;4795:22;4749:78;:::i;:::-;4739:88;;4602:235;4530:314;;;;:::o;4850:278::-;;4966:2;4954:9;4945:7;4941:23;4937:32;4934:2;;;4982:1;4979;4972:12;4934:2;5025:1;5050:61;5103:7;5094:6;5083:9;5079:22;5050:61;:::i;:::-;5040:71;;4996:125;4924:204;;;;:::o;5134:262::-;;5242:2;5230:9;5221:7;5217:23;5213:32;5210:2;;;5258:1;5255;5248:12;5210:2;5301:1;5326:53;5371:7;5362:6;5351:9;5347:22;5326:53;:::i;:::-;5316:63;;5272:117;5200:196;;;;:::o;5402:844::-;;;;;;5578:3;5566:9;5557:7;5553:23;5549:33;5546:2;;;5595:1;5592;5585:12;5546:2;5638:1;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5609:117;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5893:2;5919:53;5964:7;5955:6;5944:9;5940:22;5919:53;:::i;:::-;5909:63;;5864:118;6021:2;6047:53;6092:7;6083:6;6072:9;6068:22;6047:53;:::i;:::-;6037:63;;5992:118;6149:3;6176:53;6221:7;6212:6;6201:9;6197:22;6176:53;:::i;:::-;6166:63;;6120:119;5536:710;;;;;;;;:::o;6252:407::-;;;6377:2;6365:9;6356:7;6352:23;6348:32;6345:2;;;6393:1;6390;6383:12;6345:2;6436:1;6461:53;6506:7;6497:6;6486:9;6482:22;6461:53;:::i;:::-;6451:63;;6407:117;6563:2;6589:53;6634:7;6625:6;6614:9;6610:22;6589:53;:::i;:::-;6579:63;;6534:118;6335:324;;;;;:::o;6665:2121::-;;;;;;;;;;;;7004:3;6992:9;6983:7;6979:23;6975:33;6972:2;;;7021:1;7018;7011:12;6972:2;7064:1;7089:53;7134:7;7125:6;7114:9;7110:22;7089:53;:::i;:::-;7079:63;;7035:117;7191:2;7217:53;7262:7;7253:6;7242:9;7238:22;7217:53;:::i;:::-;7207:63;;7162:118;7319:2;7345:53;7390:7;7381:6;7370:9;7366:22;7345:53;:::i;:::-;7335:63;;7290:118;7475:2;7464:9;7460:18;7447:32;7506:18;7498:6;7495:30;7492:2;;;7538:1;7535;7528:12;7492:2;7566:63;7621:7;7612:6;7601:9;7597:22;7566:63;:::i;:::-;7556:73;;7418:221;7706:3;7695:9;7691:19;7678:33;7738:18;7730:6;7727:30;7724:2;;;7770:1;7767;7760:12;7724:2;7798:78;7868:7;7859:6;7848:9;7844:22;7798:78;:::i;:::-;7788:88;;7649:237;7953:3;7942:9;7938:19;7925:33;7985:18;7977:6;7974:30;7971:2;;;8017:1;8014;8007:12;7971:2;8045:78;8115:7;8106:6;8095:9;8091:22;8045:78;:::i;:::-;8035:88;;7896:237;8172:3;8199:53;8244:7;8235:6;8224:9;8220:22;8199:53;:::i;:::-;8189:63;;8143:119;8301:3;8328:53;8373:7;8364:6;8353:9;8349:22;8328:53;:::i;:::-;8318:63;;8272:119;8430:3;8457:53;8502:7;8493:6;8482:9;8478:22;8457:53;:::i;:::-;8447:63;;8401:119;8559:3;8586:53;8631:7;8622:6;8611:9;8607:22;8586:53;:::i;:::-;8576:63;;8530:119;8688:3;8716:53;8761:7;8752:6;8741:9;8737:22;8716:53;:::i;:::-;8705:64;;8659:120;6962:1824;;;;;;;;;;;;;;:::o;8792:284::-;;8911:2;8899:9;8890:7;8886:23;8882:32;8879:2;;;8927:1;8924;8917:12;8879:2;8970:1;8995:64;9051:7;9042:6;9031:9;9027:22;8995:64;:::i;:::-;8985:74;;8941:128;8869:207;;;;:::o;9082:179::-;;9172:46;9214:3;9206:6;9172:46;:::i;:::-;9250:4;9245:3;9241:14;9227:28;;9162:99;;;;:::o;9267:179::-;;9357:46;9399:3;9391:6;9357:46;:::i;:::-;9435:4;9430:3;9426:14;9412:28;;9347:99;;;;:::o;9452:108::-;9529:24;9547:5;9529:24;:::i;:::-;9524:3;9517:37;9507:53;;:::o;9566:118::-;9653:24;9671:5;9653:24;:::i;:::-;9648:3;9641:37;9631:53;;:::o;9690:157::-;9795:45;9815:24;9833:5;9815:24;:::i;:::-;9795:45;:::i;:::-;9790:3;9783:58;9773:74;;:::o;9883:732::-;;10031:54;10079:5;10031:54;:::i;:::-;10101:86;10180:6;10175:3;10101:86;:::i;:::-;10094:93;;10211:56;10261:5;10211:56;:::i;:::-;10290:7;10321:1;10306:284;10331:6;10328:1;10325:13;10306:284;;;10407:6;10401:13;10434:63;10493:3;10478:13;10434:63;:::i;:::-;10427:70;;10520:60;10573:6;10520:60;:::i;:::-;10510:70;;10366:224;10353:1;10350;10346:9;10341:14;;10306:284;;;10310:14;10606:3;10599:10;;10007:608;;;;;;;:::o;10651:732::-;;10799:54;10847:5;10799:54;:::i;:::-;10869:86;10948:6;10943:3;10869:86;:::i;:::-;10862:93;;10979:56;11029:5;10979:56;:::i;:::-;11058:7;11089:1;11074:284;11099:6;11096:1;11093:13;11074:284;;;11175:6;11169:13;11202:63;11261:3;11246:13;11202:63;:::i;:::-;11195:70;;11288:60;11341:6;11288:60;:::i;:::-;11278:70;;11134:224;11121:1;11118;11114:9;11109:14;;11074:284;;;11078:14;11374:3;11367:10;;10775:608;;;;;;;:::o;11419:1682::-;;11564:51;11609:5;11564:51;:::i;:::-;11631:86;11710:6;11705:3;11631:86;:::i;:::-;11624:93;;11745:3;11771:53;11818:5;11771:53;:::i;:::-;11852:1;11865;11862:2;;;11929:503;11969:6;11964:1;11961;11957:9;11944:11;11940:27;11937:39;11929:503;;;12076:6;12070:13;12101:90;12187:3;12135:50;12180:4;12135:50;:::i;:::-;12101:90;:::i;:::-;12224:4;12219:3;12215:14;12208:21;;12247:91;12334:3;12281:51;12327:4;12281:51;:::i;:::-;12247:91;:::i;:::-;12371:4;12366:3;12362:14;12355:21;;12416:1;12408:6;12404:14;12394:24;;12040:392;12023:1;12010:11;12006:19;11991:34;;11929:503;;;11862:2;12519:1;12516:2;;;12553:6;12547:13;12593:6;12580:11;12577:23;12574:2;;;12619:90;12705:3;12653:50;12698:4;12653:50;:::i;:::-;12619:90;:::i;:::-;12742:4;12737:3;12733:14;12726:21;;12796:1;12783:11;12779:19;12764:34;;12574:2;12845:6;12832:11;12829:23;12826:2;;;12871:91;12958:3;12905:51;12951:4;12905:51;:::i;:::-;12871:91;:::i;:::-;12995:4;12990:3;12986:14;12979:21;;13049:1;13036:11;13032:19;13017:34;;12826:2;12521:555;12516:2;13092:3;13085:10;;11540:1561;;;;;;;;:::o;13107:109::-;13188:21;13203:5;13188:21;:::i;:::-;13183:3;13176:34;13166:50;;:::o;13222:118::-;13309:24;13327:5;13309:24;:::i;:::-;13304:3;13297:37;13287:53;;:::o;13346:157::-;13451:45;13471:24;13489:5;13471:24;:::i;:::-;13451:45;:::i;:::-;13446:3;13439:58;13429:74;;:::o;13509:373::-;;13641:38;13673:5;13641:38;:::i;:::-;13695:88;13776:6;13771:3;13695:88;:::i;:::-;13688:95;;13792:52;13837:6;13832:3;13825:4;13818:5;13814:16;13792:52;:::i;:::-;13869:6;13864:3;13860:16;13853:23;;13617:265;;;;;:::o;13888:364::-;;14004:39;14037:5;14004:39;:::i;:::-;14059:71;14123:6;14118:3;14059:71;:::i;:::-;14052:78;;14139:52;14184:6;14179:3;14172:4;14165:5;14161:16;14139:52;:::i;:::-;14216:29;14238:6;14216:29;:::i;:::-;14211:3;14207:39;14200:46;;13980:272;;;;;:::o;14258:366::-;;14421:67;14485:2;14480:3;14421:67;:::i;:::-;14414:74;;14497:93;14586:3;14497:93;:::i;:::-;14615:2;14610:3;14606:12;14599:19;;14404:220;;;:::o;14630:366::-;;14793:67;14857:2;14852:3;14793:67;:::i;:::-;14786:74;;14869:93;14958:3;14869:93;:::i;:::-;14987:2;14982:3;14978:12;14971:19;;14776:220;;;:::o;15002:366::-;;15165:67;15229:2;15224:3;15165:67;:::i;:::-;15158:74;;15241:93;15330:3;15241:93;:::i;:::-;15359:2;15354:3;15350:12;15343:19;;15148:220;;;:::o;15374:366::-;;15537:67;15601:2;15596:3;15537:67;:::i;:::-;15530:74;;15613:93;15702:3;15613:93;:::i;:::-;15731:2;15726:3;15722:12;15715:19;;15520:220;;;:::o;15746:366::-;;15909:67;15973:2;15968:3;15909:67;:::i;:::-;15902:74;;15985:93;16074:3;15985:93;:::i;:::-;16103:2;16098:3;16094:12;16087:19;;15892:220;;;:::o;16118:366::-;;16281:67;16345:2;16340:3;16281:67;:::i;:::-;16274:74;;16357:93;16446:3;16357:93;:::i;:::-;16475:2;16470:3;16466:12;16459:19;;16264:220;;;:::o;16490:366::-;;16653:67;16717:2;16712:3;16653:67;:::i;:::-;16646:74;;16729:93;16818:3;16729:93;:::i;:::-;16847:2;16842:3;16838:12;16831:19;;16636:220;;;:::o;16862:366::-;;17025:67;17089:2;17084:3;17025:67;:::i;:::-;17018:74;;17101:93;17190:3;17101:93;:::i;:::-;17219:2;17214:3;17210:12;17203:19;;17008:220;;;:::o;17234:366::-;;17397:67;17461:2;17456:3;17397:67;:::i;:::-;17390:74;;17473:93;17562:3;17473:93;:::i;:::-;17591:2;17586:3;17582:12;17575:19;;17380:220;;;:::o;17606:366::-;;17769:67;17833:2;17828:3;17769:67;:::i;:::-;17762:74;;17845:93;17934:3;17845:93;:::i;:::-;17963:2;17958:3;17954:12;17947:19;;17752:220;;;:::o;17978:366::-;;18141:67;18205:2;18200:3;18141:67;:::i;:::-;18134:74;;18217:93;18306:3;18217:93;:::i;:::-;18335:2;18330:3;18326:12;18319:19;;18124:220;;;:::o;18350:366::-;;18513:67;18577:2;18572:3;18513:67;:::i;:::-;18506:74;;18589:93;18678:3;18589:93;:::i;:::-;18707:2;18702:3;18698:12;18691:19;;18496:220;;;:::o;18722:366::-;;18885:67;18949:2;18944:3;18885:67;:::i;:::-;18878:74;;18961:93;19050:3;18961:93;:::i;:::-;19079:2;19074:3;19070:12;19063:19;;18868:220;;;:::o;19094:366::-;;19257:67;19321:2;19316:3;19257:67;:::i;:::-;19250:74;;19333:93;19422:3;19333:93;:::i;:::-;19451:2;19446:3;19442:12;19435:19;;19240:220;;;:::o;19466:366::-;;19629:67;19693:2;19688:3;19629:67;:::i;:::-;19622:74;;19705:93;19794:3;19705:93;:::i;:::-;19823:2;19818:3;19814:12;19807:19;;19612:220;;;:::o;19838:366::-;;20001:67;20065:2;20060:3;20001:67;:::i;:::-;19994:74;;20077:93;20166:3;20077:93;:::i;:::-;20195:2;20190:3;20186:12;20179:19;;19984:220;;;:::o;20210:366::-;;20373:67;20437:2;20432:3;20373:67;:::i;:::-;20366:74;;20449:93;20538:3;20449:93;:::i;:::-;20567:2;20562:3;20558:12;20551:19;;20356:220;;;:::o;20582:365::-;;20745:66;20809:1;20804:3;20745:66;:::i;:::-;20738:73;;20820:93;20909:3;20820:93;:::i;:::-;20938:2;20933:3;20929:12;20922:19;;20728:219;;;:::o;20953:366::-;;21116:67;21180:2;21175:3;21116:67;:::i;:::-;21109:74;;21192:93;21281:3;21192:93;:::i;:::-;21310:2;21305:3;21301:12;21294:19;;21099:220;;;:::o;21325:366::-;;21488:67;21552:2;21547:3;21488:67;:::i;:::-;21481:74;;21564:93;21653:3;21564:93;:::i;:::-;21682:2;21677:3;21673:12;21666:19;;21471:220;;;:::o;21697:366::-;;21860:67;21924:2;21919:3;21860:67;:::i;:::-;21853:74;;21936:93;22025:3;21936:93;:::i;:::-;22054:2;22049:3;22045:12;22038:19;;21843:220;;;:::o;22069:365::-;;22232:66;22296:1;22291:3;22232:66;:::i;:::-;22225:73;;22307:93;22396:3;22307:93;:::i;:::-;22425:2;22420:3;22416:12;22409:19;;22215:219;;;:::o;22440:366::-;;22603:67;22667:2;22662:3;22603:67;:::i;:::-;22596:74;;22679:93;22768:3;22679:93;:::i;:::-;22797:2;22792:3;22788:12;22781:19;;22586:220;;;:::o;22812:366::-;;22975:67;23039:2;23034:3;22975:67;:::i;:::-;22968:74;;23051:93;23140:3;23051:93;:::i;:::-;23169:2;23164:3;23160:12;23153:19;;22958:220;;;:::o;23184:366::-;;23347:67;23411:2;23406:3;23347:67;:::i;:::-;23340:74;;23423:93;23512:3;23423:93;:::i;:::-;23541:2;23536:3;23532:12;23525:19;;23330:220;;;:::o;23556:366::-;;23719:67;23783:2;23778:3;23719:67;:::i;:::-;23712:74;;23795:93;23884:3;23795:93;:::i;:::-;23913:2;23908:3;23904:12;23897:19;;23702:220;;;:::o;23928:366::-;;24091:67;24155:2;24150:3;24091:67;:::i;:::-;24084:74;;24167:93;24256:3;24167:93;:::i;:::-;24285:2;24280:3;24276:12;24269:19;;24074:220;;;:::o;24300:366::-;;24463:67;24527:2;24522:3;24463:67;:::i;:::-;24456:74;;24539:93;24628:3;24539:93;:::i;:::-;24657:2;24652:3;24648:12;24641:19;;24446:220;;;:::o;24672:366::-;;24835:67;24899:2;24894:3;24835:67;:::i;:::-;24828:74;;24911:93;25000:3;24911:93;:::i;:::-;25029:2;25024:3;25020:12;25013:19;;24818:220;;;:::o;25044:366::-;;25207:67;25271:2;25266:3;25207:67;:::i;:::-;25200:74;;25283:93;25372:3;25283:93;:::i;:::-;25401:2;25396:3;25392:12;25385:19;;25190:220;;;:::o;25416:366::-;;25579:67;25643:2;25638:3;25579:67;:::i;:::-;25572:74;;25655:93;25744:3;25655:93;:::i;:::-;25773:2;25768:3;25764:12;25757:19;;25562:220;;;:::o;25788:366::-;;25951:67;26015:2;26010:3;25951:67;:::i;:::-;25944:74;;26027:93;26116:3;26027:93;:::i;:::-;26145:2;26140:3;26136:12;26129:19;;25934:220;;;:::o;26160:108::-;26237:24;26255:5;26237:24;:::i;:::-;26232:3;26225:37;26215:53;;:::o;26274:131::-;26361:37;26392:5;26361:37;:::i;:::-;26356:3;26349:50;26339:66;;:::o;26411:118::-;26498:24;26516:5;26498:24;:::i;:::-;26493:3;26486:37;26476:53;;:::o;26535:157::-;26640:45;26660:24;26678:5;26660:24;:::i;:::-;26640:45;:::i;:::-;26635:3;26628:58;26618:74;;:::o;26698:153::-;26801:43;26820:23;26837:5;26820:23;:::i;:::-;26801:43;:::i;:::-;26796:3;26789:56;26779:72;;:::o;26857:256::-;;26984:75;27055:3;27046:6;26984:75;:::i;:::-;27084:2;27079:3;27075:12;27068:19;;27104:3;27097:10;;26973:140;;;;:::o;27119:674::-;;27328:75;27399:3;27390:6;27328:75;:::i;:::-;27428:2;27423:3;27419:12;27412:19;;27441:75;27512:3;27503:6;27441:75;:::i;:::-;27541:2;27536:3;27532:12;27525:19;;27554:73;27623:3;27614:6;27554:73;:::i;:::-;27652:1;27647:3;27643:11;27636:18;;27664:75;27735:3;27726:6;27664:75;:::i;:::-;27764:2;27759:3;27755:12;27748:19;;27784:3;27777:10;;27317:476;;;;;;;:::o;27799:271::-;;27951:93;28040:3;28031:6;27951:93;:::i;:::-;27944:100;;28061:3;28054:10;;27933:137;;;;:::o;28076:397::-;;28231:75;28302:3;28293:6;28231:75;:::i;:::-;28331:2;28326:3;28322:12;28315:19;;28344:75;28415:3;28406:6;28344:75;:::i;:::-;28444:2;28439:3;28435:12;28428:19;;28464:3;28457:10;;28220:253;;;;;:::o;28479:222::-;;28610:2;28599:9;28595:18;28587:26;;28623:71;28691:1;28680:9;28676:17;28667:6;28623:71;:::i;:::-;28577:124;;;;:::o;28707:332::-;;28866:2;28855:9;28851:18;28843:26;;28879:71;28947:1;28936:9;28932:17;28923:6;28879:71;:::i;:::-;28960:72;29028:2;29017:9;29013:18;29004:6;28960:72;:::i;:::-;28833:206;;;;;:::o;29045:442::-;;29232:2;29221:9;29217:18;29209:26;;29245:71;29313:1;29302:9;29298:17;29289:6;29245:71;:::i;:::-;29326:72;29394:2;29383:9;29379:18;29370:6;29326:72;:::i;:::-;29408;29476:2;29465:9;29461:18;29452:6;29408:72;:::i;:::-;29199:288;;;;;;:::o;29493:332::-;;29652:2;29641:9;29637:18;29629:26;;29665:71;29733:1;29722:9;29718:17;29709:6;29665:71;:::i;:::-;29746:72;29814:2;29803:9;29799:18;29790:6;29746:72;:::i;:::-;29619:206;;;;;:::o;29831:1263::-;;30240:3;30229:9;30225:19;30217:27;;30290:9;30284:4;30280:20;30276:1;30265:9;30261:17;30254:47;30318:108;30421:4;30412:6;30318:108;:::i;:::-;30310:116;;30436:72;30504:2;30493:9;30489:18;30480:6;30436:72;:::i;:::-;30518:66;30580:2;30569:9;30565:18;30556:6;30518:66;:::i;:::-;30594;30656:2;30645:9;30641:18;30632:6;30594:66;:::i;:::-;30670:67;30732:3;30721:9;30717:19;30708:6;30670:67;:::i;:::-;30747:73;30815:3;30804:9;30800:19;30791:6;30747:73;:::i;:::-;30830;30898:3;30887:9;30883:19;30874:6;30830:73;:::i;:::-;30951:9;30945:4;30941:20;30935:3;30924:9;30920:19;30913:49;30979:108;31082:4;31073:6;30979:108;:::i;:::-;30971:116;;30207:887;;;;;;;;;;;:::o;31100:775::-;;31371:3;31360:9;31356:19;31348:27;;31385:71;31453:1;31442:9;31438:17;31429:6;31385:71;:::i;:::-;31466:72;31534:2;31523:9;31519:18;31510:6;31466:72;:::i;:::-;31548;31616:2;31605:9;31601:18;31592:6;31548:72;:::i;:::-;31630;31698:2;31687:9;31683:18;31674:6;31630:72;:::i;:::-;31712:73;31780:3;31769:9;31765:19;31756:6;31712:73;:::i;:::-;31795;31863:3;31852:9;31848:19;31839:6;31795:73;:::i;:::-;31338:537;;;;;;;;;:::o;31881:442::-;;32068:2;32057:9;32053:18;32045:26;;32081:71;32149:1;32138:9;32134:17;32125:6;32081:71;:::i;:::-;32162:72;32230:2;32219:9;32215:18;32206:6;32162:72;:::i;:::-;32244;32312:2;32301:9;32297:18;32288:6;32244:72;:::i;:::-;32035:288;;;;;;:::o;32329:698::-;;32591:3;32580:9;32576:19;32568:27;;32605:71;32673:1;32662:9;32658:17;32649:6;32605:71;:::i;:::-;32686:72;32754:2;32743:9;32739:18;32730:6;32686:72;:::i;:::-;32768;32836:2;32825:9;32821:18;32812:6;32768:72;:::i;:::-;32887:9;32881:4;32877:20;32872:2;32861:9;32857:18;32850:48;32915:105;33015:4;33006:6;32915:105;:::i;:::-;32907:113;;32558:469;;;;;;;:::o;33033:664::-;;33276:3;33265:9;33261:19;33253:27;;33290:71;33358:1;33347:9;33343:17;33334:6;33290:71;:::i;:::-;33371:72;33439:2;33428:9;33424:18;33415:6;33371:72;:::i;:::-;33453;33521:2;33510:9;33506:18;33497:6;33453:72;:::i;:::-;33535;33603:2;33592:9;33588:18;33579:6;33535:72;:::i;:::-;33617:73;33685:3;33674:9;33670:19;33661:6;33617:73;:::i;:::-;33243:454;;;;;;;;:::o;33703:313::-;;33854:2;33843:9;33839:18;33831:26;;33903:9;33897:4;33893:20;33889:1;33878:9;33874:17;33867:47;33931:78;34004:4;33995:6;33931:78;:::i;:::-;33923:86;;33821:195;;;;:::o;34022:419::-;;34226:2;34215:9;34211:18;34203:26;;34275:9;34269:4;34265:20;34261:1;34250:9;34246:17;34239:47;34303:131;34429:4;34303:131;:::i;:::-;34295:139;;34193:248;;;:::o;34447:419::-;;34651:2;34640:9;34636:18;34628:26;;34700:9;34694:4;34690:20;34686:1;34675:9;34671:17;34664:47;34728:131;34854:4;34728:131;:::i;:::-;34720:139;;34618:248;;;:::o;34872:419::-;;35076:2;35065:9;35061:18;35053:26;;35125:9;35119:4;35115:20;35111:1;35100:9;35096:17;35089:47;35153:131;35279:4;35153:131;:::i;:::-;35145:139;;35043:248;;;:::o;35297:419::-;;35501:2;35490:9;35486:18;35478:26;;35550:9;35544:4;35540:20;35536:1;35525:9;35521:17;35514:47;35578:131;35704:4;35578:131;:::i;:::-;35570:139;;35468:248;;;:::o;35722:419::-;;35926:2;35915:9;35911:18;35903:26;;35975:9;35969:4;35965:20;35961:1;35950:9;35946:17;35939:47;36003:131;36129:4;36003:131;:::i;:::-;35995:139;;35893:248;;;:::o;36147:419::-;;36351:2;36340:9;36336:18;36328:26;;36400:9;36394:4;36390:20;36386:1;36375:9;36371:17;36364:47;36428:131;36554:4;36428:131;:::i;:::-;36420:139;;36318:248;;;:::o;36572:419::-;;36776:2;36765:9;36761:18;36753:26;;36825:9;36819:4;36815:20;36811:1;36800:9;36796:17;36789:47;36853:131;36979:4;36853:131;:::i;:::-;36845:139;;36743:248;;;:::o;36997:419::-;;37201:2;37190:9;37186:18;37178:26;;37250:9;37244:4;37240:20;37236:1;37225:9;37221:17;37214:47;37278:131;37404:4;37278:131;:::i;:::-;37270:139;;37168:248;;;:::o;37422:419::-;;37626:2;37615:9;37611:18;37603:26;;37675:9;37669:4;37665:20;37661:1;37650:9;37646:17;37639:47;37703:131;37829:4;37703:131;:::i;:::-;37695:139;;37593:248;;;:::o;37847:419::-;;38051:2;38040:9;38036:18;38028:26;;38100:9;38094:4;38090:20;38086:1;38075:9;38071:17;38064:47;38128:131;38254:4;38128:131;:::i;:::-;38120:139;;38018:248;;;:::o;38272:419::-;;38476:2;38465:9;38461:18;38453:26;;38525:9;38519:4;38515:20;38511:1;38500:9;38496:17;38489:47;38553:131;38679:4;38553:131;:::i;:::-;38545:139;;38443:248;;;:::o;38697:419::-;;38901:2;38890:9;38886:18;38878:26;;38950:9;38944:4;38940:20;38936:1;38925:9;38921:17;38914:47;38978:131;39104:4;38978:131;:::i;:::-;38970:139;;38868:248;;;:::o;39122:419::-;;39326:2;39315:9;39311:18;39303:26;;39375:9;39369:4;39365:20;39361:1;39350:9;39346:17;39339:47;39403:131;39529:4;39403:131;:::i;:::-;39395:139;;39293:248;;;:::o;39547:419::-;;39751:2;39740:9;39736:18;39728:26;;39800:9;39794:4;39790:20;39786:1;39775:9;39771:17;39764:47;39828:131;39954:4;39828:131;:::i;:::-;39820:139;;39718:248;;;:::o;39972:419::-;;40176:2;40165:9;40161:18;40153:26;;40225:9;40219:4;40215:20;40211:1;40200:9;40196:17;40189:47;40253:131;40379:4;40253:131;:::i;:::-;40245:139;;40143:248;;;:::o;40397:419::-;;40601:2;40590:9;40586:18;40578:26;;40650:9;40644:4;40640:20;40636:1;40625:9;40621:17;40614:47;40678:131;40804:4;40678:131;:::i;:::-;40670:139;;40568:248;;;:::o;40822:419::-;;41026:2;41015:9;41011:18;41003:26;;41075:9;41069:4;41065:20;41061:1;41050:9;41046:17;41039:47;41103:131;41229:4;41103:131;:::i;:::-;41095:139;;40993:248;;;:::o;41247:419::-;;41451:2;41440:9;41436:18;41428:26;;41500:9;41494:4;41490:20;41486:1;41475:9;41471:17;41464:47;41528:131;41654:4;41528:131;:::i;:::-;41520:139;;41418:248;;;:::o;41672:419::-;;41876:2;41865:9;41861:18;41853:26;;41925:9;41919:4;41915:20;41911:1;41900:9;41896:17;41889:47;41953:131;42079:4;41953:131;:::i;:::-;41945:139;;41843:248;;;:::o;42097:419::-;;42301:2;42290:9;42286:18;42278:26;;42350:9;42344:4;42340:20;42336:1;42325:9;42321:17;42314:47;42378:131;42504:4;42378:131;:::i;:::-;42370:139;;42268:248;;;:::o;42522:419::-;;42726:2;42715:9;42711:18;42703:26;;42775:9;42769:4;42765:20;42761:1;42750:9;42746:17;42739:47;42803:131;42929:4;42803:131;:::i;:::-;42795:139;;42693:248;;;:::o;42947:419::-;;43151:2;43140:9;43136:18;43128:26;;43200:9;43194:4;43190:20;43186:1;43175:9;43171:17;43164:47;43228:131;43354:4;43228:131;:::i;:::-;43220:139;;43118:248;;;:::o;43372:419::-;;43576:2;43565:9;43561:18;43553:26;;43625:9;43619:4;43615:20;43611:1;43600:9;43596:17;43589:47;43653:131;43779:4;43653:131;:::i;:::-;43645:139;;43543:248;;;:::o;43797:419::-;;44001:2;43990:9;43986:18;43978:26;;44050:9;44044:4;44040:20;44036:1;44025:9;44021:17;44014:47;44078:131;44204:4;44078:131;:::i;:::-;44070:139;;43968:248;;;:::o;44222:419::-;;44426:2;44415:9;44411:18;44403:26;;44475:9;44469:4;44465:20;44461:1;44450:9;44446:17;44439:47;44503:131;44629:4;44503:131;:::i;:::-;44495:139;;44393:248;;;:::o;44647:419::-;;44851:2;44840:9;44836:18;44828:26;;44900:9;44894:4;44890:20;44886:1;44875:9;44871:17;44864:47;44928:131;45054:4;44928:131;:::i;:::-;44920:139;;44818:248;;;:::o;45072:419::-;;45276:2;45265:9;45261:18;45253:26;;45325:9;45319:4;45315:20;45311:1;45300:9;45296:17;45289:47;45353:131;45479:4;45353:131;:::i;:::-;45345:139;;45243:248;;;:::o;45497:419::-;;45701:2;45690:9;45686:18;45678:26;;45750:9;45744:4;45740:20;45736:1;45725:9;45721:17;45714:47;45778:131;45904:4;45778:131;:::i;:::-;45770:139;;45668:248;;;:::o;45922:419::-;;46126:2;46115:9;46111:18;46103:26;;46175:9;46169:4;46165:20;46161:1;46150:9;46146:17;46139:47;46203:131;46329:4;46203:131;:::i;:::-;46195:139;;46093:248;;;:::o;46347:419::-;;46551:2;46540:9;46536:18;46528:26;;46600:9;46594:4;46590:20;46586:1;46575:9;46571:17;46564:47;46628:131;46754:4;46628:131;:::i;:::-;46620:139;;46518:248;;;:::o;46772:419::-;;46976:2;46965:9;46961:18;46953:26;;47025:9;47019:4;47015:20;47011:1;47000:9;46996:17;46989:47;47053:131;47179:4;47053:131;:::i;:::-;47045:139;;46943:248;;;:::o;47197:419::-;;47401:2;47390:9;47386:18;47378:26;;47450:9;47444:4;47440:20;47436:1;47425:9;47421:17;47414:47;47478:131;47604:4;47478:131;:::i;:::-;47470:139;;47368:248;;;:::o;47622:222::-;;47753:2;47742:9;47738:18;47730:26;;47766:71;47834:1;47823:9;47819:17;47810:6;47766:71;:::i;:::-;47720:124;;;;:::o;47850:866::-;;48141:3;48130:9;48126:19;48118:27;;48155:71;48223:1;48212:9;48208:17;48199:6;48155:71;:::i;:::-;48236:72;48304:2;48293:9;48289:18;48280:6;48236:72;:::i;:::-;48318;48386:2;48375:9;48371:18;48362:6;48318:72;:::i;:::-;48400;48468:2;48457:9;48453:18;48444:6;48400:72;:::i;:::-;48482:73;48550:3;48539:9;48535:19;48526:6;48482:73;:::i;:::-;48603:9;48597:4;48593:20;48587:3;48576:9;48572:19;48565:49;48631:78;48704:4;48695:6;48631:78;:::i;:::-;48623:86;;48108:608;;;;;;;;;:::o;48722:129::-;;48783:20;;:::i;:::-;48773:30;;48812:33;48840:4;48832:6;48812:33;:::i;:::-;48763:88;;;:::o;48857:75::-;;48923:2;48917:9;48907:19;;48897:35;:::o;48938:311::-;;49105:18;49097:6;49094:30;49091:2;;;49127:18;;:::i;:::-;49091:2;49177:4;49169:6;49165:17;49157:25;;49237:4;49231;49227:15;49219:23;;49020:229;;;:::o;49255:311::-;;49422:18;49414:6;49411:30;49408:2;;;49444:18;;:::i;:::-;49408:2;49494:4;49486:6;49482:17;49474:25;;49554:4;49548;49544:15;49536:23;;49337:229;;;:::o;49572:311::-;;49739:18;49731:6;49728:30;49725:2;;;49761:18;;:::i;:::-;49725:2;49811:4;49803:6;49799:17;49791:25;;49871:4;49865;49861:15;49853:23;;49654:229;;;:::o;49889:308::-;;50041:18;50033:6;50030:30;50027:2;;;50063:18;;:::i;:::-;50027:2;50101:29;50123:6;50101:29;:::i;:::-;50093:37;;50185:4;50179;50175:15;50167:23;;49956:241;;;:::o;50203:132::-;;50293:3;50285:11;;50323:4;50318:3;50314:14;50306:22;;50275:60;;;:::o;50341:132::-;;50431:3;50423:11;;50461:4;50456:3;50452:14;50444:22;;50413:60;;;:::o;50479:156::-;;50566:3;50558:11;;50589:3;50586:1;50579:14;50623:4;50620:1;50610:18;50602:26;;50548:87;;;:::o;50641:114::-;;50742:5;50736:12;50726:22;;50715:40;;;:::o;50761:114::-;;50862:5;50856:12;50846:22;;50835:40;;;:::o;50881:111::-;;50979:5;50973:12;50963:22;;50952:40;;;:::o;50998:98::-;;51083:5;51077:12;51067:22;;51056:40;;;:::o;51102:99::-;;51188:5;51182:12;51172:22;;51161:40;;;:::o;51207:113::-;;51309:4;51304:3;51300:14;51292:22;;51282:38;;;:::o;51326:113::-;;51428:4;51423:3;51419:14;51411:22;;51401:38;;;:::o;51445:184::-;;51578:6;51573:3;51566:19;51618:4;51613:3;51609:14;51594:29;;51556:73;;;;:::o;51635:184::-;;51768:6;51763:3;51756:19;51808:4;51803:3;51799:14;51784:29;;51746:73;;;;:::o;51825:147::-;;51963:3;51948:18;;51938:34;;;;:::o;51978:169::-;;52096:6;52091:3;52084:19;52136:4;52131:3;52127:14;52112:29;;52074:73;;;;:::o;52153:297::-;;52212:20;52230:1;52212:20;:::i;:::-;52207:25;;52246:20;52264:1;52246:20;:::i;:::-;52241:25;;52392:1;52332:58;52328:66;52325:1;52322:73;52319:2;;;52398:18;;:::i;:::-;52319:2;52442:1;52439;52435:9;52428:16;;52197:253;;;;:::o;52456:305::-;;52515:20;52533:1;52515:20;:::i;:::-;52510:25;;52549:20;52567:1;52549:20;:::i;:::-;52544:25;;52703:1;52635:66;52631:74;52628:1;52625:81;52622:2;;;52709:18;;:::i;:::-;52622:2;52753:1;52750;52746:9;52739:16;;52500:261;;;;:::o;52767:185::-;;52824:20;52842:1;52824:20;:::i;:::-;52819:25;;52858:20;52876:1;52858:20;:::i;:::-;52853:25;;52897:1;52887:2;;52902:18;;:::i;:::-;52887:2;52944:1;52941;52937:9;52932:14;;52809:143;;;;:::o;52958:348::-;;53021:20;53039:1;53021:20;:::i;:::-;53016:25;;53055:20;53073:1;53055:20;:::i;:::-;53050:25;;53243:1;53175:66;53171:74;53168:1;53165:81;53160:1;53153:9;53146:17;53142:105;53139:2;;;53250:18;;:::i;:::-;53139:2;53298:1;53295;53291:9;53280:20;;53006:300;;;;:::o;53312:191::-;;53372:20;53390:1;53372:20;:::i;:::-;53367:25;;53406:20;53424:1;53406:20;:::i;:::-;53401:25;;53445:1;53442;53439:8;53436:2;;;53450:18;;:::i;:::-;53436:2;53495:1;53492;53488:9;53480:17;;53357:146;;;;:::o;53509:131::-;;53599:34;53592:5;53588:46;53577:57;;53567:73;;;:::o;53646:96::-;;53712:24;53730:5;53712:24;:::i;:::-;53701:35;;53691:51;;;:::o;53748:90::-;;53825:5;53818:13;53811:21;53800:32;;53790:48;;;:::o;53844:77::-;;53910:5;53899:16;;53889:32;;;:::o;53927:118::-;;54004:34;53997:5;53993:46;53982:57;;53972:73;;;:::o;54051:126::-;;54128:42;54121:5;54117:54;54106:65;;54096:81;;;:::o;54183:142::-;;54260:58;54253:5;54249:70;54238:81;;54228:97;;;:::o;54331:77::-;;54397:5;54386:16;;54376:32;;;:::o;54414:93::-;;54490:10;54483:5;54479:22;54468:33;;54458:49;;;:::o;54513:113::-;;54596:24;54614:5;54596:24;:::i;:::-;54583:37;;54573:53;;;:::o;54632:154::-;54716:6;54711:3;54706;54693:30;54778:1;54769:6;54764:3;54760:16;54753:27;54683:103;;;:::o;54792:307::-;54860:1;54870:113;54884:6;54881:1;54878:13;54870:113;;;54969:1;54964:3;54960:11;54954:18;54950:1;54945:3;54941:11;54934:39;54906:2;54903:1;54899:10;54894:15;;54870:113;;;55001:6;54998:1;54995:13;54992:2;;;55081:1;55072:6;55067:3;55063:16;55056:27;54992:2;54841:258;;;;:::o;55105:166::-;;55199:66;55230:34;55253:10;55230:34;:::i;:::-;55199:66;:::i;:::-;55190:75;;55180:91;;;:::o;55277:169::-;;55372:68;55403:36;55428:10;55403:36;:::i;:::-;55372:68;:::i;:::-;55363:77;;55353:93;;;:::o;55452:281::-;55535:27;55557:4;55535:27;:::i;:::-;55527:6;55523:40;55665:6;55653:10;55650:22;55629:18;55617:10;55614:34;55611:62;55608:2;;;55676:18;;:::i;:::-;55608:2;55716:10;55712:2;55705:22;55495:238;;;:::o;55739:233::-;;55801:24;55819:5;55801:24;:::i;:::-;55792:33;;55847:66;55840:5;55837:77;55834:2;;;55917:18;;:::i;:::-;55834:2;55964:1;55957:5;55953:13;55946:20;;55782:190;;;:::o;55978:175::-;;56039:23;56056:5;56039:23;:::i;:::-;56030:32;;56084:10;56077:5;56074:21;56071:2;;;56098:18;;:::i;:::-;56071:2;56145:1;56138:5;56134:13;56127:20;;56020:133;;;:::o;56159:100::-;;56227:26;56247:5;56227:26;:::i;:::-;56216:37;;56206:53;;;:::o;56265:79::-;;56333:5;56322:16;;56312:32;;;:::o;56350:94::-;;56418:20;56432:5;56418:20;:::i;:::-;56407:31;;56397:47;;;:::o;56450:79::-;;56518:5;56507:16;;56497:32;;;:::o;56535:94::-;;56602:21;56617:5;56602:21;:::i;:::-;56591:32;;56581:48;;;:::o;56635:180::-;56683:77;56680:1;56673:88;56780:4;56777:1;56770:15;56804:4;56801:1;56794:15;56821:180;56869:77;56866:1;56859:88;56966:4;56963:1;56956:15;56990:4;56987:1;56980:15;57007:180;57055:77;57052:1;57045:88;57152:4;57149:1;57142:15;57176:4;57173:1;57166:15;57193:102;;57285:2;57281:7;57276:2;57269:5;57265:14;57261:28;57251:38;;57241:54;;;:::o;57301:96::-;;57384:5;57379:3;57375:15;57354:36;;57344:53;;;:::o;57403:94::-;;57484:5;57480:2;57476:14;57455:35;;57445:52;;;:::o;57503:102::-;;57592:5;57589:1;57585:13;57564:34;;57554:51;;;:::o;57611:106::-;;57704:5;57699:3;57695:15;57674:36;;57664:53;;;:::o;57723:174::-;57863:26;57859:1;57851:6;57847:14;57840:50;57829:68;:::o;57903:221::-;58043:34;58039:1;58031:6;58027:14;58020:58;58112:4;58107:2;58099:6;58095:15;58088:29;58009:115;:::o;58130:222::-;58270:34;58266:1;58258:6;58254:14;58247:58;58339:5;58334:2;58326:6;58322:15;58315:30;58236:116;:::o;58358:226::-;58498:34;58494:1;58486:6;58482:14;58475:58;58567:9;58562:2;58554:6;58550:15;58543:34;58464:120;:::o;58590:240::-;58730:34;58726:1;58718:6;58714:14;58707:58;58799:23;58794:2;58786:6;58782:15;58775:48;58696:134;:::o;58836:168::-;58976:20;58972:1;58964:6;58960:14;58953:44;58942:62;:::o;59010:165::-;59150:17;59146:1;59138:6;59134:14;59127:41;59116:59;:::o;59181:165::-;59321:17;59317:1;59309:6;59305:14;59298:41;59287:59;:::o;59352:165::-;59492:17;59488:1;59480:6;59476:14;59469:41;59458:59;:::o;59523:230::-;59663:34;59659:1;59651:6;59647:14;59640:58;59732:13;59727:2;59719:6;59715:15;59708:38;59629:124;:::o;59759:173::-;59899:25;59895:1;59887:6;59883:14;59876:49;59865:67;:::o;59938:164::-;60078:16;60074:1;60066:6;60062:14;60055:40;60044:58;:::o;60108:225::-;60248:34;60244:1;60236:6;60232:14;60225:58;60317:8;60312:2;60304:6;60300:15;60293:33;60214:119;:::o;60339:221::-;60479:34;60475:1;60467:6;60463:14;60456:58;60548:4;60543:2;60535:6;60531:15;60524:29;60445:115;:::o;60566:162::-;60706:14;60702:1;60694:6;60690:14;60683:38;60672:56;:::o;60734:171::-;60874:23;60870:1;60862:6;60858:14;60851:47;60840:65;:::o;60911:170::-;61051:22;61047:1;61039:6;61035:14;61028:46;61017:64;:::o;61087:158::-;61227:10;61223:1;61215:6;61211:14;61204:34;61193:52;:::o;61251:230::-;61391:34;61387:1;61379:6;61375:14;61368:58;61460:13;61455:2;61447:6;61443:15;61436:38;61357:124;:::o;61487:167::-;61627:19;61623:1;61615:6;61611:14;61604:43;61593:61;:::o;61660:167::-;61800:19;61796:1;61788:6;61784:14;61777:43;61766:61;:::o;61833:158::-;61973:10;61969:1;61961:6;61957:14;61950:34;61939:52;:::o;61997:172::-;62137:24;62133:1;62125:6;62121:14;62114:48;62103:66;:::o;62175:162::-;62315:14;62311:1;62303:6;62299:14;62292:38;62281:56;:::o;62343:179::-;62483:31;62479:1;62471:6;62467:14;62460:55;62449:73;:::o;62528:243::-;62668:34;62664:1;62656:6;62652:14;62645:58;62737:26;62732:2;62724:6;62720:15;62713:51;62634:137;:::o;62777:222::-;62917:34;62913:1;62905:6;62901:14;62894:58;62986:5;62981:2;62973:6;62969:15;62962:30;62883:116;:::o;63005:166::-;63145:18;63141:1;63133:6;63129:14;63122:42;63111:60;:::o;63177:163::-;63317:15;63313:1;63305:6;63301:14;63294:39;63283:57;:::o;63346:229::-;63486:34;63482:1;63474:6;63470:14;63463:58;63555:12;63550:2;63542:6;63538:15;63531:37;63452:123;:::o;63581:167::-;63721:19;63717:1;63709:6;63705:14;63698:43;63687:61;:::o;63754:230::-;63894:34;63890:1;63882:6;63878:14;63871:58;63963:13;63958:2;63950:6;63946:15;63939:38;63860:124;:::o;63990:122::-;64063:24;64081:5;64063:24;:::i;:::-;64056:5;64053:35;64043:2;;64102:1;64099;64092:12;64043:2;64033:79;:::o;64118:116::-;64188:21;64203:5;64188:21;:::i;:::-;64181:5;64178:32;64168:2;;64224:1;64221;64214:12;64168:2;64158:76;:::o;64240:122::-;64313:24;64331:5;64313:24;:::i;:::-;64306:5;64303:35;64293:2;;64352:1;64349;64342:12;64293:2;64283:79;:::o;64368:122::-;64441:24;64459:5;64441:24;:::i;:::-;64434:5;64431:35;64421:2;;64480:1;64477;64470:12;64421:2;64411:79;:::o;64496:122::-;64569:24;64587:5;64569:24;:::i;:::-;64562:5;64559:35;64549:2;;64608:1;64605;64598:12;64549:2;64539:79;:::o
Swarm Source
ipfs://abec04e7d9691f60de44d91ac9eed4f21450b1a3ae2e6436074a0545fd556a50
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.