Contract Overview
My Name Tag:
Not Available
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Contract Name:
Trading
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Arbiscan on 2022-02-20 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns token decimals. */ function decimals() external view returns (uint8); /** * @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; 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"); (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"); (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"); (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"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal 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 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' 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 require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } interface IRouter { function trading() external view returns (address); function capPool() external view returns (address); function oracle() external view returns (address); function treasury() external view returns (address); function darkOracle() external view returns (address); function isSupportedCurrency(address currency) external view returns (bool); function currencies(uint256 index) external view returns (address); function currenciesLength() external view returns (uint256); function getDecimals(address currency) external view returns(uint8); function getPool(address currency) external view returns (address); function getPoolShare(address currency) external view returns(uint256); function getCapShare(address currency) external view returns(uint256); function getPoolRewards(address currency) external view returns (address); function getCapRewards(address currency) external view returns (address); } interface ITreasury { function fundOracle(address destination, uint256 amount) external; function notifyFeeReceived(address currency, uint256 amount) external; } interface IPool { function totalSupply() external view returns (uint256); function creditUserProfit(address destination, uint256 amount) external; function updateOpenInterest(uint256 amount, bool isDecrease) external; function getUtilization() external view returns (uint256); function getBalance(address account) external view returns (uint256); } contract Trading { // All amounts in 8 decimals unless otherwise indicated using SafeERC20 for IERC20; using Address for address payable; // Structs struct Product { uint64 maxLeverage; // set to 0 to deactivate product uint64 liquidationThreshold; // in bps. 8000 = 80% uint64 fee; // In sbps (10^6). 0.5% = 5000. 0.025% = 250 uint64 interest; // For 360 days, in bps. 5.35% = 535 } struct Position { uint64 size; uint64 margin; uint64 timestamp; uint64 price; } struct Order { bool isClose; uint64 size; uint64 margin; } // Contracts address public owner; address public router; address public treasury; address public oracle; uint256 public nextPositionId; // Incremental uint256 public nextCloseOrderId; // Incremental mapping(bytes32 => Product) private products; mapping(bytes32 => Position) private positions; // key = currency,user,product,direction mapping(bytes32 => Order) private orders; // position key => Order mapping(address => uint256) minMargin; // currency => amount mapping(address => uint256) pendingFees; // currency => amount uint256 public constant UNIT_DECIMALS = 8; uint256 public constant UNIT = 10**UNIT_DECIMALS; uint256 public constant PRICE_DECIMALS = 8; // Events event NewOrder( bytes32 indexed key, address indexed user, bytes32 indexed productId, address currency, bool isLong, uint256 margin, uint256 size, bool isClose ); event PositionUpdated( bytes32 indexed key, address indexed user, bytes32 indexed productId, address currency, bool isLong, uint256 margin, uint256 size, uint256 price, uint256 fee ); event ClosePosition( bytes32 indexed key, address indexed user, bytes32 indexed productId, address currency, bool isLong, uint256 price, uint256 margin, uint256 size, uint256 fee, int256 pnl, bool wasLiquidated ); constructor() { owner = msg.sender; } // Governance methods function setOwner(address newOwner) external onlyOwner { owner = newOwner; } function setRouter(address _router) external onlyOwner { router = _router; treasury = IRouter(router).treasury(); oracle = IRouter(router).oracle(); } function setMinMargin( address currency, uint256 _minMargin ) external onlyOwner { minMargin[currency] = _minMargin; } function addProduct(bytes32 productId, Product memory _product) external onlyOwner { Product memory product = products[productId]; require(product.liquidationThreshold == 0, "!product-exists"); require(_product.liquidationThreshold > 0, "!liqThreshold"); products[productId] = Product({ maxLeverage: _product.maxLeverage, fee: _product.fee, interest: _product.interest, liquidationThreshold: _product.liquidationThreshold }); } function updateProduct(bytes32 productId, Product memory _product) external onlyOwner { Product storage product = products[productId]; require(product.liquidationThreshold > 0, "!product-does-not-exist"); product.maxLeverage = _product.maxLeverage; product.fee = _product.fee; product.interest = _product.interest; product.liquidationThreshold = _product.liquidationThreshold; } // Methods function distributeFees(address currency) external { uint256 pendingFee = pendingFees[currency]; if (pendingFee > 0) { pendingFees[currency] = 0; _transferOut(currency, treasury, pendingFee); ITreasury(treasury).notifyFeeReceived(currency, pendingFee * 10**(18-UNIT_DECIMALS)); } } function submitOrder( bytes32 productId, address currency, bool isLong, uint256 margin, uint256 size ) external payable { if (currency == address(0)) { // User is sending ETH margin = msg.value / 10**(18 - UNIT_DECIMALS); } else { require(IRouter(router).isSupportedCurrency(currency), "!currency"); } // Check params require(margin > 0 && margin < type(uint64).max, "!margin"); require(size > 0 && size < type(uint64).max, "!size"); bytes32 key = _getPositionKey(msg.sender, productId, currency, isLong); Order memory order = orders[key]; require(order.size == 0, "!order"); // existing order Product memory product = products[productId]; uint256 fee = size * product.fee / 10**6; if (currency == address(0)) { require(margin > fee, "!margin<fee"); margin -= fee; } else { _transferIn(currency, margin + fee); } require(margin >= minMargin[currency], "!min-margin"); uint256 leverage = UNIT * size / margin; require(leverage >= UNIT, "!leverage"); require(leverage <= product.maxLeverage, "!max-leverage"); // Update and check pool utlization _updateOpenInterest(currency, size, false); address pool = IRouter(router).getPool(currency); uint256 utilization = IPool(pool).getUtilization(); require(utilization < 10**4, "!utilization"); orders[key] = Order({ isClose: false, size: uint64(size), margin: uint64(margin) }); emit NewOrder( key, msg.sender, productId, currency, isLong, margin, size, false ); } function submitCloseOrder( bytes32 productId, address currency, bool isLong, uint256 size ) external payable { require(size > 0, "!size"); bytes32 key = _getPositionKey(msg.sender, productId, currency, isLong); Order memory order = orders[key]; require(order.size == 0, "!order"); // existing order // Check position Position storage position = positions[key]; require(position.margin > 0, "!position"); if (size > position.size) { size = position.size; } Product memory product = products[productId]; uint256 fee = size * product.fee / 10**6; if (currency == address(0)) { uint256 fee_units = fee * 10**(18-UNIT_DECIMALS); require(msg.value >= fee_units && msg.value <= fee_units * (10**6 + 1)/10**6, "!fee"); } else { _transferIn(currency, fee); } uint256 margin = size * uint256(position.margin) / uint256(position.size); orders[key] = Order({ isClose: true, size: uint64(size), margin: uint64(margin) }); emit NewOrder( key, msg.sender, productId, currency, isLong, margin, size, true ); } function cancelOrder( bytes32 productId, address currency, bool isLong ) external { bytes32 key = _getPositionKey(msg.sender, productId, currency, isLong); Order memory order = orders[key]; require(order.size > 0, "!exists"); Product memory product = products[productId]; uint256 fee = order.size * product.fee / 10**6; delete orders[key]; // Refund margin + fee uint256 marginPlusFee = fee; if (!order.isClose) { _updateOpenInterest(currency, order.size, true); marginPlusFee += order.margin; } _transferOut(currency, msg.sender, marginPlusFee); } // Set price for newly submitted order (oracle) function settleOrder( address user, bytes32 productId, address currency, bool isLong, uint256 price ) external onlyOracle { bytes32 key = _getPositionKey(user, productId, currency, isLong); Order storage order = orders[key]; require(order.size > 0, "!exists"); // fee Product memory product = products[productId]; uint256 fee = order.size * product.fee / 10**6; pendingFees[currency] += fee; if (order.isClose) { { (uint256 margin, uint256 size, int256 pnl) = _settleCloseOrder(user, productId, currency, isLong, price); address pool = IRouter(router).getPool(currency); if (pnl < 0) { { uint256 positivePnl = uint256(-1 * pnl); _transferOut(currency, pool, positivePnl); if (positivePnl < margin) { _transferOut(currency, user, margin - positivePnl); } } } else { IPool(pool).creditUserProfit(user, uint256(pnl) * 10**(18-UNIT_DECIMALS)); _transferOut(currency, user, margin); } _updateOpenInterest(currency, size, true); emit ClosePosition( key, user, productId, currency, isLong, price, margin, size, fee, pnl, false ); } } else { // Validate price, returns 8 decimals price = _validatePrice(price); Position storage position = positions[key]; uint256 averagePrice = (uint256(position.size) * uint256(position.price) + uint256(order.size) * uint256(price)) / (uint256(position.size) + uint256(order.size)); if (position.timestamp == 0) { position.timestamp = uint64(block.timestamp); } position.size += uint64(order.size); position.margin += uint64(order.margin); position.price = uint64(averagePrice); delete orders[key]; emit PositionUpdated( key, user, productId, currency, isLong, position.margin, position.size, position.price, fee ); } } function _settleCloseOrder( address user, bytes32 productId, address currency, bool isLong, uint256 price ) internal returns(uint256, uint256, int256) { bytes32 key = _getPositionKey(user, productId, currency, isLong); // Check order and params Order memory order = orders[key]; uint256 size = order.size; uint256 margin = order.margin; Position storage position = positions[key]; require(position.margin > 0, "!position"); Product memory product = products[productId]; price = _validatePrice(price); int256 pnl = _getPnL(isLong, price, position.price, size, product.interest, position.timestamp); // Check if it's a liquidation if (pnl <= -1 * int256(uint256(position.margin) * uint256(product.liquidationThreshold) / 10**4)) { pnl = -1 * int256(uint256(position.margin)); margin = position.margin; size = position.size; position.margin = 0; } else { position.margin -= uint64(margin); position.size -= uint64(size); } if (position.margin == 0) { delete positions[key]; } delete orders[key]; return (margin, size, pnl); } // Liquidate positionIds (oracle) function liquidatePosition( address user, bytes32 productId, address currency, bool isLong, uint256 price ) external onlyOracle { bytes32 key = _getPositionKey(user, productId, currency, isLong); Position memory position = positions[key]; if (position.margin == 0 || position.size == 0) { return; } Product storage product = products[productId]; price = _validatePrice(price); int256 pnl = _getPnL(isLong, price, position.price, position.size, product.interest, position.timestamp); uint256 threshold = position.margin * product.liquidationThreshold / 10**4; if (pnl <= -1 * int256(threshold)) { uint256 fee = position.margin - threshold; address pool = IRouter(router).getPool(currency); _transferOut(currency, pool, threshold); _updateOpenInterest(currency, position.size, true); pendingFees[currency] += fee; emit ClosePosition( key, user, productId, currency, isLong, price, position.margin, position.size, fee, -1 * int256(uint256(position.margin)), true ); delete positions[key]; } } function releaseMargin( address user, bytes32 productId, address currency, bool isLong, bool includeFee ) external onlyOwner { bytes32 key = _getPositionKey(user, productId, currency, isLong); Position storage position = positions[key]; require(position.margin > 0, "!position"); uint256 margin = position.margin; emit ClosePosition( key, user, productId, currency, isLong, position.price, margin, position.size, 0, 0, false ); delete orders[key]; if (includeFee) { Product memory product = products[productId]; uint256 fee = position.size * product.fee / 10**6; margin += fee; } _updateOpenInterest(currency, position.size, true); delete positions[key]; _transferOut(currency, user, margin); } // To receive ETH fallback() external payable {} receive() external payable {} // Internal methods function _getPositionKey(address user, bytes32 productId, address currency, bool isLong) internal pure returns (bytes32) { return keccak256(abi.encodePacked(user, productId, currency, isLong)); } function _updateOpenInterest(address currency, uint256 amount, bool isDecrease) internal { address pool = IRouter(router).getPool(currency); IPool(pool).updateOpenInterest(amount * 10**(18 - UNIT_DECIMALS), isDecrease); } function _transferIn(address currency, uint256 amount) internal { if (amount == 0 || currency == address(0)) return; // adjust decimals uint256 decimals = IRouter(router).getDecimals(currency); amount = amount * (10**decimals) / (10**UNIT_DECIMALS); IERC20(currency).safeTransferFrom(msg.sender, address(this), amount); } function _transferOut(address currency, address to, uint256 amount) internal { if (amount == 0 || to == address(0)) return; // adjust decimals uint256 decimals = IRouter(router).getDecimals(currency); amount = amount * (10**decimals) / (10**UNIT_DECIMALS); if (currency == address(0)) { payable(to).sendValue(amount); } else { IERC20(currency).safeTransfer(to, amount); } } function _validatePrice( uint256 price // 8 decimals ) internal pure returns(uint256) { require(price > 0, "!price"); return price * 10**(UNIT_DECIMALS - PRICE_DECIMALS); } function _getPnL( bool isLong, uint256 price, uint256 positionPrice, uint256 size, uint256 interest, uint256 timestamp ) internal view returns(int256 _pnl) { bool pnlIsNegative; uint256 pnl; if (isLong) { if (price >= positionPrice) { pnl = size * (price - positionPrice) / positionPrice; } else { pnl = size * (positionPrice - price) / positionPrice; pnlIsNegative = true; } } else { if (price > positionPrice) { pnl = size * (price - positionPrice) / positionPrice; pnlIsNegative = true; } else { pnl = size * (positionPrice - price) / positionPrice; } } // Subtract interest from P/L if (block.timestamp >= timestamp + 15 minutes) { uint256 _interest = size * interest * (block.timestamp - timestamp) / (UNIT * 10**4 * 360 days); if (pnlIsNegative) { pnl += _interest; } else if (pnl < _interest) { pnl = _interest - pnl; pnlIsNegative = true; } else { pnl -= _interest; } } if (pnlIsNegative) { _pnl = -1 * int256(pnl); } else { _pnl = int256(pnl); } return _pnl; } // Getters function getProduct(bytes32 productId) external view returns(Product memory) { return products[productId]; } function getPosition( address user, address currency, bytes32 productId, bool isLong ) external view returns(Position memory position) { bytes32 key = _getPositionKey(user, productId, currency, isLong); return positions[key]; } function getOrder( address user, address currency, bytes32 productId, bool isLong ) external view returns(Order memory order) { bytes32 key = _getPositionKey(user, productId, currency, isLong); return orders[key]; } function getOrders(bytes32[] calldata keys) external view returns(Order[] memory _orders) { uint256 length = keys.length; _orders = new Order[](length); for (uint256 i = 0; i < length; i++) { _orders[i] = orders[keys[i]]; } return _orders; } function getPositions(bytes32[] calldata keys) external view returns(Position[] memory _positions) { uint256 length = keys.length; _positions = new Position[](length); for (uint256 i = 0; i < length; i++) { _positions[i] = positions[keys[i]]; } return _positions; } function getPendingFee(address currency) external view returns(uint256) { return pendingFees[currency] * 10**(18-UNIT_DECIMALS); } // Modifiers modifier onlyOracle() { require(msg.sender == oracle, "!oracle"); _; } modifier onlyOwner() { require(msg.sender == owner, "!owner"); _; } }
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"key","type":"bytes32"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"bytes32","name":"productId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"currency","type":"address"},{"indexed":false,"internalType":"bool","name":"isLong","type":"bool"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"margin","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"size","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"int256","name":"pnl","type":"int256"},{"indexed":false,"internalType":"bool","name":"wasLiquidated","type":"bool"}],"name":"ClosePosition","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"key","type":"bytes32"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"bytes32","name":"productId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"currency","type":"address"},{"indexed":false,"internalType":"bool","name":"isLong","type":"bool"},{"indexed":false,"internalType":"uint256","name":"margin","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"size","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isClose","type":"bool"}],"name":"NewOrder","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"key","type":"bytes32"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"bytes32","name":"productId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"currency","type":"address"},{"indexed":false,"internalType":"bool","name":"isLong","type":"bool"},{"indexed":false,"internalType":"uint256","name":"margin","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"size","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"PositionUpdated","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"PRICE_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNIT_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"productId","type":"bytes32"},{"components":[{"internalType":"uint64","name":"maxLeverage","type":"uint64"},{"internalType":"uint64","name":"liquidationThreshold","type":"uint64"},{"internalType":"uint64","name":"fee","type":"uint64"},{"internalType":"uint64","name":"interest","type":"uint64"}],"internalType":"struct Trading.Product","name":"_product","type":"tuple"}],"name":"addProduct","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"productId","type":"bytes32"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"bool","name":"isLong","type":"bool"}],"name":"cancelOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"currency","type":"address"}],"name":"distributeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"bytes32","name":"productId","type":"bytes32"},{"internalType":"bool","name":"isLong","type":"bool"}],"name":"getOrder","outputs":[{"components":[{"internalType":"bool","name":"isClose","type":"bool"},{"internalType":"uint64","name":"size","type":"uint64"},{"internalType":"uint64","name":"margin","type":"uint64"}],"internalType":"struct Trading.Order","name":"order","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"keys","type":"bytes32[]"}],"name":"getOrders","outputs":[{"components":[{"internalType":"bool","name":"isClose","type":"bool"},{"internalType":"uint64","name":"size","type":"uint64"},{"internalType":"uint64","name":"margin","type":"uint64"}],"internalType":"struct Trading.Order[]","name":"_orders","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"currency","type":"address"}],"name":"getPendingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"bytes32","name":"productId","type":"bytes32"},{"internalType":"bool","name":"isLong","type":"bool"}],"name":"getPosition","outputs":[{"components":[{"internalType":"uint64","name":"size","type":"uint64"},{"internalType":"uint64","name":"margin","type":"uint64"},{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"uint64","name":"price","type":"uint64"}],"internalType":"struct Trading.Position","name":"position","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"keys","type":"bytes32[]"}],"name":"getPositions","outputs":[{"components":[{"internalType":"uint64","name":"size","type":"uint64"},{"internalType":"uint64","name":"margin","type":"uint64"},{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"uint64","name":"price","type":"uint64"}],"internalType":"struct Trading.Position[]","name":"_positions","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"productId","type":"bytes32"}],"name":"getProduct","outputs":[{"components":[{"internalType":"uint64","name":"maxLeverage","type":"uint64"},{"internalType":"uint64","name":"liquidationThreshold","type":"uint64"},{"internalType":"uint64","name":"fee","type":"uint64"},{"internalType":"uint64","name":"interest","type":"uint64"}],"internalType":"struct Trading.Product","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bytes32","name":"productId","type":"bytes32"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"liquidatePosition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nextCloseOrderId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextPositionId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bytes32","name":"productId","type":"bytes32"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"bool","name":"includeFee","type":"bool"}],"name":"releaseMargin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"currency","type":"address"},{"internalType":"uint256","name":"_minMargin","type":"uint256"}],"name":"setMinMargin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"}],"name":"setRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bytes32","name":"productId","type":"bytes32"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"settleOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"productId","type":"bytes32"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"uint256","name":"size","type":"uint256"}],"name":"submitCloseOrder","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"productId","type":"bytes32"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"uint256","name":"margin","type":"uint256"},{"internalType":"uint256","name":"size","type":"uint256"}],"name":"submitOrder","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"productId","type":"bytes32"},{"components":[{"internalType":"uint64","name":"maxLeverage","type":"uint64"},{"internalType":"uint64","name":"liquidationThreshold","type":"uint64"},{"internalType":"uint64","name":"fee","type":"uint64"},{"internalType":"uint64","name":"interest","type":"uint64"}],"internalType":"struct Trading.Product","name":"_product","type":"tuple"}],"name":"updateProduct","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405234801561001057600080fd5b50600080546001600160a01b03191633179055613ad2806100326000396000f3fe60806040526004361061018b5760003560e01c80637dc0d1d0116100e0578063a36dbdd211610084578063f1a640f811610061578063f1a640f814610331578063f84382031461050d578063f887ea401461053a578063fde2832f1461055a57005b8063a36dbdd2146104b7578063c0d78655146104cd578063c972701a146104ed57005b80638da5cb5b116100bd5780638da5cb5b14610442578063904ac4b7146104625780639413f25c146104825780639d8e2177146104a257005b80637dc0d1d0146103ec57806381acdfa61461040c578063899346c71461042c57005b80633a20e9df1161014757806345a4058d1161012457806345a4058d146103545780635ce893051461037457806361d027b3146103945780636b62da40146103cc57005b80633a20e9df1461025d5780633d474866146103045780633de1b3e01461033157005b80630f1dfe871461019457806313af4035146101b457806319e77383146101d457806321465739146101f45780632a26f17f1461021457806339c6e45d1461024a57005b3661019257005b005b3480156101a057600080fd5b506101926101af366004613493565b61056d565b3480156101c057600080fd5b506101926101cf366004613191565b61069e565b3480156101e057600080fd5b506101926101ef3660046133b7565b6106ea565b34801561020057600080fd5b5061019261020f366004613286565b610867565b34801561022057600080fd5b5061023461022f36600461330d565b610bb1565b6040516102419190613608565b60405180910390f35b610192610258366004613441565b610ce0565b34801561026957600080fd5b506102f761027836600461339e565b60408051608081018252600080825260208201819052918101829052606081019190915250600090815260066020908152604091829020825160808101845290546001600160401b038082168352600160401b8204811693830193909352600160801b8104831693820193909352600160c01b90920416606082015290565b6040516102419190613721565b34801561031057600080fd5b5061032461031f36600461330d565b611368565b6040516102419190613595565b34801561033d57600080fd5b50610346600881565b604051908152602001610241565b34801561036057600080fd5b5061019261036f36600461321e565b611476565b34801561038057600080fd5b506102f761038f3660046131cb565b611662565b3480156103a057600080fd5b506002546103b4906001600160a01b031681565b6040516001600160a01b039091168152602001610241565b3480156103d857600080fd5b506101926103e7366004613286565b6116f3565b3480156103f857600080fd5b506003546103b4906001600160a01b031681565b34801561041857600080fd5b50610192610427366004613493565b611d26565b34801561043857600080fd5b5061034660045481565b34801561044e57600080fd5b506000546103b4906001600160a01b031681565b34801561046e57600080fd5b5061019261047d3660046132e1565b611eec565b34801561048e57600080fd5b5061019261049d366004613191565b611f32565b3480156104ae57600080fd5b50610346612011565b3480156104c357600080fd5b5061034660055481565b3480156104d957600080fd5b506101926104e8366004613191565b612020565b3480156104f957600080fd5b50610346610508366004613191565b61218a565b34801561051957600080fd5b5061052d6105283660046131cb565b6121c6565b60405161024191906136ee565b34801561054657600080fd5b506001546103b4906001600160a01b031681565b6101926105683660046133f9565b612245565b6000546001600160a01b031633146105a05760405162461bcd60e51b8152600401610597906136ce565b60405180910390fd5b60008281526006602052604090208054600160401b90046001600160401b031661060c5760405162461bcd60e51b815260206004820152601760248201527f2170726f647563742d646f65732d6e6f742d65786973740000000000000000006044820152606401610597565b81518154604084015160608501516020909501516001600160401b03908116600160401b0267ffffffffffffffff60401b19968216600160c01b029690961677ffffffffffffffff0000000000000000ffffffffffffffff928216600160801b0277ffffffffffffffff0000000000000000ffffffffffffffff19909416919094161791909117161791909117905550565b6000546001600160a01b031633146106c85760405162461bcd60e51b8152600401610597906136ce565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b60006106f8338585856125ac565b6000818152600860209081526040918290208251606081018452905460ff8116151582526001600160401b0361010082048116938301849052600160481b90910416928101929092529192509061077b5760405162461bcd60e51b81526020600482015260076024820152662165786973747360c81b6044820152606401610597565b6000858152600660209081526040808320815160808101835290546001600160401b038082168352600160401b8204811683860152600160801b82048116938301849052600160c01b90910416606082015291840151919291620f4240916107e291613969565b6107ec91906137b4565b600085815260086020526040902080546001600160881b031916905583516001600160401b039190911691508190610852576108378785602001516001600160401b0316600161260a565b604084015161084f906001600160401b03168261375d565b90505b61085d87338361270f565b5050505050505050565b6003546001600160a01b031633146108ab5760405162461bcd60e51b8152602060048201526007602482015266216f7261636c6560c81b6044820152606401610597565b60006108b9868686866125ac565b600081815260076020908152604091829020825160808101845290546001600160401b038082168352600160401b82048116938301849052600160801b8204811694830194909452600160c01b90049092166060830152919250901580610928575080516001600160401b0316155b15610934575050610baa565b600086815260066020526040902061094b8461281d565b935060006109a4868685606001516001600160401b031686600001516001600160401b03168660000160189054906101000a90046001600160401b03166001600160401b031688604001516001600160401b0316612877565b905060006127108360000160089054906101000a90046001600160401b031685602001516109d29190613969565b6109dc91906137b4565b6001600160401b031690506109f3816000196138c5565b8213610ba45760008185602001516001600160401b0316610a149190613998565b60015460405163bbe4f6db60e01b81526001600160a01b038c811660048301529293506000929091169063bbe4f6db9060240160206040518083038186803b158015610a5f57600080fd5b505afa158015610a73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9791906131ae565b9050610aa48a828561270f565b610abd8a87600001516001600160401b0316600161260a565b6001600160a01b038a166000908152600a602052604081208054849290610ae590849061375d565b9091555050602086015186518c916001600160a01b038f16918a917f1eba783f67334e9b95080299c6a95635568b5bf34dbe80586bc9f938307d7b9c918f918f918f91908a610b3f6001600160401b0384166000196138c5565b604080516001600160a01b0390981688529515156020880152948601939093526001600160401b03918216606086015216608084015260a083015260c0820152600160e08201526101000160405180910390a450506000858152600760205260408120555b50505050505b5050505050565b606081806001600160401b03811115610bcc57610bcc613a60565b604051908082528060200260200182016040528015610c1e57816020015b604080516080810182526000808252602080830182905292820181905260608201528252600019909201910181610bea5790505b50915060005b81811015610cd75760076000868684818110610c4257610c42613a4a565b60209081029290920135835250818101929092526040908101600020815160808101835290546001600160401b038082168352600160401b8204811694830194909452600160801b8104841692820192909252600160c01b90910490911660608201528351849083908110610cb957610cb9613a4a565b60200260200101819052508080610ccf90613a03565b915050610c24565b50505b92915050565b6001600160a01b038416610d1657610cfa60086012613998565b610d0590600a61381d565b610d0f90346137a0565b9150610dcb565b60015460405163fca8d47160e01b81526001600160a01b0386811660048301529091169063fca8d4719060240160206040518083038186803b158015610d5b57600080fd5b505afa158015610d6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d939190613381565b610dcb5760405162461bcd60e51b81526020600482015260096024820152682163757272656e637960b81b6044820152606401610597565b600082118015610de157506001600160401b0382105b610e175760405162461bcd60e51b815260206004820152600760248201526610b6b0b933b4b760c91b6044820152606401610597565b600081118015610e2d57506001600160401b0381105b610e615760405162461bcd60e51b81526020600482015260056024820152642173697a6560d81b6044820152606401610597565b6000610e6f338787876125ac565b6000818152600860209081526040918290208251606081018452905460ff8116151582526001600160401b0361010082048116938301849052600160481b90910416928101929092529192509015610ef25760405162461bcd60e51b815260206004820152600660248201526510b7b93232b960d11b6044820152606401610597565b6000878152600660209081526040808320815160808101835290546001600160401b038082168352600160401b8204811694830194909452600160801b81048416928201839052600160c01b90049092166060830152909190620f424090610f5a908761394a565b610f6491906137a0565b90506001600160a01b038816610fc257808611610fb15760405162461bcd60e51b815260206004820152600b60248201526a216d617267696e3c66656560a81b6044820152606401610597565b610fbb8187613998565b9550610fd5565b610fd588610fd0838961375d565b6129de565b6001600160a01b03881660009081526009602052604090205486101561102b5760405162461bcd60e51b815260206004820152600b60248201526a10b6b4b716b6b0b933b4b760a91b6044820152606401610597565b6000868661103b6008600a61381d565b611045919061394a565b61104f91906137a0565b905061105d6008600a61381d565b8110156110985760405162461bcd60e51b8152602060048201526009602482015268216c6576657261676560b81b6044820152606401610597565b82516001600160401b03168111156110e25760405162461bcd60e51b815260206004820152600d60248201526c216d61782d6c6576657261676560981b6044820152606401610597565b6110ee8987600061260a565b60015460405163bbe4f6db60e01b81526001600160a01b038b81166004830152600092169063bbe4f6db9060240160206040518083038186803b15801561113457600080fd5b505afa158015611148573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116c91906131ae565b90506000816001600160a01b0316637eb711316040518163ffffffff1660e01b815260040160206040518083038186803b1580156111a957600080fd5b505afa1580156111bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e1919061353d565b905061271081106112235760405162461bcd60e51b815260206004820152600c60248201526b10baba34b634bd30ba34b7b760a11b6044820152606401610597565b6040518060600160405280600015158152602001896001600160401b031681526020018a6001600160401b03168152506008600089815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160000160096101000a8154816001600160401b0302191690836001600160401b031602179055509050508b336001600160a01b0316887fe6f0e81a24c1b1c11cfcbbce67e7c5ef361e984c1e4f3528125c93f6f906680d8e8e8e8e60006040516113529594939291906001600160a01b039590951685529215156020850152604084019190915260608301521515608082015260a00190565b60405180910390a4505050505050505050505050565b606081806001600160401b0381111561138357611383613a60565b6040519080825280602002602001820160405280156113ce57816020015b60408051606081018252600080825260208083018290529282015282526000199092019101816113a15790505b50915060005b81811015610cd757600860008686848181106113f2576113f2613a4a565b602090810292909201358352508181019290925260409081016000208151606081018352905460ff8116151582526001600160401b036101008204811694830194909452600160481b900490921690820152835184908390811061145857611458613a4a565b6020026020010181905250808061146e90613a03565b9150506113d4565b6000546001600160a01b031633146114a05760405162461bcd60e51b8152600401610597906136ce565b60006114ae868686866125ac565b6000818152600760205260409020805491925090600160401b90046001600160401b03166114ee5760405162461bcd60e51b8152600401610597906136ab565b8054604080516001600160a01b0388811682528715156020830152600160c01b84046001600160401b0390811683850152600160401b850481166060840181905294166080830152600060a0830181905260c0830181905260e0830152915189928b169186917f1eba783f67334e9b95080299c6a95635568b5bf34dbe80586bc9f938307d7b9c918190036101000190a4600083815260086020526040902080546001600160881b03191690558315611630576000878152600660209081526040808320815160808101835290546001600160401b038082168352600160401b8204811694830194909452600160801b81048416928201839052600160c01b9004831660608201528554909392620f42409261160c92909116613969565b61161691906137b4565b6001600160401b0316905061162b818461375d565b925050505b81546116489087906001600160401b0316600161260a565b60008381526007602052604081205561085d86898361270f565b604080516080810182526000808252602082018190529181018290526060810182905290611692868587866125ac565b600090815260076020908152604091829020825160808101845290546001600160401b038082168352600160401b8204811693830193909352600160801b8104831693820193909352600160c01b9092041660608201529695505050505050565b6003546001600160a01b031633146117375760405162461bcd60e51b8152602060048201526007602482015266216f7261636c6560c81b6044820152606401610597565b6000611745868686866125ac565b600081815260086020526040902080549192509061010090046001600160401b031661179d5760405162461bcd60e51b81526020600482015260076024820152662165786973747360c81b6044820152606401610597565b6000868152600660209081526040808320815160808101835290546001600160401b038082168352600160401b8204811694830194909452600160801b81048416928201839052600160c01b9004831660608201528454909392620f42409261180e92909161010090910416613969565b61181891906137b4565b6001600160401b0316905080600a6000896001600160a01b03166001600160a01b031681526020019081526020016000206000828254611858919061375d565b9091555050825460ff1615611a6e5760008060006118798c8c8c8c8c612ac5565b60015460405163bbe4f6db60e01b81526001600160a01b038f81166004830152949750929550909350600092169063bbe4f6db9060240160206040518083038186803b1580156118c857600080fd5b505afa1580156118dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190091906131ae565b90506000821215611948576000611919836000196138c5565b90506119268c838361270f565b84811015611942576119428c8f61193d8489613998565b61270f565b506119e2565b6001600160a01b03811663fbbc7d7f8e61196460086012613998565b61196f90600a61381d565b611979908661394a565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156119bf57600080fd5b505af11580156119d3573d6000803e3d6000fd5b505050506119e28b8e8661270f565b6119ee8b84600161260a565b604080516001600160a01b038d811682528c151560208301529181018b9052606081018690526080810185905260a0810187905260c08101849052600060e08201528d918f16908a907f1eba783f67334e9b95080299c6a95635568b5bf34dbe80586bc9f938307d7b9c906101000160405180910390a450505050611d1b565b611a778561281d565b6000858152600760205260408120855481549398509092611aa9916001600160401b036101009091048116911661375d565b8554611ac490899061010090046001600160401b031661394a565b8354611ae2906001600160401b03600160c01b82048116911661394a565b611aec919061375d565b611af691906137a0565b8254909150600160801b90046001600160401b0316611b3357815467ffffffffffffffff60801b1916600160801b426001600160401b0316021782555b845482546001600160401b036101009092048216918491600091611b5991859116613775565b82546101009290920a6001600160401b0381810219909316918316021790915586548454600160481b909104821692508491600891611ba1918591600160401b900416613775565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550808260000160186101000a8154816001600160401b0302191690836001600160401b0316021790555060086000878152602001908152602001600020600080820160006101000a81549060ff02191690556000820160016101000a8154906001600160401b0302191690556000820160096101000a8154906001600160401b0302191690555050898b6001600160a01b0316877f722a60bf2980ad6565c04c8210c55454af895983660b33099a60a0af5e05037b8c8c8760000160089054906101000a90046001600160401b03168860000160009054906101000a90046001600160401b03168960000160189054906101000a90046001600160401b03168b604051611d10969594939291906001600160a01b0396909616865293151560208601526001600160401b039283166040860152908216606085015216608083015260a082015260c00190565b60405180910390a450505b505050505050505050565b6000546001600160a01b03163314611d505760405162461bcd60e51b8152600401610597906136ce565b600082815260066020908152604091829020825160808101845290546001600160401b038082168352600160401b82048116938301849052600160801b8204811694830194909452600160c01b9004909216606083015215611de65760405162461bcd60e51b815260206004820152600f60248201526e2170726f647563742d65786973747360881b6044820152606401610597565b600082602001516001600160401b031611611e335760405162461bcd60e51b815260206004820152600d60248201526c085b1a5c551a1c995cda1bdb19609a1b6044820152606401610597565b506040805160808101825282516001600160401b039081168252602080850151821681840190815285850151831684860190815260609687015184169685019687526000978852600690925293909520915182549351955194518216600160c01b026001600160c01b03958316600160801b02959095166fffffffffffffffffffffffffffffffff968316600160401b026fffffffffffffffffffffffffffffffff199095169190921617929092179390931617179055565b6000546001600160a01b03163314611f165760405162461bcd60e51b8152600401610597906136ce565b6001600160a01b03909116600090815260096020526040902055565b6001600160a01b0381166000908152600a6020526040902054801561200d576001600160a01b038083166000908152600a6020526040812055600254611f7b918491168361270f565b6002546001600160a01b031663e0062d7983611f9960086012613998565b611fa490600a61381d565b611fae908561394a565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611ff457600080fd5b505af1158015612008573d6000803e3d6000fd5b505050505b5050565b61201d6008600a61381d565b81565b6000546001600160a01b0316331461204a5760405162461bcd60e51b8152600401610597906136ce565b600180546001600160a01b0319166001600160a01b038316908117909155604080516361d027b360e01b815290516361d027b391600480820192602092909190829003018186803b15801561209e57600080fd5b505afa1580156120b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d691906131ae565b600280546001600160a01b0319166001600160a01b03928316179055600154604080516307dc0d1d60e41b815290519190921691637dc0d1d0916004808301926020929190829003018186803b15801561212f57600080fd5b505afa158015612143573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061216791906131ae565b600380546001600160a01b0319166001600160a01b039290921691909117905550565b600061219860086012613998565b6121a390600a61381d565b6001600160a01b0383166000908152600a6020526040902054610cda919061394a565b60408051606081018252600080825260208201819052918101829052906121ef868587866125ac565b6000908152600860209081526040918290208251606081018452905460ff8116151582526001600160401b036101008204811693830193909352600160481b900490911691810191909152915050949350505050565b6000811161227d5760405162461bcd60e51b81526020600482015260056024820152642173697a6560d81b6044820152606401610597565b600061228b338686866125ac565b6000818152600860209081526040918290208251606081018452905460ff8116151582526001600160401b0361010082048116938301849052600160481b9091041692810192909252919250901561230e5760405162461bcd60e51b815260206004820152600660248201526510b7b93232b960d11b6044820152606401610597565b60008281526007602052604090208054600160401b90046001600160401b031661234a5760405162461bcd60e51b8152600401610597906136ab565b80546001600160401b031684111561236a5780546001600160401b031693505b6000878152600660209081526040808320815160808101835290546001600160401b038082168352600160401b8204811694830194909452600160801b81048416928201839052600160c01b90049092166060830152909190620f4240906123d2908861394a565b6123dc91906137a0565b90506001600160a01b0388166124765760006123fa60086012613998565b61240590600a61381d565b61240f908361394a565b905080341015801561243b5750620f424061242d82620f424161394a565b61243791906137a0565b3411155b6124705760405162461bcd60e51b8152600401610597906020808252600490820152632166656560e01b604082015260600190565b50612480565b61248088826129de565b82546000906001600160401b03808216916124a491600160401b909104168961394a565b6124ae91906137a0565b604080516060808201835260018083526001600160401b038c8116602080860191825287831686880190815260008f815260088352889020965187549351915168ffffffffffffffffff1990941690151568ffffffffffffffff00191617610100918516919091021770ffffffffffffffff0000000000000000001916600160481b92909316919091029190911790935583516001600160a01b038f1681528d15159381019390935292820184905281018a905260808101919091529091508a90339088907fe6f0e81a24c1b1c11cfcbbce67e7c5ef361e984c1e4f3528125c93f6f906680d9060a00160405180910390a450505050505050505050565b6040516bffffffffffffffffffffffff19606086811b821660208401526034830186905284901b16605482015281151560f81b6068820152600090606901604051602081830303815290604052805190602001209050949350505050565b60015460405163bbe4f6db60e01b81526001600160a01b038581166004830152600092169063bbe4f6db9060240160206040518083038186803b15801561265057600080fd5b505afa158015612664573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061268891906131ae565b90506001600160a01b03811663532f66906126a560086012613998565b6126b090600a61381d565b6126ba908661394a565b6040516001600160e01b031960e084901b16815260048101919091528415156024820152604401600060405180830381600087803b1580156126fb57600080fd5b505af115801561085d573d6000803e3d6000fd5b80158061272357506001600160a01b038216155b1561272d57505050565b60015460405163067aa55560e51b81526001600160a01b038581166004830152600092169063cf54aaa09060240160206040518083038186803b15801561277357600080fd5b505afa158015612787573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ab9190613556565b60ff1690506127bc6008600a61381d565b6127c782600a61381d565b6127d1908461394a565b6127db91906137a0565b91506001600160a01b038416612803576127fe6001600160a01b03841683612d75565b612817565b6128176001600160a01b0385168484612e8e565b50505050565b60008082116128575760405162461bcd60e51b815260206004820152600660248201526521707269636560d01b6044820152606401610597565b612862600880613998565b61286d90600a61381d565b610cda908361394a565b600080600088156128d9578688106128af5786612894818a613998565b61289e908861394a565b6128a891906137a0565b905061290e565b866128ba8982613998565b6128c4908861394a565b6128ce91906137a0565b90506001915061290e565b868811156128ec57866128ba818a613998565b866128f78982613998565b612901908861394a565b61290b91906137a0565b90505b61291a8461038461375d565b42106129b557600061292e6008600a61381d565b61293a9061271061394a565b612948906301da9c0061394a565b6129528642613998565b61295c888a61394a565b612966919061394a565b61297091906137a0565b9050821561298957612982818361375d565b91506129b3565b808210156129a65761299b8282613998565b9150600192506129b3565b6129b08183613998565b91505b505b81156129ce576129c7816000196138c5565b92506129d2565b8092505b50509695505050505050565b8015806129f257506001600160a01b038216155b156129fb575050565b60015460405163067aa55560e51b81526001600160a01b038481166004830152600092169063cf54aaa09060240160206040518083038186803b158015612a4157600080fd5b505afa158015612a55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a799190613556565b60ff169050612a8a6008600a61381d565b612a9582600a61381d565b612a9f908461394a565b612aa991906137a0565b9150612ac06001600160a01b038416333085612ef1565b505050565b600080600080612ad7898989896125ac565b60008181526008602090815260408083208151606081018352905460ff8116151582526001600160401b0361010082048116838601819052600160481b9092048116838501819052878752600790955292909420805495965090949091600160401b90910416612b595760405162461bcd60e51b8152600401610597906136ab565b60008c815260066020908152604091829020825160808101845290546001600160401b038082168352600160401b8204811693830193909352600160801b8104831693820193909352600160c01b909204166060820152612bb98a61281d565b82546060830151919b50600091612bf4918e918e916001600160401b03600160c01b82048116928b9290821691600160801b90910416612877565b6020830151845491925061271091612c1f916001600160401b0390811691600160401b90041661394a565b612c2991906137a0565b612c35906000196138c5565b8113612c8b578254612c5990600160401b90046001600160401b03166000196138c5565b835467ffffffffffffffff60401b19811685556001600160401b038082169750600160401b9091041694509050612d1e565b825484908490600890612caf908490600160401b90046001600160401b03166139af565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550848360000160008282829054906101000a90046001600160401b0316612cf991906139af565b92506101000a8154816001600160401b0302191690836001600160401b031602179055505b8254600160401b90046001600160401b0316612d44576000878152600760205260408120555b60009687526008602052604090962080546001600160881b031916905550909c919b50929950975050505050505050565b80471015612dc55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610597565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612e12576040519150601f19603f3d011682016040523d82523d6000602084013e612e17565b606091505b5050905080612ac05760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610597565b6040516001600160a01b038316602482015260448101829052612ac090849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612f29565b6040516001600160a01b03808516602483015283166044820152606481018290526128179085906323b872dd60e01b90608401612eba565b6000612f7e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612ffb9092919063ffffffff16565b805190915015612ac05780806020019051810190612f9c9190613381565b612ac05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610597565b606061300a8484600085613014565b90505b9392505050565b6060824710156130755760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610597565b843b6130c35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610597565b600080866001600160a01b031685876040516130df9190613579565b60006040518083038185875af1925050503d806000811461311c576040519150601f19603f3d011682016040523d82523d6000602084013e613121565b606091505b509150915061313182828661313c565b979650505050505050565b6060831561314b57508161300d565b82511561315b5782518084602001fd5b8160405162461bcd60e51b81526004016105979190613678565b80356001600160401b038116811461318c57600080fd5b919050565b6000602082840312156131a357600080fd5b813561300d81613a76565b6000602082840312156131c057600080fd5b815161300d81613a76565b600080600080608085870312156131e157600080fd5b84356131ec81613a76565b935060208501356131fc81613a76565b925060408501359150606085013561321381613a8e565b939692955090935050565b600080600080600060a0868803121561323657600080fd5b853561324181613a76565b945060208601359350604086013561325881613a76565b9250606086013561326881613a8e565b9150608086013561327881613a8e565b809150509295509295909350565b600080600080600060a0868803121561329e57600080fd5b85356132a981613a76565b94506020860135935060408601356132c081613a76565b925060608601356132d081613a8e565b949793965091946080013592915050565b600080604083850312156132f457600080fd5b82356132ff81613a76565b946020939093013593505050565b6000806020838503121561332057600080fd5b82356001600160401b038082111561333757600080fd5b818501915085601f83011261334b57600080fd5b81358181111561335a57600080fd5b8660208260051b850101111561336f57600080fd5b60209290920196919550909350505050565b60006020828403121561339357600080fd5b815161300d81613a8e565b6000602082840312156133b057600080fd5b5035919050565b6000806000606084860312156133cc57600080fd5b8335925060208401356133de81613a76565b915060408401356133ee81613a8e565b809150509250925092565b6000806000806080858703121561340f57600080fd5b84359350602085013561342181613a76565b9250604085013561343181613a8e565b9396929550929360600135925050565b600080600080600060a0868803121561345957600080fd5b85359450602086013561346b81613a76565b9350604086013561347b81613a8e565b94979396509394606081013594506080013592915050565b60008082840360a08112156134a757600080fd5b833592506080601f19820112156134bd57600080fd5b50604051608081018181106001600160401b03821117156134ee57634e487b7160e01b600052604160045260246000fd5b6040526134fd60208501613175565b815261350b60408501613175565b602082015261351c60608501613175565b604082015261352d60808501613175565b6060820152809150509250929050565b60006020828403121561354f57600080fd5b5051919050565b60006020828403121561356857600080fd5b815160ff8116811461300d57600080fd5b6000825161358b8184602087016139d7565b9190910192915050565b6020808252825182820181905260009190848201906040850190845b818110156135fc576135e98385518051151582526020808201516001600160401b039081169184019190915260409182015116910152565b92840192606092909201916001016135b1565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156135fc5761366583855180516001600160401b03908116835260208083015182169084015260408083015182169084015260609182015116910152565b9284019260809290920191600101613624565b60208152600082518060208401526136978160408501602087016139d7565b601f01601f19169190910160400192915050565b60208082526009908201526810b837b9b4ba34b7b760b91b604082015260600190565b60208082526006908201526510b7bbb732b960d11b604082015260600190565b60608101610cda82848051151582526020808201516001600160401b039081169184019190915260409182015116910152565b60808101610cda828480516001600160401b03908116835260208083015182169084015260408083015182169084015260609182015116910152565b6000821982111561377057613770613a1e565b500190565b60006001600160401b0380831681851680830382111561379757613797613a1e565b01949350505050565b6000826137af576137af613a34565b500490565b60006001600160401b03808416806137ce576137ce613a34565b92169190910492915050565b600181815b808511156138155781600019048211156137fb576137fb613a1e565b8085161561380857918102915b93841c93908002906137df565b509250929050565b600061300d838360008261383357506001610cda565b8161384057506000610cda565b816001811461385657600281146138605761387c565b6001915050610cda565b60ff84111561387157613871613a1e565b50506001821b610cda565b5060208310610133831016604e8410600b841016171561389f575081810a610cda565b6138a983836137da565b80600019048211156138bd576138bd613a1e565b029392505050565b60006001600160ff1b03818413828413808216868404861116156138eb576138eb613a1e565b600160ff1b600087128281168783058912161561390a5761390a613a1e565b6000871292508782058712848416161561392657613926613a1e565b8785058712818416161561393c5761393c613a1e565b505050929093029392505050565b600081600019048311821515161561396457613964613a1e565b500290565b60006001600160401b038083168185168183048111821515161561398f5761398f613a1e565b02949350505050565b6000828210156139aa576139aa613a1e565b500390565b60006001600160401b03838116908316818110156139cf576139cf613a1e565b039392505050565b60005b838110156139f25781810151838201526020016139da565b838111156128175750506000910152565b6000600019821415613a1757613a17613a1e565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114613a8b57600080fd5b50565b8015158114613a8b57600080fdfea264697066735822122034e563bce6070ea97f58e26ad70dfc74f33012417b36d9f03b57a30d551f288464736f6c63430008070033
Deployed ByteCode Sourcemap
16334:16433:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19249:406;;;;;;;;;;-1:-1:-1;19249:406:0;;;;;:::i;:::-;;:::i;18384:81::-;;;;;;;;;;-1:-1:-1;18384:81:0;;;;;:::i;:::-;;:::i;22736:614::-;;;;;;;;;;-1:-1:-1;22736:614:0;;;;;:::i;:::-;;:::i;26609:1158::-;;;;;;;;;;-1:-1:-1;26609:1158:0;;;;;:::i;:::-;;:::i;32156:286::-;;;;;;;;;;-1:-1:-1;32156:286:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19984:1594;;;;;;:::i;:::-;;:::i;31275:113::-;;;;;;;;;;-1:-1:-1;31275:113:0;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31364:19:0;;;;:8;:19;;;;;;;;;31357:26;;;;;;;;;-1:-1:-1;;;;;31357:26:0;;;;;-1:-1:-1;;;31357:26:0;;;;;;;;;;;-1:-1:-1;;;31357:26:0;;;;;;;;;;;-1:-1:-1;;;31357:26:0;;;;;;;;;31275:113;;;;;;;;:::i;31889:262::-;;;;;;;;;;-1:-1:-1;31889:262:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;17489:41::-;;;;;;;;;;;;17529:1;17489:41;;;;;23710:25:1;;;23698:2;23683:18;17489:41:0;23564:177:1;27772:829:0;;;;;;;;;;-1:-1:-1;27772:829:0;;;;;:::i;:::-;;:::i;31393:249::-;;;;;;;;;;-1:-1:-1;31393:249:0;;;;;:::i;:::-;;:::i;16993:23::-;;;;;;;;;;-1:-1:-1;16993:23:0;;;;-1:-1:-1;;;;;16993:23:0;;;;;;-1:-1:-1;;;;;8814:32:1;;;8796:51;;8784:2;8769:18;16993:23:0;8650:203:1;23405:2011:0;;;;;;;;;;-1:-1:-1;23405:2011:0;;;;;:::i;:::-;;:::i;17020:21::-;;;;;;;;;;-1:-1:-1;17020:21:0;;;;-1:-1:-1;;;;;17020:21:0;;;18772:472;;;;;;;;;;-1:-1:-1;18772:472:0;;;;;:::i;:::-;;:::i;17047:29::-;;;;;;;;;;;;;;;;16944:20;;;;;;;;;;-1:-1:-1;16944:20:0;;;;-1:-1:-1;;;;;16944:20:0;;;18636:131;;;;;;;;;;-1:-1:-1;18636:131:0;;;;;:::i;:::-;;:::i;19675:304::-;;;;;;;;;;-1:-1:-1;19675:304:0;;;;;:::i;:::-;;:::i;17534:48::-;;;;;;;;;;;;;:::i;17095:31::-;;;;;;;;;;;;;;;;18470:161;;;;;;;;;;-1:-1:-1;18470:161:0;;;;;:::i;:::-;;:::i;32447:135::-;;;;;;;;;;-1:-1:-1;32447:135:0;;;;;:::i;:::-;;:::i;31647:237::-;;;;;;;;;;-1:-1:-1;31647:237:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;16968:21::-;;;;;;;;;;-1:-1:-1;16968:21:0;;;;-1:-1:-1;;;;;16968:21:0;;;21583:1148;;;;;;:::i;:::-;;:::i;19249:406::-;32735:5;;-1:-1:-1;;;;;32735:5:0;32721:10;:19;32713:38;;;;-1:-1:-1;;;32713:38:0;;;;;;;:::i;:::-;;;;;;;;;19342:23:::1;19368:19:::0;;;:8:::1;:19;::::0;;;;19402:28;;-1:-1:-1;;;19402:28:0;::::1;-1:-1:-1::0;;;;;19402:28:0::1;19394:68;;;::::0;-1:-1:-1;;;19394:68:0;;18861:2:1;19394:68:0::1;::::0;::::1;18843:21:1::0;18900:2;18880:18;;;18873:30;18939:25;18919:18;;;18912:53;18982:18;;19394:68:0::1;18659:347:1::0;19394:68:0::1;19491:20:::0;;19469:42;;19530:12:::1;::::0;::::1;::::0;19566:17:::1;::::0;::::1;::::0;19619:29:::1;::::0;;::::1;::::0;-1:-1:-1;;;;;19588:60:0;;::::1;-1:-1:-1::0;;;19588:60:0::1;-1:-1:-1::0;;;;19547:36:0;;::::1;-1:-1:-1::0;;;19547:36:0::1;19588:60:::0;;;;;19516:26;;::::1;-1:-1:-1::0;;;19516:26:0::1;-1:-1:-1::0;;19516:26:0;;;19469:42;;;::::1;19516:26:::0;;;;::::1;19588:60:::0;;;;;::::1;::::0;;-1:-1:-1;19249:406:0:o;18384:81::-;32735:5;;-1:-1:-1;;;;;32735:5:0;32721:10;:19;32713:38;;;;-1:-1:-1;;;32713:38:0;;;;;;;:::i;:::-;18444:5:::1;:16:::0;;-1:-1:-1;;;;;;18444:16:0::1;-1:-1:-1::0;;;;;18444:16:0;;;::::1;::::0;;;::::1;::::0;;18384:81::o;22736:614::-;22836:11;22850:56;22866:10;22878:9;22889:8;22899:6;22850:15;:56::i;:::-;22913:18;22934:11;;;:6;:11;;;;;;;;;22913:32;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22913:32:0;;;;;;;;;;;-1:-1:-1;;;22913:32:0;;;;;;;;;;;22836:70;;-1:-1:-1;22913:32:0;22950:34;;;;-1:-1:-1;;;22950:34:0;;16323:2:1;22950:34:0;;;16305:21:1;16362:1;16342:18;;;16335:29;-1:-1:-1;;;16380:18:1;;;16373:37;16427:18;;22950:34:0;16121:330:1;22950:34:0;22991:22;23016:19;;;:8;:19;;;;;;;;22991:44;;;;;;;;;-1:-1:-1;;;;;22991:44:0;;;;;-1:-1:-1;;;22991:44:0;;;;;;;;-1:-1:-1;;;22991:44:0;;;;;;;;;;-1:-1:-1;;;22991:44:0;;;;;;;;23054:10;;;;22991:44;;:22;23081:5;;23054:24;;;:::i;:::-;:32;;;;:::i;:::-;23100:11;;;;:6;:11;;;;;23093:18;;-1:-1:-1;;;;;;23093:18:0;;;23181:13;;-1:-1:-1;;;;;23040:46:0;;;;;-1:-1:-1;23040:46:0;;23176:114;;23202:47;23222:8;23232:5;:10;;;-1:-1:-1;;;;;23202:47:0;23244:4;23202:19;:47::i;:::-;23272:12;;;;23255:29;;-1:-1:-1;;;;;23255:29:0;;;:::i;:::-;;;23176:114;23294:49;23307:8;23317:10;23329:13;23294:12;:49::i;:::-;22829:521;;;;;22736:614;;;:::o;26609:1158::-;32653:6;;-1:-1:-1;;;;;32653:6:0;32639:10;:20;32631:40;;;;-1:-1:-1;;;32631:40:0;;15314:2:1;32631:40:0;;;15296:21:1;15353:1;15333:18;;;15326:29;-1:-1:-1;;;15371:18:1;;;15364:37;15418:18;;32631:40:0;15112:330:1;32631:40:0;26761:11:::1;26775:50;26791:4;26797:9;26808:8;26818:6;26775:15;:50::i;:::-;26832:24;26859:14:::0;;;:9:::1;:14;::::0;;;;;;;;26832:41;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;26832:41:0;;::::1;::::0;;-1:-1:-1;;;26832:41:0;::::1;::::0;::::1;::::0;;::::1;::::0;;;-1:-1:-1;;;26832:41:0;::::1;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;26832:41:0;::::1;::::0;;::::1;::::0;;;;26761:64;;-1:-1:-1;26832:41:0;26884:20;;:42:::1;;-1:-1:-1::0;26908:13:0;;-1:-1:-1;;;;;26908:18:0::1;::::0;26884:42:::1;26880:66;;;26934:7;;;;26880:66;26952:23;26978:19:::0;;;:8:::1;:19;::::0;;;;27012:21:::1;27027:5:::0;27012:14:::1;:21::i;:::-;27004:29;;27040:10;27053:91;27061:6;27069:5;27076:8;:14;;;-1:-1:-1::0;;;;;27053:91:0::1;27092:8;:13;;;-1:-1:-1::0;;;;;27053:91:0::1;27107:7;:16;;;;;;;;;;-1:-1:-1::0;;;;;27107:16:0::1;-1:-1:-1::0;;;;;27053:91:0::1;27125:8;:18;;;-1:-1:-1::0;;;;;27053:91:0::1;:7;:91::i;:::-;27040:104;;27151:17;27220:5;27189:7;:28;;;;;;;;;;-1:-1:-1::0;;;;;27189:28:0::1;27171:8;:15;;;:46;;;;:::i;:::-;:54;;;;:::i;:::-;-1:-1:-1::0;;;;;27151:74:0::1;::::0;-1:-1:-1;27243:22:0::1;27151:74:::0;-1:-1:-1;;27243:22:0::1;:::i;:::-;27236:3;:29;27232:529;;27275:11;27307:9;27289:8;:15;;;-1:-1:-1::0;;;;;27289:27:0::1;;;;;:::i;:::-;27345:6;::::0;27337:33:::1;::::0;-1:-1:-1;;;27337:33:0;;-1:-1:-1;;;;;8814:32:1;;;27337:33:0::1;::::0;::::1;8796:51:1::0;27275:41:0;;-1:-1:-1;27322:12:0::1;::::0;27345:6;;::::1;::::0;27337:23:::1;::::0;8769:18:1;;27337:33:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27322:48;;27378:39;27391:8;27401:4;27407:9;27378:12;:39::i;:::-;27423:50;27443:8;27453;:13;;;-1:-1:-1::0;;;;;27423:50:0::1;27468:4;27423:19;:50::i;:::-;-1:-1:-1::0;;;;;27479:21:0;::::1;;::::0;;;:11:::1;:21;::::0;;;;:28;;27504:3;;27479:21;:28:::1;::::0;27504:3;;27479:28:::1;:::i;:::-;::::0;;;-1:-1:-1;;27618:15:0::1;::::0;::::1;::::0;27640:13;;27562:9;;-1:-1:-1;;;;;27520:204:0;::::1;::::0;27540:3;;27520:204:::1;::::0;27578:8;;27593:6;;27606:5;;27618:15;27660:3;27670:37:::1;-1:-1:-1::0;;;;;27682:24:0;::::1;-1:-1:-1::0;;27670:37:0::1;:::i;:::-;27520:204;::::0;;-1:-1:-1;;;;;10825:32:1;;;10807:51;;10901:14;;10894:22;10889:2;10874:18;;10867:50;10933:18;;;10926:34;;;;-1:-1:-1;;;;;11033:15:1;;;11028:2;11013:18;;11006:43;11086:15;11080:3;11065:19;;11058:44;10845:3;11118:19;;11111:35;11177:3;11162:19;;11155:35;27714:4:0::1;11221:3:1::0;11206:19;;11199:51;10794:3;10779:19;27520:204:0::1;;;;;;;-1:-1:-1::0;;27739:14:0::1;::::0;;;:9:::1;:14;::::0;;;;27732:21;27232:529:::1;26754:1013;;;;;32676:1;26609:1158:::0;;;;;:::o;32156:286::-;32225:28;32277:4;;-1:-1:-1;;;;;32306:22:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32306:22:0;;-1:-1:-1;;32306:22:0;;;;;;;;;;;;32293:35;;32338:9;32333:83;32357:6;32353:1;:10;32333:83;;;32392:9;:18;32402:4;;32407:1;32402:7;;;;;;;:::i;:::-;;;;;;;;;;32392:18;;-1:-1:-1;32392:18:0;;;;;;;;;;;-1:-1:-1;32392:18:0;32376:34;;;;;;;;;-1:-1:-1;;;;;32376:34:0;;;;;-1:-1:-1;;;32376:34:0;;;;;;;;;;;-1:-1:-1;;;32376:34:0;;;;;;;;;;;-1:-1:-1;;;32376:34:0;;;;;;;;;;:13;;:10;;32387:1;;32376:13;;;;;;:::i;:::-;;;;;;:34;;;;32365:3;;;;;:::i;:::-;;;;32333:83;;;;32420:17;32156:286;;;;;:::o;19984:1594::-;-1:-1:-1;;;;;20132:22:0;;20128:193;;20211:18;17529:1;20211:2;:18;:::i;:::-;20206:24;;:2;:24;:::i;:::-;20194:36;;:9;:36;:::i;:::-;20185:45;;20128:193;;;20264:6;;20256:45;;-1:-1:-1;;;20256:45:0;;-1:-1:-1;;;;;8814:32:1;;;20256:45:0;;;8796:51:1;20264:6:0;;;;20256:35;;8769:18:1;;20256:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20248:67;;;;-1:-1:-1;;;20248:67:0;;17850:2:1;20248:67:0;;;17832:21:1;17889:1;17869:18;;;17862:29;-1:-1:-1;;;17907:18:1;;;17900:39;17956:18;;20248:67:0;17648:332:1;20248:67:0;20363:1;20354:6;:10;:39;;;;-1:-1:-1;;;;;;20368:25:0;;20354:39;20346:59;;;;-1:-1:-1;;;20346:59:0;;19213:2:1;20346:59:0;;;19195:21:1;19252:1;19232:18;;;19225:29;-1:-1:-1;;;19270:18:1;;;19263:37;19317:18;;20346:59:0;19011:330:1;20346:59:0;20425:1;20418:4;:8;:35;;;;-1:-1:-1;;;;;;20430:23:0;;20418:35;20410:53;;;;-1:-1:-1;;;20410:53:0;;18187:2:1;20410:53:0;;;18169:21:1;18226:1;18206:18;;;18199:29;-1:-1:-1;;;18244:18:1;;;18237:35;18289:18;;20410:53:0;17985:328:1;20410:53:0;20470:11;20484:56;20500:10;20512:9;20523:8;20533:6;20484:15;:56::i;:::-;20547:18;20568:11;;;:6;:11;;;;;;;;;20547:32;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20547:32:0;;;;;;;;;;;-1:-1:-1;;;20547:32:0;;;;;;;;;;;20470:70;;-1:-1:-1;20547:32:0;20592:15;20584:34;;;;-1:-1:-1;;;20584:34:0;;22685:2:1;20584:34:0;;;22667:21:1;22724:1;22704:18;;;22697:29;-1:-1:-1;;;22742:18:1;;;22735:36;22788:18;;20584:34:0;22483:329:1;20584:34:0;20643:22;20668:19;;;:8;:19;;;;;;;;20643:44;;;;;;;;;-1:-1:-1;;;;;20643:44:0;;;;;-1:-1:-1;;;20643:44:0;;;;;;;;;;;-1:-1:-1;;;20643:44:0;;;;;;;;;;-1:-1:-1;;;20643:44:0;;;;;;;;;;;:22;20727:5;;20706:18;;:4;:18;:::i;:::-;:26;;;;:::i;:::-;20692:40;-1:-1:-1;;;;;;20743:22:0;;20739:148;;20790:3;20781:6;:12;20773:36;;;;-1:-1:-1;;;20773:36:0;;14974:2:1;20773:36:0;;;14956:21:1;15013:2;14993:18;;;14986:30;-1:-1:-1;;;15032:18:1;;;15025:41;15083:18;;20773:36:0;14772:335:1;20773:36:0;20815:13;20825:3;20815:13;;:::i;:::-;;;20739:148;;;20846:35;20858:8;20868:12;20877:3;20868:6;:12;:::i;:::-;20846:11;:35::i;:::-;-1:-1:-1;;;;;20911:19:0;;;;;;:9;:19;;;;;;20901:29;;;20893:53;;;;-1:-1:-1;;;20893:53:0;;19548:2:1;20893:53:0;;;19530:21:1;19587:2;19567:18;;;19560:30;-1:-1:-1;;;19606:18:1;;;19599:41;19657:18;;20893:53:0;19346:335:1;20893:53:0;20953:16;20986:6;20979:4;17565:17;17529:1;17565:2;:17;:::i;:::-;20972:11;;;;:::i;:::-;:20;;;;:::i;:::-;20953:39;-1:-1:-1;17565:17:0;17529:1;17565:2;:17;:::i;:::-;21005:8;:16;;20997:38;;;;-1:-1:-1;;;20997:38:0;;20232:2:1;20997:38:0;;;20214:21:1;20271:1;20251:18;;;20244:29;-1:-1:-1;;;20289:18:1;;;20282:39;20338:18;;20997:38:0;20030:332:1;20997:38:0;21060:19;;-1:-1:-1;;;;;21048:31:0;;;;21040:57;;;;-1:-1:-1;;;21040:57:0;;21598:2:1;21040:57:0;;;21580:21:1;21637:2;21617:18;;;21610:30;-1:-1:-1;;;21656:18:1;;;21649:43;21709:18;;21040:57:0;21396:337:1;21040:57:0;21143:42;21163:8;21173:4;21179:5;21143:19;:42::i;:::-;21213:6;;21205:33;;-1:-1:-1;;;21205:33:0;;-1:-1:-1;;;;;8814:32:1;;;21205:33:0;;;8796:51:1;21190:12:0;;21213:6;;21205:23;;8769:18:1;;21205:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21190:48;;21243:19;21271:4;-1:-1:-1;;;;;21265:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21243:50;;21320:5;21306:11;:19;21298:44;;;;-1:-1:-1;;;21298:44:0;;18520:2:1;21298:44:0;;;18502:21:1;18559:2;18539:18;;;18532:30;-1:-1:-1;;;18578:18:1;;;18571:42;18630:18;;21298:44:0;18318:336:1;21298:44:0;21363:84;;;;;;;;21384:5;21363:84;;;;;;21408:4;-1:-1:-1;;;;;21363:84:0;;;;;21434:6;-1:-1:-1;;;;;21363:84:0;;;;21349:6;:11;21356:3;21349:11;;;;;;;;;;;:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21349:98:0;;;;;-1:-1:-1;;;;;21349:98:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21349:98:0;;;;;-1:-1:-1;;;;;21349:98:0;;;;;;;;;21498:9;21482:10;-1:-1:-1;;;;;21459:112:0;21473:3;21459:112;21513:8;21527:6;21539;21551:4;21561:5;21459:112;;;;;;;;;-1:-1:-1;;;;;9503:32:1;;;;9485:51;;9579:14;;9572:22;9567:2;9552:18;;9545:50;9626:2;9611:18;;9604:34;;;;9669:2;9654:18;;9647:34;9725:14;9718:22;9712:3;9697:19;;9690:51;9472:3;9457:19;;9238:509;21459:112:0;;;;;;;;20121:1457;;;;;;;19984:1594;;;;;:::o;31889:262::-;31955:22;32001:4;;-1:-1:-1;;;;;32027:19:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;32027:19:0;;-1:-1:-1;;32027:19:0;;;;;;;;;;;;32017:29;;32056:9;32051:77;32075:6;32071:1;:10;32051:77;;;32107:6;:15;32114:4;;32119:1;32114:7;;;;;;;:::i;:::-;;;;;;;;;;32107:15;;-1:-1:-1;32107:15:0;;;;;;;;;;;-1:-1:-1;32107:15:0;32094:28;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32094:28:0;;;;;;;;;;;;-1:-1:-1;;;32094:28:0;;;;;;;;;:10;;:7;;32102:1;;32094:10;;;;;;:::i;:::-;;;;;;:28;;;;32083:3;;;;;:::i;:::-;;;;32051:77;;27772:829;32735:5;;-1:-1:-1;;;;;32735:5:0;32721:10;:19;32713:38;;;;-1:-1:-1;;;32713:38:0;;;;;;;:::i;:::-;27922:11:::1;27936:50;27952:4;27958:9;27969:8;27979:6;27936:15;:50::i;:::-;27993:25;28021:14:::0;;;:9:::1;:14;::::0;;;;28048:15;;28021:14;;-1:-1:-1;28021:14:0;-1:-1:-1;;;28048:15:0;::::1;-1:-1:-1::0;;;;;28048:15:0::1;28040:41;;;;-1:-1:-1::0;;;28040:41:0::1;;;;;;;:::i;:::-;28105:15:::0;;28132:155:::1;::::0;;-1:-1:-1;;;;;11623:32:1;;;11605:51;;11699:14;;11692:22;11687:2;11672:18;;11665:50;-1:-1:-1;;;28212:14:0;::::1;-1:-1:-1::0;;;;;28212:14:0;;::::1;11768:18:1::0;;;11761:43;-1:-1:-1;;;28105:15:0;::::1;::::0;::::1;11835:2:1::0;11820:18;;11813:34;;;28244:13:0;::::1;11878:3:1::0;11863:19;;11856:44;-1:-1:-1;11643:3:1;11916:19;;11909:35;;;11975:3;11960:19;;11953:35;;;12019:3;12004:19;;11997:51;28132:155:0;;28171:9;;28132:155;::::1;::::0;28151:3;;28132:155:::1;::::0;;;;11592:3:1;28132:155:0;;::::1;28301:11;::::0;;;:6:::1;:11;::::0;;;;28294:18;;-1:-1:-1;;;;;;28294:18:0;;;28319:146;::::1;;;28341:22;28366:19:::0;;;:8:::1;:19;::::0;;;;;;;28341:44;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;28341:44:0;;::::1;::::0;;-1:-1:-1;;;28341:44:0;::::1;::::0;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;28341:44:0;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;;;28341:44:0;::::1;::::0;::::1;::::0;;;;28405:13;;28341:44;;:22;28435:5:::1;::::0;28405:27:::1;::::0;28341:44;;28405:13:::1;:27;:::i;:::-;:35;;;;:::i;:::-;-1:-1:-1::0;;;;;28391:49:0::1;::::0;-1:-1:-1;28446:13:0::1;28391:49:::0;28446:13;::::1;:::i;:::-;;;28335:130;;28319:146;28501:13:::0;;28471:50:::1;::::0;28491:8;;-1:-1:-1;;;;;28501:13:0::1;::::0;28471:19:::1;:50::i;:::-;28537:14;::::0;;;:9:::1;:14;::::0;;;;28530:21;28558:36:::1;28571:8:::0;28581:4;28587:6;28558:12:::1;:36::i;31393:249::-:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31561:50:0;31577:4;31583:9;31594:8;31604:6;31561:15;:50::i;:::-;31623:14;;;;:9;:14;;;;;;;;;31616:21;;;;;;;;;-1:-1:-1;;;;;31616:21:0;;;;;-1:-1:-1;;;31616:21:0;;;;;;;;;;;-1:-1:-1;;;31616:21:0;;;;;;;;;;;-1:-1:-1;;;31616:21:0;;;;;;;;;31393:249;-1:-1:-1;;;;;;31393:249:0:o;23405:2011::-;32653:6;;-1:-1:-1;;;;;32653:6:0;32639:10;:20;32631:40;;;;-1:-1:-1;;;32631:40:0;;15314:2:1;32631:40:0;;;15296:21:1;15353:1;15333:18;;;15326:29;-1:-1:-1;;;15371:18:1;;;15364:37;15418:18;;32631:40:0;15112:330:1;32631:40:0;23551:11:::1;23565:50;23581:4;23587:9;23598:8;23608:6;23565:15;:50::i;:::-;23622:19;23644:11:::0;;;:6:::1;:11;::::0;;;;23668:10;;23644:11;;-1:-1:-1;23644:11:0;23668:10:::1;::::0;::::1;-1:-1:-1::0;;;;;23668:10:0::1;23660:34;;;::::0;-1:-1:-1;;;23660:34:0;;16323:2:1;23660:34:0::1;::::0;::::1;16305:21:1::0;16362:1;16342:18;;;16335:29;-1:-1:-1;;;16380:18:1;;;16373:37;16427:18;;23660:34:0::1;16121:330:1::0;23660:34:0::1;23711:22;23736:19:::0;;;:8:::1;:19;::::0;;;;;;;23711:44;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;23711:44:0;;::::1;::::0;;-1:-1:-1;;;23711:44:0;::::1;::::0;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;23711:44:0;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;;;23711:44:0;::::1;::::0;::::1;::::0;;;;23774:10;;23711:44;;:22;23801:5:::1;::::0;23774:24:::1;::::0;23711:44;;::::1;23774:10:::0;;::::1;;:24;:::i;:::-;:32;;;;:::i;:::-;-1:-1:-1::0;;;;;23760:46:0::1;;;23836:3;23811:11;:21;23823:8;-1:-1:-1::0;;;;;23811:21:0::1;-1:-1:-1::0;;;;;23811:21:0::1;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;23850:13:0;;::::1;;23846:1564;;;23884:14;23900:12:::0;23914:10:::1;23928:59;23946:4;23952:9;23963:8;23973:6;23981:5;23928:17;:59::i;:::-;24019:6;::::0;24011:33:::1;::::0;-1:-1:-1;;;24011:33:0;;-1:-1:-1;;;;;8814:32:1;;;24011:33:0::1;::::0;::::1;8796:51:1::0;23883:104:0;;-1:-1:-1;23883:104:0;;-1:-1:-1;23883:104:0;;-1:-1:-1;23996:12:0::1;::::0;24019:6:::1;::::0;24011:23:::1;::::0;8769:18:1;;24011:33:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23996:48;;24063:1;24057:3;:7;24053:378;;;24083:19;24113:8;24118:3:::0;-1:-1:-1;;24113:8:0::1;:::i;:::-;24083:39;;24131:41;24144:8;24154:4;24160:11;24131:12;:41::i;:::-;24199:6;24185:11;:20;24181:96;;;24217:50;24230:8:::0;24240:4;24246:20:::1;24255:11:::0;24246:6;:20:::1;:::i;:::-;24217:12;:50::i;:::-;24074:211;24053:378;;;-1:-1:-1::0;;;;;24306:28:0;::::1;;24335:4:::0;24361:16:::1;17529:1;24361:2;:16;:::i;:::-;24356:22;::::0;:2:::1;:22;:::i;:::-;24341:37;::::0;24349:3;24341:37:::1;:::i;:::-;24306:73;::::0;-1:-1:-1;;;;;;24306:73:0::1;::::0;;;;;;-1:-1:-1;;;;;12888:32:1;;;24306:73:0::1;::::0;::::1;12870:51:1::0;12937:18;;;12930:34;12843:18;;24306:73:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;24387:36;24400:8;24410:4;24416:6;24387:12;:36::i;:::-;24439:41;24459:8;24469:4;24475;24439:19;:41::i;:::-;24494:165;::::0;;-1:-1:-1;;;;;10099:32:1;;;10081:51;;10175:14;;10168:22;10163:2;10148:18;;10141:50;10207:18;;;10200:34;;;10265:2;10250:18;;10243:34;;;10308:3;10293:19;;10286:35;;;10119:3;10337:19;;10330:35;;;10396:3;10381:19;;10374:35;;;24647:5:0::1;10440:3:1::0;10425:19;;10418:51;24539:9:0;;24494:165;::::1;::::0;24515:3;;24494:165:::1;::::0;10068:3:1;10053:19;24494:165:0::1;;;;;;;23876:792;;;;23846:1564;;;24739:21;24754:5;24739:14;:21::i;:::-;24768:25;24796:14:::0;;;:9:::1;:14;::::0;;;;24967:10;;24942:13;;24731:29;;-1:-1:-1;24796:14:0;;24934:44:::1;::::0;-1:-1:-1;;;;;24967:10:0::1;::::0;;::::1;::::0;::::1;::::0;24942:13:::1;24934:44;:::i;:::-;24901:10:::0;;24893:36:::1;::::0;24923:5;;24901:10:::1;::::0;::::1;-1:-1:-1::0;;;;;24901:10:0::1;24893:36;:::i;:::-;24875:14:::0;;24842:48:::1;::::0;-1:-1:-1;;;;;;;;24875:14:0;::::1;::::0;::::1;::::0;24850:13:::1;24842:48;:::i;:::-;:87;;;;:::i;:::-;24841:138;;;;:::i;:::-;24991:18:::0;;24818:161;;-1:-1:-1;;;;24991:18:0;::::1;-1:-1:-1::0;;;;;24991:18:0::1;24987:87;;25023:44:::0;;-1:-1:-1;;;;25023:44:0::1;-1:-1:-1::0;;;25051:15:0::1;-1:-1:-1::0;;;;;25023:44:0::1;;;::::0;;24987:87:::1;25105:10:::0;;25081:35;;-1:-1:-1;;;;;25105:10:0::1;::::0;;::::1;::::0;::::1;::::0;25081:8;;25105:10:::1;::::0;25081:35:::1;::::0;25105:10;;25081:35:::1;;:::i;:::-;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;;25081:35:0;;::::1;;::::0;;::::1;::::0;;::::1;;;::::0;;;25148:12;;25122:39;;-1:-1:-1;;;25148:12:0;;::::1;::::0;::::1;::::0;-1:-1:-1;25122:39:0;;:15:::1;::::0;:39:::1;::::0;25148:12;;-1:-1:-1;;;25122:39:0;::::1;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;25122:39:0::1;;;;;-1:-1:-1::0;;;;;25122:39:0::1;;;;;;25191:12;25167:8;:14;;;:37;;;;;-1:-1:-1::0;;;;;25167:37:0::1;;;;;-1:-1:-1::0;;;;;25167:37:0::1;;;;;;25219:6;:11;25226:3;25219:11;;;;;;;;;;;;25212:18:::0;::::1;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;25212:18:0::1;;;;;;;;;;;;;;-1:-1:-1::0;;;;;25212:18:0::1;;;;;;;25286:9;25275:4;-1:-1:-1::0;;;;;25243:159:0::1;25265:3;25243:159;25302:8;25317:6;25330:8;:15;;;;;;;;;;-1:-1:-1::0;;;;;25330:15:0::1;25352:8;:13;;;;;;;;;;-1:-1:-1::0;;;;;25352:13:0::1;25372:8;:14;;;;;;;;;;-1:-1:-1::0;;;;;25372:14:0::1;25393:3;25243:159;;;;;;;;;;-1:-1:-1::0;;;;;12355:32:1;;;;12337:51;;12431:14;;12424:22;12419:2;12404:18;;12397:50;-1:-1:-1;;;;;12520:15:1;;;12515:2;12500:18;;12493:43;12572:15;;;12567:2;12552:18;;12545:43;12625:15;12619:3;12604:19;;12597:44;12375:3;12657:19;;12650:35;12324:3;12309:19;;12059:632;25243:159:0::1;;;;;;;;24681:729;;23846:1564;23544:1872;;;;23405:2011:::0;;;;;:::o;18772:472::-;32735:5;;-1:-1:-1;;;;;32735:5:0;32721:10;:19;32713:38;;;;-1:-1:-1;;;32713:38:0;;;;;;;:::i;:::-;18864:22:::1;18889:19:::0;;;:8:::1;:19;::::0;;;;;;;;18864:44;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;18864:44:0;;::::1;::::0;;-1:-1:-1;;;18864:44:0;::::1;::::0;::::1;::::0;;::::1;::::0;;;-1:-1:-1;;;18864:44:0;::::1;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;18864:44:0;::::1;::::0;;::::1;::::0;;;;18925:33;18917:61:::1;;;::::0;-1:-1:-1;;;18917:61:0;;19888:2:1;18917:61:0::1;::::0;::::1;19870:21:1::0;19927:2;19907:18;;;19900:30;-1:-1:-1;;;19946:18:1;;;19939:45;20001:18;;18917:61:0::1;19686:339:1::0;18917:61:0::1;19023:1;18991:8;:29;;;-1:-1:-1::0;;;;;18991:33:0::1;;18983:59;;;::::0;-1:-1:-1;;;18983:59:0;;15981:2:1;18983:59:0::1;::::0;::::1;15963:21:1::0;16020:2;16000:18;;;15993:30;-1:-1:-1;;;16039:18:1;;;16032:43;16092:18;;18983:59:0::1;15779:337:1::0;18983:59:0::1;-1:-1:-1::0;19071:166:0::1;::::0;;::::1;::::0;::::1;::::0;;19098:20;;-1:-1:-1;;;;;19071:166:0;;::::1;::::0;;::::1;19202:29:::0;;::::1;::::0;19071:166;::::1;::::0;;::::1;::::0;;;19129:12;;::::1;::::0;19071:166;::::1;::::0;;;;;;;19157:17;;::::1;::::0;19071:166;::::1;::::0;;;;;;-1:-1:-1;19049:19:0;;;:8:::1;:19:::0;;;;;;;:188;;;;;;;;;;;::::1;-1:-1:-1::0;;;19049:188:0::1;-1:-1:-1::0;;;;;19049:188:0;;::::1;-1:-1:-1::0;;;19049:188:0::1;::::0;;;;;;;::::1;-1:-1:-1::0;;;19049:188:0::1;-1:-1:-1::0;;19049:188:0;;;;;;::::1;::::0;;;;::::1;::::0;;;;;::::1;::::0;;18772:472::o;18636:131::-;32735:5;;-1:-1:-1;;;;;32735:5:0;32721:10;:19;32713:38;;;;-1:-1:-1;;;32713:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18730:19:0;;::::1;;::::0;;;:9:::1;:19;::::0;;;;:32;18636:131::o;19675:304::-;-1:-1:-1;;;;;19752:21:0;;19731:18;19752:21;;;:11;:21;;;;;;19782:14;;19778:197;;-1:-1:-1;;;;;19804:21:0;;;19828:1;19804:21;;;:11;:21;;;;;:25;19858:8;;19835:44;;19816:8;;19858;19868:10;19835:12;:44::i;:::-;19895:8;;-1:-1:-1;;;;;19895:8:0;19885:37;19923:8;19951:16;17529:1;19951:2;:16;:::i;:::-;19946:22;;:2;:22;:::i;:::-;19933:35;;:10;:35;:::i;:::-;19885:84;;-1:-1:-1;;;;;;19885:84:0;;;;;;;-1:-1:-1;;;;;12888:32:1;;;19885:84:0;;;12870:51:1;12937:18;;;12930:34;12843:18;;19885:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19778:197;19726:253;19675:304;:::o;17534:48::-;17565:17;17529:1;17565:2;:17;:::i;:::-;17534:48;:::o;18470:161::-;32735:5;;-1:-1:-1;;;;;32735:5:0;32721:10;:19;32713:38;;;;-1:-1:-1;;;32713:38:0;;;;;;;:::i;:::-;18530:6:::1;:16:::0;;-1:-1:-1;;;;;;18530:16:0::1;-1:-1:-1::0;;;;;18530:16:0;::::1;::::0;;::::1;::::0;;;18562:26:::1;::::0;;-1:-1:-1;;;18562:26:0;;;;:24:::1;::::0;:26:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;18530:16;18562:26;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18551:8;:37:::0;;-1:-1:-1;;;;;;18551:37:0::1;-1:-1:-1::0;;;;;18551:37:0;;::::1;;::::0;;-1:-1:-1;18610:6:0;18602:24:::1;::::0;;-1:-1:-1;;;18602:24:0;;;;18610:6;;;::::1;::::0;18602:22:::1;::::0;:24:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;18610:6;18602:24;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18593:6;:33:::0;;-1:-1:-1;;;;;;18593:33:0::1;-1:-1:-1::0;;;;;18593:33:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;18470:161:0:o;32447:135::-;32510:7;32560:16;17529:1;32560:2;:16;:::i;:::-;32555:22;;:2;:22;:::i;:::-;-1:-1:-1;;;;;32531:21:0;;;;;;:11;:21;;;;;;:46;;;;:::i;31647:237::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;31806:50:0;31822:4;31828:9;31839:8;31849:6;31806:15;:50::i;:::-;31868:11;;;;:6;:11;;;;;;;;;31861:18;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31861:18:0;;;;;;;;;;;;-1:-1:-1;;;31861:18:0;;;;;;;;;;;;;-1:-1:-1;;31647:237:0;;;;;;:::o;21583:1148::-;21728:1;21721:4;:8;21713:26;;;;-1:-1:-1;;;21713:26:0;;18187:2:1;21713:26:0;;;18169:21:1;18226:1;18206:18;;;18199:29;-1:-1:-1;;;18244:18:1;;;18237:35;18289:18;;21713:26:0;17985:328:1;21713:26:0;21746:11;21760:56;21776:10;21788:9;21799:8;21809:6;21760:15;:56::i;:::-;21823:18;21844:11;;;:6;:11;;;;;;;;;21823:32;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21823:32:0;;;;;;;;;;;-1:-1:-1;;;21823:32:0;;;;;;;;;;;21746:70;;-1:-1:-1;21823:32:0;21868:15;21860:34;;;;-1:-1:-1;;;21860:34:0;;22685:2:1;21860:34:0;;;22667:21:1;22724:1;22704:18;;;22697:29;-1:-1:-1;;;22742:18:1;;;22735:36;22788:18;;21860:34:0;22483:329:1;21860:34:0;21940:25;21968:14;;;:9;:14;;;;;21995:15;;-1:-1:-1;;;21995:15:0;;-1:-1:-1;;;;;21995:15:0;21987:41;;;;-1:-1:-1;;;21987:41:0;;;;;;;:::i;:::-;22046:13;;-1:-1:-1;;;;;22046:13:0;22039:20;;22035:58;;;22074:13;;-1:-1:-1;;;;;22074:13:0;;-1:-1:-1;22035:58:0;22099:22;22124:19;;;:8;:19;;;;;;;;22099:44;;;;;;;;;-1:-1:-1;;;;;22099:44:0;;;;;-1:-1:-1;;;22099:44:0;;;;;;;;;;;-1:-1:-1;;;22099:44:0;;;;;;;;;;-1:-1:-1;;;22099:44:0;;;;;;;;;;;:22;22183:5;;22162:18;;:4;:18;:::i;:::-;:26;;;;:::i;:::-;22148:40;-1:-1:-1;;;;;;22199:22:0;;22195:223;;22229:17;22260:16;17529:1;22260:2;:16;:::i;:::-;22255:22;;:2;:22;:::i;:::-;22249:28;;:3;:28;:::i;:::-;22229:48;;22304:9;22291;:22;;:68;;;;-1:-1:-1;22354:5:0;22330:23;:9;22343;22330:23;:::i;:::-;:29;;;;:::i;:::-;22317:9;:42;;22291:68;22283:85;;;;-1:-1:-1;;;22283:85:0;;;;;;15649:2:1;15631:21;;;15688:1;15668:18;;;15661:29;-1:-1:-1;;;15721:2:1;15706:18;;15699:34;15765:2;15750:18;;15447:327;22283:85:0;22223:151;22195:223;;;22386:26;22398:8;22408:3;22386:11;:26::i;:::-;22483:13;;22424:14;;-1:-1:-1;;;;;22483:13:0;;;;22441:31;;-1:-1:-1;;;22456:15:0;;;;22441:4;:31;:::i;:::-;:56;;;;:::i;:::-;22518:83;;;;;;;;;22539:4;22518:83;;;-1:-1:-1;;;;;22518:83:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;22504:11:0;;;:6;:11;;;;;:97;;;;;;;;-1:-1:-1;;22504:97:0;;;;;;-1:-1:-1;;22504:97:0;;;;;;;;;;;-1:-1:-1;;22504:97:0;-1:-1:-1;;;22504:97:0;;;;;;;;;;;;;;;22613:111;;-1:-1:-1;;;;;9503:32:1;;9485:51;;9579:14;;9572:22;9552:18;;;9545:50;;;;9611:18;;;9604:34;;;9654:18;;9647:34;;;9712:3;9697:19;;9690:51;;;;22518:83:0;;-1:-1:-1;22652:9:0;;22636:10;;22504:11;;22613:111;;9472:3:1;9457:19;22613:111:0;;;;;;;21706:1025;;;;;;21583:1148;;;;:::o;28717:209::-;28866:51;;-1:-1:-1;;7950:2:1;7946:15;;;7942:24;;28866:51:0;;;7930:37:1;7983:12;;;7976:28;;;8038:15;;;8034:24;8020:12;;;8013:46;8105:14;;8098:22;8093:3;8089:32;8075:12;;;8068:54;28829:7:0;;8138:12:1;;28866:51:0;;;;;;;;;;;;28856:62;;;;;;28849:69;;28717:209;;;;;;:::o;28931:229::-;29048:6;;29040:33;;-1:-1:-1;;;29040:33:0;;-1:-1:-1;;;;;8814:32:1;;;29040:33:0;;;8796:51:1;29025:12:0;;29048:6;;29040:23;;8769:18:1;;29040:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29025:48;-1:-1:-1;;;;;;29078:30:0;;;29123:18;17529:1;29123:2;:18;:::i;:::-;29118:24;;:2;:24;:::i;:::-;29109:33;;:6;:33;:::i;:::-;29078:77;;-1:-1:-1;;;;;;29078:77:0;;;;;;;;;;23914:25:1;;;;23982:14;;23975:22;23955:18;;;23948:50;23887:18;;29078:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29508:404;29594:11;;;:31;;-1:-1:-1;;;;;;29609:16:0;;;29594:31;29590:44;;;29508:404;;;:::o;29590:44::-;29687:6;;29679:37;;-1:-1:-1;;;29679:37:0;;-1:-1:-1;;;;;8814:32:1;;;29679:37:0;;;8796:51:1;29660:16:0;;29687:6;;29679:27;;8769:18:1;;29679:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29660:56;;;-1:-1:-1;29757:17:0;17529:1;29757:2;:17;:::i;:::-;29740:12;29744:8;29740:2;:12;:::i;:::-;29730:23;;:6;:23;:::i;:::-;:45;;;;:::i;:::-;29721:54;-1:-1:-1;;;;;;29784:22:0;;29780:128;;29814:29;-1:-1:-1;;;;;29814:21:0;;29836:6;29814:21;:29::i;:::-;29780:128;;;29861:41;-1:-1:-1;;;;;29861:29:0;;29891:2;29895:6;29861:29;:41::i;:::-;29585:327;29508:404;;;:::o;29917:185::-;29999:7;30029:1;30021:5;:9;30013:28;;;;-1:-1:-1;;;30013:28:0;;21264:2:1;30013:28:0;;;21246:21:1;21303:1;21283:18;;;21276:29;-1:-1:-1;;;21321:18:1;;;21314:36;21367:18;;30013:28:0;21062:329:1;30013:28:0;30066:30;17629:1;;30066:30;:::i;:::-;30061:36;;:2;:36;:::i;:::-;30053:44;;:5;:44;:::i;30108:1147::-;30271:11;30291:18;30314:11;30336:6;30332:425;;;30363:13;30354:5;:22;30350:193;;30424:13;30399:21;30424:13;30399:5;:21;:::i;:::-;30391:30;;:4;:30;:::i;:::-;:46;;;;:::i;:::-;30385:52;;30332:425;;30350:193;30496:13;30471:21;30487:5;30496:13;30471:21;:::i;:::-;30463:30;;:4;:30;:::i;:::-;:46;;;;:::i;:::-;30457:52;;30532:4;30516:20;;30332:425;;;30572:13;30564:5;:21;30560:192;;;30633:13;30608:21;30633:13;30608:5;:21;:::i;30560:192::-;30732:13;30707:21;30723:5;30732:13;30707:21;:::i;:::-;30699:30;;:4;:30;:::i;:::-;:46;;;;:::i;:::-;30693:52;;30560:192;30819:22;:9;30831:10;30819:22;:::i;:::-;30800:15;:41;30796:339;;30851:17;17565;17529:1;17565:2;:17;:::i;:::-;30922:12;;30929:5;30922:12;:::i;:::-;:23;;30937:8;30922:23;:::i;:::-;30890:27;30908:9;30890:15;:27;:::i;:::-;30871:15;30878:8;30871:4;:15;:::i;:::-;:47;;;;:::i;:::-;:75;;;;:::i;:::-;30851:95;;30958:13;30954:174;;;30980:16;30987:9;30980:16;;:::i;:::-;;;30954:174;;;31019:9;31013:3;:15;31009:119;;;31043:15;31055:3;31043:9;:15;:::i;:::-;31037:21;;31081:4;31065:20;;31009:119;;;31105:16;31112:9;31105:16;;:::i;:::-;;;31009:119;30843:292;30796:339;31145:13;31141:90;;;31173:16;31185:3;-1:-1:-1;;31173:16:0;:::i;:::-;31166:23;;31141:90;;;31221:3;31207:18;;31141:90;31237:11;;30108:1147;;;;;;;;:::o;29165:338::-;29238:11;;;:37;;-1:-1:-1;;;;;;29253:22:0;;;29238:37;29234:50;;;29165:338;;:::o;29234:50::-;29337:6;;29329:37;;-1:-1:-1;;;29329:37:0;;-1:-1:-1;;;;;8814:32:1;;;29329:37:0;;;8796:51:1;29310:16:0;;29337:6;;29329:27;;8769:18:1;;29329:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29310:56;;;-1:-1:-1;29407:17:0;17529:1;29407:2;:17;:::i;:::-;29390:12;29394:8;29390:2;:12;:::i;:::-;29380:23;;:6;:23;:::i;:::-;:45;;;;:::i;:::-;29371:54;-1:-1:-1;29430:68:0;-1:-1:-1;;;;;29430:33:0;;29464:10;29484:4;29371:54;29430:33;:68::i;:::-;29229:274;29165:338;;:::o;25421:1147::-;25563:7;25572;25581:6;25596:11;25610:50;25626:4;25632:9;25643:8;25653:6;25610:15;:50::i;:::-;25696:18;25717:11;;;:6;:11;;;;;;;;25696:32;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25696:32:0;;;;;;;;;;;-1:-1:-1;;;25696:32:0;;;;;;;;;;;25827:14;;;:9;:14;;;;;;;25854:15;;25596:64;;-1:-1:-1;25696:32:0;;25827:14;;-1:-1:-1;;;25854:15:0;;;;25846:41;;;;-1:-1:-1;;;25846:41:0;;;;;;;:::i;:::-;25894:22;25919:19;;;:8;:19;;;;;;;;;25894:44;;;;;;;;;-1:-1:-1;;;;;25894:44:0;;;;;-1:-1:-1;;;25894:44:0;;;;;;;;;;;-1:-1:-1;;;25894:44:0;;;;;;;;;;;-1:-1:-1;;;25894:44:0;;;;;;;;25953:21;25968:5;25953:14;:21::i;:::-;26017:14;;26039:16;;;;25945:29;;-1:-1:-1;25981:10:0;;25994:82;;26002:6;;25945:29;;-1:-1:-1;;;;;;;;26017:14:0;;;;;26033:4;;25994:82;;;;-1:-1:-1;;;26057:18:0;;;;25994:7;:82::i;:::-;26175:28;;;;26148:15;;25981:95;;-1:-1:-1;26207:5:0;;26140:64;;-1:-1:-1;;;;;26167:37:0;;;;-1:-1:-1;;;26148:15:0;;;26140:64;:::i;:::-;:72;;;;:::i;:::-;26128:85;;-1:-1:-1;;26128:85:0;:::i;:::-;26121:3;:92;26117:320;;26247:15;;26227:37;;-1:-1:-1;;;26247:15:0;;-1:-1:-1;;;;;26247:15:0;-1:-1:-1;;26227:37:0;:::i;:::-;26279:15;;-1:-1:-1;;;;26326:19:0;;;;-1:-1:-1;;;;;26307:13:0;;;;-1:-1:-1;;;;26279:15:0;;;;;-1:-1:-1;26221:43:0;-1:-1:-1;26117:320:0;;;26363:33;;26389:6;;26363:33;;:15;;:33;;26389:6;;-1:-1:-1;;;26363:33:0;;-1:-1:-1;;;;;26363:33:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;26363:33:0;;;;;-1:-1:-1;;;;;26363:33:0;;;;;;26426:4;26402:8;:13;;;:29;;;;;;;;;;-1:-1:-1;;;;;26402:29:0;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;26402:29:0;;;;;-1:-1:-1;;;;;26402:29:0;;;;;;26117:320;26449:15;;-1:-1:-1;;;26449:15:0;;-1:-1:-1;;;;;26449:15:0;26445:59;;26484:14;;;;:9;:14;;;;;26477:21;26445:59;26517:11;;;;:6;:11;;;;;;26510:18;;-1:-1:-1;;;;;;26510:18:0;;;-1:-1:-1;26543:6:0;;26551:4;;-1:-1:-1;26517:11:0;;-1:-1:-1;25421:1147:0;-1:-1:-1;;;;;;;;25421:1147:0:o;4923:317::-;5038:6;5013:21;:31;;5005:73;;;;-1:-1:-1;;;5005:73:0;;17085:2:1;5005:73:0;;;17067:21:1;17124:2;17104:18;;;17097:30;17163:31;17143:18;;;17136:59;17212:18;;5005:73:0;16883:353:1;5005:73:0;5092:12;5110:9;-1:-1:-1;;;;;5110:14:0;5132:6;5110:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5091:52;;;5162:7;5154:78;;;;-1:-1:-1;;;5154:78:0;;16658:2:1;5154:78:0;;;16640:21:1;16697:2;16677:18;;;16670:30;16736:34;16716:18;;;16709:62;16807:28;16787:18;;;16780:56;16853:19;;5154:78:0;16456:422:1;11456:211:0;11600:58;;-1:-1:-1;;;;;12888:32:1;;11600:58:0;;;12870:51:1;12937:18;;;12930:34;;;11573:86:0;;11593:5;;-1:-1:-1;;;11623:23:0;12843:18:1;;11600:58:0;;;;-1:-1:-1;;11600:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;11600:58:0;-1:-1:-1;;;;;;11600:58:0;;;;;;;;;;11573:19;:86::i;11675:248::-;11846:68;;-1:-1:-1;;;;;9116:15:1;;;11846:68:0;;;9098:34:1;9168:15;;9148:18;;;9141:43;9200:18;;;9193:34;;;11819:96:0;;11839:5;;-1:-1:-1;;;11869:27:0;9033:18:1;;11846:68:0;8858:375:1;14029:716:0;14453:23;14479:69;14507:4;14479:69;;;;;;;;;;;;;;;;;14487:5;-1:-1:-1;;;;;14479:27:0;;;:69;;;;;:::i;:::-;14563:17;;14453:95;;-1:-1:-1;14563:21:0;14559:179;;14660:10;14649:30;;;;;;;;;;;;:::i;:::-;14641:85;;;;-1:-1:-1;;;14641:85:0;;21940:2:1;14641:85:0;;;21922:21:1;21979:2;21959:18;;;21952:30;22018:34;21998:18;;;21991:62;-1:-1:-1;;;22069:18:1;;;22062:40;22119:19;;14641:85:0;21738:406:1;6407:229:0;6544:12;6576:52;6598:6;6606:4;6612:1;6615:12;6576:21;:52::i;:::-;6569:59;;6407:229;;;;;;:::o;7527:510::-;7697:12;7755:5;7730:21;:30;;7722:81;;;;-1:-1:-1;;;7722:81:0;;17443:2:1;7722:81:0;;;17425:21:1;17482:2;17462:18;;;17455:30;17521:34;17501:18;;;17494:62;-1:-1:-1;;;17572:18:1;;;17565:36;17618:19;;7722:81:0;17241:402:1;7722:81:0;3924:20;;7814:60;;;;-1:-1:-1;;;7814:60:0;;20569:2:1;7814:60:0;;;20551:21:1;20608:2;20588:18;;;20581:30;20647:31;20627:18;;;20620:59;20696:18;;7814:60:0;20367:353:1;7814:60:0;7888:12;7902:23;7929:6;-1:-1:-1;;;;;7929:11:0;7948:5;7955:4;7929:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7887:73;;;;7978:51;7995:7;8004:10;8016:12;7978:16;:51::i;:::-;7971:58;7527:510;-1:-1:-1;;;;;;;7527:510:0:o;10213:712::-;10363:12;10392:7;10388:530;;;-1:-1:-1;10423:10:0;10416:17;;10388:530;10537:17;;:21;10533:374;;10735:10;10729:17;10796:15;10783:10;10779:2;10775:19;10768:44;10533:374;10878:12;10871:20;;-1:-1:-1;;;10871:20:0;;;;;;;;:::i;14:171:1:-;81:20;;-1:-1:-1;;;;;130:30:1;;120:41;;110:69;;175:1;172;165:12;110:69;14:171;;;:::o;190:247::-;249:6;302:2;290:9;281:7;277:23;273:32;270:52;;;318:1;315;308:12;270:52;357:9;344:23;376:31;401:5;376:31;:::i;442:251::-;512:6;565:2;553:9;544:7;540:23;536:32;533:52;;;581:1;578;571:12;533:52;613:9;607:16;632:31;657:5;632:31;:::i;698:592::-;781:6;789;797;805;858:3;846:9;837:7;833:23;829:33;826:53;;;875:1;872;865:12;826:53;914:9;901:23;933:31;958:5;933:31;:::i;:::-;983:5;-1:-1:-1;1040:2:1;1025:18;;1012:32;1053:33;1012:32;1053:33;:::i;:::-;1105:7;-1:-1:-1;1159:2:1;1144:18;;1131:32;;-1:-1:-1;1215:2:1;1200:18;;1187:32;1228:30;1187:32;1228:30;:::i;:::-;698:592;;;;-1:-1:-1;698:592:1;;-1:-1:-1;;698:592:1:o;1295:728::-;1384:6;1392;1400;1408;1416;1469:3;1457:9;1448:7;1444:23;1440:33;1437:53;;;1486:1;1483;1476:12;1437:53;1525:9;1512:23;1544:31;1569:5;1544:31;:::i;:::-;1594:5;-1:-1:-1;1646:2:1;1631:18;;1618:32;;-1:-1:-1;1702:2:1;1687:18;;1674:32;1715:33;1674:32;1715:33;:::i;:::-;1767:7;-1:-1:-1;1826:2:1;1811:18;;1798:32;1839:30;1798:32;1839:30;:::i;:::-;1888:7;-1:-1:-1;1947:3:1;1932:19;;1919:33;1961:30;1919:33;1961:30;:::i;:::-;2010:7;2000:17;;;1295:728;;;;;;;;:::o;2028:661::-;2120:6;2128;2136;2144;2152;2205:3;2193:9;2184:7;2180:23;2176:33;2173:53;;;2222:1;2219;2212:12;2173:53;2261:9;2248:23;2280:31;2305:5;2280:31;:::i;:::-;2330:5;-1:-1:-1;2382:2:1;2367:18;;2354:32;;-1:-1:-1;2438:2:1;2423:18;;2410:32;2451:33;2410:32;2451:33;:::i;:::-;2503:7;-1:-1:-1;2562:2:1;2547:18;;2534:32;2575:30;2534:32;2575:30;:::i;:::-;2028:661;;;;-1:-1:-1;2028:661:1;;2678:3;2663:19;2650:33;;2028:661;-1:-1:-1;;2028:661:1:o;2694:315::-;2762:6;2770;2823:2;2811:9;2802:7;2798:23;2794:32;2791:52;;;2839:1;2836;2829:12;2791:52;2878:9;2865:23;2897:31;2922:5;2897:31;:::i;:::-;2947:5;2999:2;2984:18;;;;2971:32;;-1:-1:-1;;;2694:315:1:o;3014:615::-;3100:6;3108;3161:2;3149:9;3140:7;3136:23;3132:32;3129:52;;;3177:1;3174;3167:12;3129:52;3217:9;3204:23;-1:-1:-1;;;;;3287:2:1;3279:6;3276:14;3273:34;;;3303:1;3300;3293:12;3273:34;3341:6;3330:9;3326:22;3316:32;;3386:7;3379:4;3375:2;3371:13;3367:27;3357:55;;3408:1;3405;3398:12;3357:55;3448:2;3435:16;3474:2;3466:6;3463:14;3460:34;;;3490:1;3487;3480:12;3460:34;3543:7;3538:2;3528:6;3525:1;3521:14;3517:2;3513:23;3509:32;3506:45;3503:65;;;3564:1;3561;3554:12;3503:65;3595:2;3587:11;;;;;3617:6;;-1:-1:-1;3014:615:1;;-1:-1:-1;;;;3014:615:1:o;3634:245::-;3701:6;3754:2;3742:9;3733:7;3729:23;3725:32;3722:52;;;3770:1;3767;3760:12;3722:52;3802:9;3796:16;3821:28;3843:5;3821:28;:::i;3884:180::-;3943:6;3996:2;3984:9;3975:7;3971:23;3967:32;3964:52;;;4012:1;4009;4002:12;3964:52;-1:-1:-1;4035:23:1;;3884:180;-1:-1:-1;3884:180:1:o;4069:450::-;4143:6;4151;4159;4212:2;4200:9;4191:7;4187:23;4183:32;4180:52;;;4228:1;4225;4218:12;4180:52;4264:9;4251:23;4241:33;;4324:2;4313:9;4309:18;4296:32;4337:31;4362:5;4337:31;:::i;:::-;4387:5;-1:-1:-1;4444:2:1;4429:18;;4416:32;4457:30;4416:32;4457:30;:::i;:::-;4506:7;4496:17;;;4069:450;;;;;:::o;4524:519::-;4607:6;4615;4623;4631;4684:3;4672:9;4663:7;4659:23;4655:33;4652:53;;;4701:1;4698;4691:12;4652:53;4737:9;4724:23;4714:33;;4797:2;4786:9;4782:18;4769:32;4810:31;4835:5;4810:31;:::i;:::-;4860:5;-1:-1:-1;4917:2:1;4902:18;;4889:32;4930:30;4889:32;4930:30;:::i;:::-;4524:519;;;;-1:-1:-1;4979:7:1;;5033:2;5018:18;5005:32;;-1:-1:-1;;4524:519:1:o;5048:588::-;5140:6;5148;5156;5164;5172;5225:3;5213:9;5204:7;5200:23;5196:33;5193:53;;;5242:1;5239;5232:12;5193:53;5278:9;5265:23;5255:33;;5338:2;5327:9;5323:18;5310:32;5351:31;5376:5;5351:31;:::i;:::-;5401:5;-1:-1:-1;5458:2:1;5443:18;;5430:32;5471:30;5430:32;5471:30;:::i;:::-;5048:588;;;;-1:-1:-1;5520:7:1;;5574:2;5559:18;;5546:32;;-1:-1:-1;5625:3:1;5610:19;5597:33;;5048:588;-1:-1:-1;;5048:588:1:o;5641:902::-;5733:6;5741;5785:9;5776:7;5772:23;5815:3;5811:2;5807:12;5804:32;;;5832:1;5829;5822:12;5804:32;5855:23;;;-1:-1:-1;5912:4:1;-1:-1:-1;;5894:16:1;;5890:27;5887:47;;;5930:1;5927;5920:12;5887:47;;5963:2;5957:9;6005:4;5997:6;5993:17;6076:6;6064:10;6061:22;-1:-1:-1;;;;;6028:10:1;6025:34;6022:62;6019:185;;;6126:10;6121:3;6117:20;6114:1;6107:31;6161:4;6158:1;6151:15;6189:4;6186:1;6179:15;6019:185;6220:2;6213:22;6259:37;6292:2;6277:18;;6259:37;:::i;:::-;6251:6;6244:53;6330:37;6363:2;6352:9;6348:18;6330:37;:::i;:::-;6325:2;6317:6;6313:15;6306:62;6401:37;6434:2;6423:9;6419:18;6401:37;:::i;:::-;6396:2;6388:6;6384:15;6377:62;6472:39;6505:4;6494:9;6490:20;6472:39;:::i;:::-;6467:2;6459:6;6455:15;6448:64;6531:6;6521:16;;;5641:902;;;;;:::o;6548:184::-;6618:6;6671:2;6659:9;6650:7;6646:23;6642:32;6639:52;;;6687:1;6684;6677:12;6639:52;-1:-1:-1;6710:16:1;;6548:184;-1:-1:-1;6548:184:1:o;6737:273::-;6805:6;6858:2;6846:9;6837:7;6833:23;6829:32;6826:52;;;6874:1;6871;6864:12;6826:52;6906:9;6900:16;6956:4;6949:5;6945:16;6938:5;6935:27;6925:55;;6976:1;6973;6966:12;8161:274;8290:3;8328:6;8322:13;8344:53;8390:6;8385:3;8378:4;8370:6;8366:17;8344:53;:::i;:::-;8413:16;;;;;8161:274;-1:-1:-1;;8161:274:1:o;12975:695::-;13190:2;13242:21;;;13312:13;;13215:18;;;13334:22;;;13161:4;;13190:2;13413:15;;;;13387:2;13372:18;;;13161:4;13456:188;13470:6;13467:1;13464:13;13456:188;;;13519:43;13558:3;13549:6;13543:13;7100:12;;7093:20;7086:28;7074:41;;7161:4;7150:16;;;7144:23;-1:-1:-1;;;;;7236:21:1;;;7220:14;;;7213:45;;;;7311:4;7300:16;;;7294:23;7290:32;7274:14;;7267:56;7015:314;13519:43;13619:15;;;;13591:4;13582:14;;;;;13492:1;13485:9;13456:188;;;-1:-1:-1;13661:3:1;;12975:695;-1:-1:-1;;;;;;12975:695:1:o;13675:704::-;13896:2;13948:21;;;14018:13;;13921:18;;;14040:22;;;13867:4;;13896:2;14119:15;;;;14093:2;14078:18;;;13867:4;14162:191;14176:6;14173:1;14170:13;14162:191;;;14225:46;14267:3;14258:6;14252:13;7449:12;;-1:-1:-1;;;;;7445:21:1;;;7433:34;;7520:4;7509:16;;;7503:23;7499:32;;7483:14;;;7476:56;7585:4;7574:16;;;7568:23;7564:32;;7548:14;;;7541:56;7650:4;7639:16;;;7633:23;7629:32;7613:14;;7606:56;7334:334;14225:46;14328:15;;;;14300:4;14291:14;;;;;14198:1;14191:9;14162:191;;14384:383;14533:2;14522:9;14515:21;14496:4;14565:6;14559:13;14608:6;14603:2;14592:9;14588:18;14581:34;14624:66;14683:6;14678:2;14667:9;14663:18;14658:2;14650:6;14646:15;14624:66;:::i;:::-;14751:2;14730:15;-1:-1:-1;;14726:29:1;14711:45;;;;14758:2;14707:54;;14384:383;-1:-1:-1;;14384:383:1:o;20725:332::-;20927:2;20909:21;;;20966:1;20946:18;;;20939:29;-1:-1:-1;;;20999:2:1;20984:18;;20977:39;21048:2;21033:18;;20725:332::o;22149:329::-;22351:2;22333:21;;;22390:1;22370:18;;;22363:29;-1:-1:-1;;;22423:2:1;22408:18;;22401:36;22469:2;22454:18;;22149:329::o;22817:238::-;22995:2;22980:18;;23007:42;22984:9;23031:6;7100:12;;7093:20;7086:28;7074:41;;7161:4;7150:16;;;7144:23;-1:-1:-1;;;;;7236:21:1;;;7220:14;;;7213:45;;;;7311:4;7300:16;;;7294:23;7290:32;7274:14;;7267:56;7015:314;23060:248;23244:3;23229:19;;23257:45;23233:9;23284:6;7449:12;;-1:-1:-1;;;;;7445:21:1;;;7433:34;;7520:4;7509:16;;;7503:23;7499:32;;7483:14;;;7476:56;7585:4;7574:16;;;7568:23;7564:32;;7548:14;;;7541:56;7650:4;7639:16;;;7633:23;7629:32;7613:14;;7606:56;7334:334;24009:128;24049:3;24080:1;24076:6;24073:1;24070:13;24067:39;;;24086:18;;:::i;:::-;-1:-1:-1;24122:9:1;;24009:128::o;24142:236::-;24181:3;-1:-1:-1;;;;;24254:2:1;24251:1;24247:10;24284:2;24281:1;24277:10;24315:3;24311:2;24307:12;24302:3;24299:21;24296:47;;;24323:18;;:::i;:::-;24359:13;;24142:236;-1:-1:-1;;;;24142:236:1:o;24383:120::-;24423:1;24449;24439:35;;24454:18;;:::i;:::-;-1:-1:-1;24488:9:1;;24383:120::o;24508:199::-;24547:1;-1:-1:-1;;;;;24618:2:1;24615:1;24611:10;24640:3;24630:37;;24647:18;;:::i;:::-;24685:10;;24681:20;;;;;24508:199;-1:-1:-1;;24508:199:1:o;24712:422::-;24801:1;24844:5;24801:1;24858:270;24879:7;24869:8;24866:21;24858:270;;;24938:4;24934:1;24930:6;24926:17;24920:4;24917:27;24914:53;;;24947:18;;:::i;:::-;24997:7;24987:8;24983:22;24980:55;;;25017:16;;;;24980:55;25096:22;;;;25056:15;;;;24858:270;;;24862:3;24712:422;;;;;:::o;25139:131::-;25199:5;25228:36;25255:8;25249:4;25324:5;25354:8;25344:80;;-1:-1:-1;25395:1:1;25409:5;;25344:80;25443:4;25433:76;;-1:-1:-1;25480:1:1;25494:5;;25433:76;25525:4;25543:1;25538:59;;;;25611:1;25606:130;;;;25518:218;;25538:59;25568:1;25559:10;;25582:5;;;25606:130;25643:3;25633:8;25630:17;25627:43;;;25650:18;;:::i;:::-;-1:-1:-1;;25706:1:1;25692:16;;25721:5;;25518:218;;25820:2;25810:8;25807:16;25801:3;25795:4;25792:13;25788:36;25782:2;25772:8;25769:16;25764:2;25758:4;25755:12;25751:35;25748:77;25745:159;;;-1:-1:-1;25857:19:1;;;25889:5;;25745:159;25936:34;25961:8;25955:4;25936:34;:::i;:::-;26006:6;26002:1;25998:6;25994:19;25985:7;25982:32;25979:58;;;26017:18;;:::i;:::-;26055:20;;25275:806;-1:-1:-1;;;25275:806:1:o;26086:553::-;26125:7;-1:-1:-1;;;;;26195:9:1;;;26223;;;26248:11;;;26267:10;;;26261:17;;26244:35;26241:61;;;26282:18;;:::i;:::-;-1:-1:-1;;;26358:1:1;26351:9;;26376:11;;;26396;;;26389:19;;26372:37;26369:63;;;26412:18;;:::i;:::-;26458:1;26455;26451:9;26441:19;;26505:1;26501:2;26496:11;26493:1;26489:19;26484:2;26480;26476:11;26472:37;26469:63;;;26512:18;;:::i;:::-;26577:1;26573:2;26568:11;26565:1;26561:19;26556:2;26552;26548:11;26544:37;26541:63;;;26584:18;;:::i;:::-;-1:-1:-1;;;26624:9:1;;;;;26086:553;-1:-1:-1;;;26086:553:1:o;26644:168::-;26684:7;26750:1;26746;26742:6;26738:14;26735:1;26732:21;26727:1;26720:9;26713:17;26709:45;26706:71;;;26757:18;;:::i;:::-;-1:-1:-1;26797:9:1;;26644:168::o;26817:270::-;26856:7;-1:-1:-1;;;;;26933:2:1;26930:1;26926:10;26963:2;26960:1;26956:10;27019:3;27015:2;27011:12;27006:3;27003:21;26996:3;26989:11;26982:19;26978:47;26975:73;;;27028:18;;:::i;:::-;27068:13;;26817:270;-1:-1:-1;;;;26817:270:1:o;27092:125::-;27132:4;27160:1;27157;27154:8;27151:34;;;27165:18;;:::i;:::-;-1:-1:-1;27202:9:1;;27092:125::o;27222:229::-;27261:4;-1:-1:-1;;;;;27358:10:1;;;;27328;;27380:12;;;27377:38;;;27395:18;;:::i;:::-;27432:13;;27222:229;-1:-1:-1;;;27222:229:1:o;27456:258::-;27528:1;27538:113;27552:6;27549:1;27546:13;27538:113;;;27628:11;;;27622:18;27609:11;;;27602:39;27574:2;27567:10;27538:113;;;27669:6;27666:1;27663:13;27660:48;;;-1:-1:-1;;27704:1:1;27686:16;;27679:27;27456:258::o;27719:135::-;27758:3;-1:-1:-1;;27779:17:1;;27776:43;;;27799:18;;:::i;:::-;-1:-1:-1;27846:1:1;27835:13;;27719:135::o;27859:127::-;27920:10;27915:3;27911:20;27908:1;27901:31;27951:4;27948:1;27941:15;27975:4;27972:1;27965:15;27991:127;28052:10;28047:3;28043:20;28040:1;28033:31;28083:4;28080:1;28073:15;28107:4;28104:1;28097:15;28123:127;28184:10;28179:3;28175:20;28172:1;28165:31;28215:4;28212:1;28205:15;28239:4;28236:1;28229:15;28255:127;28316:10;28311:3;28307:20;28304:1;28297:31;28347:4;28344:1;28337:15;28371:4;28368:1;28361:15;28387:131;-1:-1:-1;;;;;28462:31:1;;28452:42;;28442:70;;28508:1;28505;28498:12;28442:70;28387:131;:::o;28523:118::-;28609:5;28602:13;28595:21;28588:5;28585:32;28575:60;;28631:1;28628;28621:12
Swarm Source
ipfs://34e563bce6070ea97f58e26ad70dfc74f33012417b36d9f03b57a30d551f2884
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.