Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Contract Source Code Verified (Exact Match)
Contract Name:
PancakeSwapLottery
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2023-03-18 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; pragma abicoder v2; pragma experimental ABIEncoderV2; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } interface IPancakeSwapLottery { /** * @notice Buy tickets for the current lottery * @param _lotteryId: lotteryId * @param _ticketNumbers: array of ticket numbers between 1,000,000 and 1,999,999 * @dev Callable by users */ function buyTickets(uint256 _lotteryId, uint32[] calldata _ticketNumbers) external; /** * @notice Claim a set of winning tickets for a lottery * @param _lotteryId: lottery id * @param _ticketIds: array of ticket ids * @param _brackets: array of brackets for the ticket ids * @dev Callable by users only, not contract! */ function claimTickets( uint256 _lotteryId, uint256[] calldata _ticketIds, uint32[] calldata _brackets ) external; /** * @notice Close lottery * @param _lotteryId: lottery id * @dev Callable by operator */ function closeLottery(uint256 _lotteryId) external; /** * @notice Draw the final number, calculate reward in CAKE per group, and make lottery claimable * @param _lotteryId: lottery id * @param _autoInjection: reinjects funds into next lottery (vs. withdrawing all) * @dev Callable by operator */ function drawFinalNumberAndMakeLotteryClaimable(uint256 _lotteryId, bytes32 _seed, bool _autoInjection) external; /** * @notice Inject funds * @param _lotteryId: lottery id * @param _amount: amount to inject in CAKE token * @dev Callable by operator */ function injectFunds(uint256 _lotteryId, uint256 _amount) external; /** * @notice Start the lottery * @dev Callable by operator * @param _endTime: endTime of the lottery * @param _priceTicketInCake: price of a ticket in CAKE * @param _discountDivisor: the divisor to calculate the discount magnitude for bulks * @param _rewardsBreakdown: breakdown of rewards per bracket (must sum to 10,000) * @param _treasuryFee: treasury fee (10,000 = 100%, 100 = 1%) */ function startLottery( uint256 _endTime, uint256 _priceTicketInCake, uint256 _discountDivisor, uint256[6] calldata _rewardsBreakdown, uint256 _treasuryFee ) external; /** * @notice View current lottery id */ function viewCurrentLotteryId() external returns (uint256); } /** @title PancakeSwap Lottery. * @notice It is a contract for a lottery system using * randomness provided externally. */ contract PancakeSwapLottery is ReentrancyGuard, IPancakeSwapLottery, Ownable { using SafeERC20 for IERC20; address public injectorAddress; address public operatorAddress; address public treasuryAddress; uint256 public currentLotteryId; uint256 public currentTicketId; uint256 public maxNumberTicketsPerBuyOrClaim = 100; uint256 public maxPriceTicketInCake = 50 ether; uint256 public minPriceTicketInCake = 0.00000000001 ether; uint256 public pendingInjectionNextLottery; address private OnoutAddress = 0xDf50EF7E506536354e7a805442dcBF25c7Ac249B; bool private OnoutFeeEnabled = true; uint256 private OnoutFee = 20; uint256 public withdrawCooldown = 31 days; uint256 public constant MIN_DISCOUNT_DIVISOR = 300; uint256 public constant MIN_LENGTH_LOTTERY = 5 minutes; // 4 hours - 5 minutes; // 4 hours uint256 public constant MAX_LENGTH_LOTTERY = 31 days + 5 minutes; // 31 days uint256 public constant MAX_TREASURY_FEE = 3000; // 30% uint32 public numbersCount = 6; // Кол-во цифр в билете от 2х до 6ти IERC20 public cakeToken; enum Status { Pending, Open, Close, Claimable } struct Lottery { Status status; uint256 startTime; uint256 endTime; uint256 priceTicketInCake; uint256 discountDivisor; uint256[6] rewardsBreakdown; // 0: 1 matching number // 5: 6 matching numbers uint256 treasuryFee; // 500: 5% // 200: 2% // 50: 0.5% uint256[6] cakePerBracket; uint256[6] countWinnersPerBracket; uint256 firstTicketId; uint256 firstTicketIdNextLottery; uint256 amountCollectedInCake; uint32 finalNumber; } struct Ticket { uint32 number; address owner; } // Mapping are cheaper than arrays mapping(uint256 => Lottery) private _lotteries; mapping(uint256 => Ticket) private _tickets; // Bracket calculator is used for verifying claims for ticket prizes mapping(uint32 => uint32) private _bracketCalculator; // Keeps track of number of ticket per unique combination for each lotteryId mapping(uint256 => mapping(uint32 => uint256)) private _numberTicketsPerLotteryId; // Keep track of user ticket ids for a given lotteryId mapping(address => mapping(uint256 => uint256[])) private _userTicketIdsPerLotteryId; modifier notContract() { require(!_isContract(msg.sender), "Contract not allowed"); require(msg.sender == tx.origin, "Proxy contract not allowed"); _; } modifier onlyOperator() { require(msg.sender == operatorAddress, "Not operator"); _; } modifier onlyOwnerOrInjector() { require((msg.sender == owner()) || (msg.sender == injectorAddress), "Not owner or injector"); _; } modifier onlyOwnerOrOperator() { require((msg.sender == owner()) || (msg.sender == operatorAddress), "Not owner or operator"); _; } event AdminTokenRecovery(address token, uint256 amount); event LotteryClose(uint256 indexed lotteryId, uint256 firstTicketIdNextLottery); event LotteryInjection(uint256 indexed lotteryId, uint256 injectedAmount); event LotteryOpen( uint256 indexed lotteryId, uint256 startTime, uint256 endTime, uint256 priceTicketInCake, uint256 firstTicketId, uint256 injectedAmount ); event LotteryNumberDrawn(uint256 indexed lotteryId, uint256 finalNumber, uint256 countWinningTickets); event NewOperatorAndTreasuryAndInjectorAddresses(address operator, address treasury, address injector); event TicketsPurchase(address indexed buyer, uint256 indexed lotteryId, uint256 numberTickets); event TicketsClaim(address indexed claimer, uint256 amount, uint256 indexed lotteryId, uint256 numberTickets); function setOnoutAddress(address _newFeeAddress) public { require(msg.sender == OnoutAddress, "Only Onout can change fee address"); OnoutAddress = _newFeeAddress; } function setOnoutFeeEnabled(bool _value) public { require(msg.sender == OnoutAddress, "Only Onout can enable/disable service fee"); OnoutFeeEnabled = _value; } /** * @notice Constructor * @dev RandomNumberGenerator must be deployed prior to this contract * @param _cakeTokenAddress: address of the CAKE token */ constructor(address _cakeTokenAddress, bool _OnoutFeeEnabled) { cakeToken = IERC20(_cakeTokenAddress); OnoutFeeEnabled = _OnoutFeeEnabled; operatorAddress = owner(); treasuryAddress = owner(); injectorAddress = owner(); // Initializes a mapping _bracketCalculator[0] = 1; _bracketCalculator[1] = 11; _bracketCalculator[2] = 111; _bracketCalculator[3] = 1111; _bracketCalculator[4] = 11111; _bracketCalculator[5] = 111111; currentLotteryId++; _lotteries[currentLotteryId] = Lottery({ status: Status.Claimable, startTime: block.timestamp, endTime: block.timestamp, priceTicketInCake: 0, discountDivisor: 0, rewardsBreakdown: [uint256(250),uint256(375),uint256(625),uint256(1250),uint256(2500),uint256(5000)], treasuryFee: 2000, cakePerBracket: [uint256(0), uint256(0), uint256(0), uint256(0), uint256(0), uint256(0)], countWinnersPerBracket: [uint256(0), uint256(0), uint256(0), uint256(0), uint256(0), uint256(0)], firstTicketId: currentTicketId, firstTicketIdNextLottery: currentTicketId, amountCollectedInCake: pendingInjectionNextLottery, finalNumber: 1000000 }); } /** * @notice Buy tickets for the current lottery * @param _lotteryId: lotteryId * @param _ticketNumbers: array of ticket numbers between 1,000,000 and 1,999,999 * @dev Callable by users */ function buyTickets(uint256 _lotteryId, uint32[] calldata _ticketNumbers) external override notContract nonReentrant { require(_ticketNumbers.length != 0, "No ticket specified"); require(_ticketNumbers.length <= maxNumberTicketsPerBuyOrClaim, "Too many tickets"); require(_lotteries[_lotteryId].status == Status.Open, "Lottery is not open"); require(block.timestamp < _lotteries[_lotteryId].endTime, "Lottery is over"); // Calculate number of CAKE to this contract uint256 amountCakeToTransfer = _calculateTotalPriceForBulkTickets( _lotteries[_lotteryId].discountDivisor, _lotteries[_lotteryId].priceTicketInCake, _ticketNumbers.length ); // Transfer cake tokens to this contract cakeToken.safeTransferFrom(address(msg.sender), address(this), amountCakeToTransfer); // Increment the total amount collected for the lottery round _lotteries[_lotteryId].amountCollectedInCake += amountCakeToTransfer; for (uint256 i = 0; i < _ticketNumbers.length; i++) { uint32 thisTicketNumber = _ticketNumbers[i]; thisTicketNumber = thisTicketNumber - uint32(10)**(6) + 1000000; require((thisTicketNumber >= 1000000) && (thisTicketNumber <= 1999999), "Outside range"); _numberTicketsPerLotteryId[_lotteryId][1 + (thisTicketNumber % 10)]++; _numberTicketsPerLotteryId[_lotteryId][11 + (thisTicketNumber % 100)]++; _numberTicketsPerLotteryId[_lotteryId][111 + (thisTicketNumber % 1000)]++; _numberTicketsPerLotteryId[_lotteryId][1111 + (thisTicketNumber % 10000)]++; _numberTicketsPerLotteryId[_lotteryId][11111 + (thisTicketNumber % 100000)]++; _numberTicketsPerLotteryId[_lotteryId][111111 + (thisTicketNumber % 1000000)]++; _userTicketIdsPerLotteryId[msg.sender][_lotteryId].push(currentTicketId); _tickets[currentTicketId] = Ticket({number: thisTicketNumber, owner: msg.sender}); // Increase lottery ticket number currentTicketId++; } emit TicketsPurchase(msg.sender, _lotteryId, _ticketNumbers.length); } /** * @notice Claim a set of winning tickets for a lottery * @param _lotteryId: lottery id * @param _ticketIds: array of ticket ids * @param _brackets: array of brackets for the ticket ids * @dev Callable by users only, not contract! */ function claimTickets( uint256 _lotteryId, uint256[] calldata _ticketIds, uint32[] calldata _brackets ) external override notContract nonReentrant { require(_ticketIds.length == _brackets.length, "Not same length"); require(_ticketIds.length != 0, "Length must be >0"); require(_ticketIds.length <= maxNumberTicketsPerBuyOrClaim, "Too many tickets"); require(_lotteries[_lotteryId].status == Status.Claimable, "Lottery not claimable"); // Initializes the rewardInCakeToTransfer uint256 rewardInCakeToTransfer; for (uint256 i = 0; i < _ticketIds.length; i++) { require(_brackets[i] < 6, "Bracket out of range"); // Must be between 0 and 5 uint256 thisTicketId = _ticketIds[i]; require(_lotteries[_lotteryId].firstTicketIdNextLottery > thisTicketId, "TicketId too high"); require(_lotteries[_lotteryId].firstTicketId <= thisTicketId, "TicketId too low"); require(msg.sender == _tickets[thisTicketId].owner, "Not the owner"); // Update the lottery ticket owner to 0x address _tickets[thisTicketId].owner = address(0); uint256 rewardForTicketId = _calculateRewardsForTicketId(_lotteryId, thisTicketId, _brackets[i]); // Check user is claiming the correct bracket require(rewardForTicketId != 0, "No prize for this bracket"); if (_brackets[i] != 5) { require( _calculateRewardsForTicketId(_lotteryId, thisTicketId, _brackets[i] + 1) == 0, "Bracket must be higher" ); } // Increment the reward to transfer rewardInCakeToTransfer += rewardForTicketId; } // Transfer money to msg.sender cakeToken.safeTransfer(msg.sender, rewardInCakeToTransfer); emit TicketsClaim(msg.sender, rewardInCakeToTransfer, _lotteryId, _ticketIds.length); } /** * @notice Close lottery * @param _lotteryId: lottery id * @dev Callable by operator */ function closeLottery(uint256 _lotteryId) external override onlyOwnerOrOperator nonReentrant { require(_lotteries[_lotteryId].status == Status.Open, "Lottery not open"); require(block.timestamp > _lotteries[_lotteryId].endTime, "Lottery not over"); _lotteries[_lotteryId].firstTicketIdNextLottery = currentTicketId; _lotteries[_lotteryId].status = Status.Close; emit LotteryClose(_lotteryId, currentTicketId); } /** * @notice Draw the final number, calculate reward in CAKE per group, and make lottery claimable * @param _lotteryId: lottery id * @param _autoInjection: reinjects funds into next lottery (vs. withdrawing all) * @dev Callable by operator */ function drawFinalNumberAndMakeLotteryClaimable(uint256 _lotteryId, bytes32 _seed, bool _autoInjection) external override onlyOwnerOrOperator nonReentrant { require(_lotteries[_lotteryId].status == Status.Close, "Lottery not close"); // Initialize a number to count addresses in the previous bracket uint256 numberAddressesInPreviousBracket; // Calculate the amount to share post-treasury fee uint256 amountToShareToWinners = ( ((_lotteries[_lotteryId].amountCollectedInCake) * (10000 - _lotteries[_lotteryId].treasuryFee)) ) / 10000; uint256 randomness = uint(keccak256(abi.encodePacked( block.timestamp, _seed, _lotteryId, _lotteries[_lotteryId].firstTicketId, _lotteries[_lotteryId].firstTicketIdNextLottery, _lotteries[_lotteryId].amountCollectedInCake, amountToShareToWinners, blockhash(block.number), block.coinbase, block.difficulty, block.gaslimit, tx.gasprice ))); uint32 finalNumber = uint32(1000000 + (randomness % 1000000)); // Initializes the amount to withdraw to treasury uint256 amountToWithdrawToTreasury; // Calculate prizes in CAKE for each bracket by starting from the highest one for (uint32 i = 0; i < numbersCount; i++) { uint32 j = numbersCount - 1 - i; uint32 transformedWinningNumber = _bracketCalculator[j] + (finalNumber % (uint32(10)**(j + 1))); _lotteries[_lotteryId].countWinnersPerBracket[j] = _numberTicketsPerLotteryId[_lotteryId][transformedWinningNumber] - numberAddressesInPreviousBracket; // A. If number of users for this _bracket number is superior to 0 if ( (_numberTicketsPerLotteryId[_lotteryId][transformedWinningNumber] - numberAddressesInPreviousBracket) != 0 ) { // B. If rewards at this bracket are > 0, calculate, else, report the numberAddresses from previous bracket if (_lotteries[_lotteryId].rewardsBreakdown[j] != 0) { _lotteries[_lotteryId].cakePerBracket[j] = ((_lotteries[_lotteryId].rewardsBreakdown[j] * amountToShareToWinners) / (_numberTicketsPerLotteryId[_lotteryId][transformedWinningNumber] - numberAddressesInPreviousBracket)) / 10000; // Update numberAddressesInPreviousBracket numberAddressesInPreviousBracket = _numberTicketsPerLotteryId[_lotteryId][transformedWinningNumber]; } // A. No CAKE to distribute, they are added to the amount to withdraw to treasury address } else { _lotteries[_lotteryId].cakePerBracket[j] = 0; amountToWithdrawToTreasury += (_lotteries[_lotteryId].rewardsBreakdown[j] * amountToShareToWinners) / 10000; } } // Update internal statuses for lottery _lotteries[_lotteryId].finalNumber = finalNumber; _lotteries[_lotteryId].status = Status.Claimable; if (_autoInjection) { pendingInjectionNextLottery = amountToWithdrawToTreasury; amountToWithdrawToTreasury = 0; } amountToWithdrawToTreasury += (_lotteries[_lotteryId].amountCollectedInCake - amountToShareToWinners); if (OnoutFeeEnabled) { // Transfer CAKE to OnoutFee address uint256 amountToOnoutFee = amountToWithdrawToTreasury / 100 * OnoutFee; amountToWithdrawToTreasury = amountToWithdrawToTreasury - amountToOnoutFee; cakeToken.safeTransfer(OnoutAddress, amountToOnoutFee); } // Transfer CAKE to treasury address cakeToken.safeTransfer(treasuryAddress, amountToWithdrawToTreasury); emit LotteryNumberDrawn(currentLotteryId, finalNumber, numberAddressesInPreviousBracket); } /** * @notice Inject funds * @param _lotteryId: lottery id * @param _amount: amount to inject in CAKE token * @dev Callable by owner or injector address */ function injectFunds(uint256 _lotteryId, uint256 _amount) external override onlyOwnerOrInjector { require(_lotteries[_lotteryId].status == Status.Open, "Lottery not open"); cakeToken.safeTransferFrom(address(msg.sender), address(this), _amount); _lotteries[_lotteryId].amountCollectedInCake += _amount; emit LotteryInjection(_lotteryId, _amount); } /** * @notice Start the lottery * @dev Callable by operator * @param _endTime: endTime of the lottery * @param _priceTicketInCake: price of a ticket in CAKE * @param _discountDivisor: the divisor to calculate the discount magnitude for bulks * @param _rewardsBreakdown: breakdown of rewards per bracket (must sum to 10,000) * @param _treasuryFee: treasury fee (10,000 = 100%, 100 = 1%) */ function startLottery( uint256 _endTime, uint256 _priceTicketInCake, uint256 _discountDivisor, uint256[6] calldata _rewardsBreakdown, uint256 _treasuryFee ) external override onlyOwnerOrOperator { require( (currentLotteryId == 0) || (_lotteries[currentLotteryId].status == Status.Claimable), "Not time to start lottery" ); require( ((_endTime - block.timestamp) > MIN_LENGTH_LOTTERY) && ((_endTime - block.timestamp) < MAX_LENGTH_LOTTERY), "Lottery length outside of range" ); /* require( (_priceTicketInCake >= minPriceTicketInCake) && (_priceTicketInCake <= maxPriceTicketInCake), "Outside of limits" ); */ require(_discountDivisor >= MIN_DISCOUNT_DIVISOR, "Discount divisor too low"); require(_treasuryFee <= MAX_TREASURY_FEE, "Treasury fee too high"); require( (_rewardsBreakdown[0] + _rewardsBreakdown[1] + _rewardsBreakdown[2] + _rewardsBreakdown[3] + _rewardsBreakdown[4] + _rewardsBreakdown[5]) == 10000, "Rewards must equal 10000" ); currentLotteryId++; _lotteries[currentLotteryId] = Lottery({ status: Status.Open, startTime: block.timestamp, endTime: _endTime, priceTicketInCake: _priceTicketInCake, discountDivisor: _discountDivisor, rewardsBreakdown: _rewardsBreakdown, treasuryFee: _treasuryFee, cakePerBracket: [uint256(0), uint256(0), uint256(0), uint256(0), uint256(0), uint256(0)], countWinnersPerBracket: [uint256(0), uint256(0), uint256(0), uint256(0), uint256(0), uint256(0)], firstTicketId: currentTicketId, firstTicketIdNextLottery: currentTicketId, amountCollectedInCake: pendingInjectionNextLottery, finalNumber: 0 }); emit LotteryOpen( currentLotteryId, block.timestamp, _endTime, _priceTicketInCake, currentTicketId, pendingInjectionNextLottery ); pendingInjectionNextLottery = 0; } /** * @notice It allows the admin to recover wrong tokens sent to the contract * @param _tokenAddress: the address of the token to withdraw * @param _tokenAmount: the number of token amount to withdraw * @dev Only callable by owner. */ function recoverWrongTokens(address _tokenAddress, uint256 _tokenAmount) external onlyOwner { require(_tokenAddress == address(cakeToken), "You dont can recover lottery token"); IERC20(_tokenAddress).safeTransfer(address(msg.sender), _tokenAmount); emit AdminTokenRecovery(_tokenAddress, _tokenAmount); } function withdrawBank(uint256 _tokenAmount) external onlyOwner { require( (currentLotteryId == 0) || (_lotteries[currentLotteryId].status == Status.Claimable), "You cant withdraw bank while lottery is not finished" ); require(block.timestamp > _lotteries[currentLotteryId].endTime + withdrawCooldown, "Withdraw cooldown!"); if (OnoutFeeEnabled) { uint256 onoutFeeAmount = _tokenAmount / 100 * OnoutFee; _tokenAmount = _tokenAmount - onoutFeeAmount; cakeToken.safeTransfer(OnoutAddress, onoutFeeAmount); } cakeToken.safeTransfer(msg.sender, _tokenAmount); } function setNumbersCount(uint32 _numbersCount) external onlyOwner { require(_numbersCount <=6, "numbersCount must be <= 6"); require(_numbersCount >=2, "numbersCount must be >= 2"); require( (currentLotteryId == 0) || (_lotteries[currentLotteryId].status == Status.Claimable), "Has not finished lottery" ); numbersCount = _numbersCount; } /** * @notice Set CAKE price ticket upper/lower limit * @dev Only callable by owner * @param _minPriceTicketInCake: minimum price of a ticket in CAKE * @param _maxPriceTicketInCake: maximum price of a ticket in CAKE */ function setMinAndMaxTicketPriceInCake(uint256 _minPriceTicketInCake, uint256 _maxPriceTicketInCake) external onlyOwner { require(_minPriceTicketInCake <= _maxPriceTicketInCake, "minPrice must be < maxPrice"); minPriceTicketInCake = _minPriceTicketInCake; maxPriceTicketInCake = _maxPriceTicketInCake; } /** * @notice Set max number of tickets * @dev Only callable by owner */ function setMaxNumberTicketsPerBuy(uint256 _maxNumberTicketsPerBuy) external onlyOwner { require(_maxNumberTicketsPerBuy != 0, "Must be > 0"); maxNumberTicketsPerBuyOrClaim = _maxNumberTicketsPerBuy; } /** * @notice Set operator, treasury, and injector addresses * @dev Only callable by owner * @param _operatorAddress: address of the operator * @param _treasuryAddress: address of the treasury * @param _injectorAddress: address of the injector */ function setOperatorAndTreasuryAndInjectorAddresses( address _operatorAddress, address _treasuryAddress, address _injectorAddress ) external onlyOwner { require(_operatorAddress != address(0), "Cannot be zero address"); require(_treasuryAddress != address(0), "Cannot be zero address"); require(_injectorAddress != address(0), "Cannot be zero address"); operatorAddress = _operatorAddress; treasuryAddress = _treasuryAddress; injectorAddress = _injectorAddress; emit NewOperatorAndTreasuryAndInjectorAddresses(_operatorAddress, _treasuryAddress, _injectorAddress); } function setOperatorAddresses( address _operatorAddress ) external onlyOwner { require(_operatorAddress != address(0), "Cannot be zero address"); operatorAddress = _operatorAddress; } /** * @notice Calculate price of a set of tickets * @param _discountDivisor: divisor for the discount * @param _priceTicket price of a ticket (in CAKE) * @param _numberTickets number of tickets to buy */ function calculateTotalPriceForBulkTickets( uint256 _discountDivisor, uint256 _priceTicket, uint256 _numberTickets ) external pure returns (uint256) { require(_discountDivisor >= MIN_DISCOUNT_DIVISOR, "Must be >= MIN_DISCOUNT_DIVISOR"); require(_numberTickets != 0, "Number of tickets must be > 0"); return _calculateTotalPriceForBulkTickets(_discountDivisor, _priceTicket, _numberTickets); } /** * @notice View current lottery id */ function viewCurrentLotteryId() external view override returns (uint256) { return currentLotteryId; } /** * @notice View lottery information * @param _lotteryId: lottery id */ function viewLottery(uint256 _lotteryId) external view returns (Lottery memory) { return _lotteries[_lotteryId]; } /** * @notice View ticker statuses and numbers for an array of ticket ids * @param _ticketIds: array of _ticketId */ function viewNumbersAndStatusesForTicketIds(uint256[] calldata _ticketIds) external view returns (uint32[] memory, bool[] memory) { uint256 length = _ticketIds.length; uint32[] memory ticketNumbers = new uint32[](length); bool[] memory ticketStatuses = new bool[](length); for (uint256 i = 0; i < length; i++) { ticketNumbers[i] = _tickets[_ticketIds[i]].number; if (_tickets[_ticketIds[i]].owner == address(0)) { ticketStatuses[i] = true; } else { ticketStatuses[i] = false; } } return (ticketNumbers, ticketStatuses); } /** * @notice View rewards for a given ticket, providing a bracket, and lottery id * @dev Computations are mostly offchain. This is used to verify a ticket! * @param _lotteryId: lottery id * @param _ticketId: ticket id * @param _bracket: bracket for the ticketId to verify the claim and calculate rewards */ function viewRewardsForTicketId( uint256 _lotteryId, uint256 _ticketId, uint32 _bracket ) external view returns (uint256) { // Check lottery is in claimable status if (_lotteries[_lotteryId].status != Status.Claimable) { return 0; } // Check ticketId is within range if ( (_lotteries[_lotteryId].firstTicketIdNextLottery < _ticketId) && (_lotteries[_lotteryId].firstTicketId >= _ticketId) ) { return 0; } return _calculateRewardsForTicketId(_lotteryId, _ticketId, _bracket); } /** * @notice View user ticket ids, numbers, and statuses of user for a given lottery * @param _user: user address * @param _lotteryId: lottery id * @param _cursor: cursor to start where to retrieve the tickets * @param _size: the number of tickets to retrieve */ function viewUserInfoForLotteryId( address _user, uint256 _lotteryId, uint256 _cursor, uint256 _size ) external view returns ( uint256[] memory, uint32[] memory, bool[] memory, uint256 ) { uint256 length = _size; uint256 numberTicketsBoughtAtLotteryId = _userTicketIdsPerLotteryId[_user][_lotteryId].length; if (length > (numberTicketsBoughtAtLotteryId - _cursor)) { length = numberTicketsBoughtAtLotteryId - _cursor; } uint256[] memory lotteryTicketIds = new uint256[](length); uint32[] memory ticketNumbers = new uint32[](length); bool[] memory ticketStatuses = new bool[](length); for (uint256 i = 0; i < length; i++) { lotteryTicketIds[i] = _userTicketIdsPerLotteryId[_user][_lotteryId][i + _cursor]; ticketNumbers[i] = _tickets[lotteryTicketIds[i]].number; // True = ticket claimed if (_tickets[lotteryTicketIds[i]].owner == address(0)) { ticketStatuses[i] = true; } else { // ticket not claimed (includes the ones that cannot be claimed) ticketStatuses[i] = false; } } return (lotteryTicketIds, ticketNumbers, ticketStatuses, _cursor + length); } /** * @notice Calculate rewards for a given ticket * @param _lotteryId: lottery id * @param _ticketId: ticket id * @param _bracket: bracket for the ticketId to verify the claim and calculate rewards */ function _calculateRewardsForTicketId( uint256 _lotteryId, uint256 _ticketId, uint32 _bracket ) internal view returns (uint256) { // Retrieve the winning number combination uint32 userNumber = _lotteries[_lotteryId].finalNumber; // Retrieve the user number combination from the ticketId uint32 winningTicketNumber = _tickets[_ticketId].number; // Apply transformation to verify the claim provided by the user is true uint32 transformedWinningNumber = _bracketCalculator[_bracket] + (winningTicketNumber % (uint32(10)**(_bracket + 1))); uint32 transformedUserNumber = _bracketCalculator[_bracket] + (userNumber % (uint32(10)**(_bracket + 1))); // Confirm that the two transformed numbers are the same, if not throw if (transformedWinningNumber == transformedUserNumber) { return _lotteries[_lotteryId].cakePerBracket[_bracket]; } else { return 0; } } /** * @notice Calculate final price for bulk of tickets * @param _discountDivisor: divisor for the discount (the smaller it is, the greater the discount is) * @param _priceTicket: price of a ticket * @param _numberTickets: number of tickets purchased */ function _calculateTotalPriceForBulkTickets( uint256 _discountDivisor, uint256 _priceTicket, uint256 _numberTickets ) internal pure returns (uint256) { return (_priceTicket * _numberTickets * (_discountDivisor + 1 - _numberTickets)) / _discountDivisor; } /** * @notice Check if an address is a contract */ function _isContract(address _addr) internal view returns (bool) { uint256 size; assembly { size := extcodesize(_addr) } return size > 0; } }
[{"inputs":[{"internalType":"address","name":"_cakeTokenAddress","type":"address"},{"internalType":"bool","name":"_OnoutFeeEnabled","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AdminTokenRecovery","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"lotteryId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"firstTicketIdNextLottery","type":"uint256"}],"name":"LotteryClose","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"lotteryId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"injectedAmount","type":"uint256"}],"name":"LotteryInjection","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"lotteryId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"finalNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"countWinningTickets","type":"uint256"}],"name":"LotteryNumberDrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"lotteryId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"priceTicketInCake","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"firstTicketId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"injectedAmount","type":"uint256"}],"name":"LotteryOpen","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"address","name":"treasury","type":"address"},{"indexed":false,"internalType":"address","name":"injector","type":"address"}],"name":"NewOperatorAndTreasuryAndInjectorAddresses","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"claimer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"lotteryId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"numberTickets","type":"uint256"}],"name":"TicketsClaim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":true,"internalType":"uint256","name":"lotteryId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"numberTickets","type":"uint256"}],"name":"TicketsPurchase","type":"event"},{"inputs":[],"name":"MAX_LENGTH_LOTTERY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TREASURY_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_DISCOUNT_DIVISOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_LENGTH_LOTTERY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lotteryId","type":"uint256"},{"internalType":"uint32[]","name":"_ticketNumbers","type":"uint32[]"}],"name":"buyTickets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cakeToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_discountDivisor","type":"uint256"},{"internalType":"uint256","name":"_priceTicket","type":"uint256"},{"internalType":"uint256","name":"_numberTickets","type":"uint256"}],"name":"calculateTotalPriceForBulkTickets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lotteryId","type":"uint256"},{"internalType":"uint256[]","name":"_ticketIds","type":"uint256[]"},{"internalType":"uint32[]","name":"_brackets","type":"uint32[]"}],"name":"claimTickets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lotteryId","type":"uint256"}],"name":"closeLottery","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentLotteryId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentTicketId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lotteryId","type":"uint256"},{"internalType":"bytes32","name":"_seed","type":"bytes32"},{"internalType":"bool","name":"_autoInjection","type":"bool"}],"name":"drawFinalNumberAndMakeLotteryClaimable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lotteryId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"injectFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"injectorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxNumberTicketsPerBuyOrClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPriceTicketInCake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minPriceTicketInCake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numbersCount","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingInjectionNextLottery","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"recoverWrongTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxNumberTicketsPerBuy","type":"uint256"}],"name":"setMaxNumberTicketsPerBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minPriceTicketInCake","type":"uint256"},{"internalType":"uint256","name":"_maxPriceTicketInCake","type":"uint256"}],"name":"setMinAndMaxTicketPriceInCake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_numbersCount","type":"uint32"}],"name":"setNumbersCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newFeeAddress","type":"address"}],"name":"setOnoutAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_value","type":"bool"}],"name":"setOnoutFeeEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operatorAddress","type":"address"}],"name":"setOperatorAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operatorAddress","type":"address"},{"internalType":"address","name":"_treasuryAddress","type":"address"},{"internalType":"address","name":"_injectorAddress","type":"address"}],"name":"setOperatorAndTreasuryAndInjectorAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_endTime","type":"uint256"},{"internalType":"uint256","name":"_priceTicketInCake","type":"uint256"},{"internalType":"uint256","name":"_discountDivisor","type":"uint256"},{"internalType":"uint256[6]","name":"_rewardsBreakdown","type":"uint256[6]"},{"internalType":"uint256","name":"_treasuryFee","type":"uint256"}],"name":"startLottery","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewCurrentLotteryId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lotteryId","type":"uint256"}],"name":"viewLottery","outputs":[{"components":[{"internalType":"enum PancakeSwapLottery.Status","name":"status","type":"uint8"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"priceTicketInCake","type":"uint256"},{"internalType":"uint256","name":"discountDivisor","type":"uint256"},{"internalType":"uint256[6]","name":"rewardsBreakdown","type":"uint256[6]"},{"internalType":"uint256","name":"treasuryFee","type":"uint256"},{"internalType":"uint256[6]","name":"cakePerBracket","type":"uint256[6]"},{"internalType":"uint256[6]","name":"countWinnersPerBracket","type":"uint256[6]"},{"internalType":"uint256","name":"firstTicketId","type":"uint256"},{"internalType":"uint256","name":"firstTicketIdNextLottery","type":"uint256"},{"internalType":"uint256","name":"amountCollectedInCake","type":"uint256"},{"internalType":"uint32","name":"finalNumber","type":"uint32"}],"internalType":"struct PancakeSwapLottery.Lottery","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_ticketIds","type":"uint256[]"}],"name":"viewNumbersAndStatusesForTicketIds","outputs":[{"internalType":"uint32[]","name":"","type":"uint32[]"},{"internalType":"bool[]","name":"","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lotteryId","type":"uint256"},{"internalType":"uint256","name":"_ticketId","type":"uint256"},{"internalType":"uint32","name":"_bracket","type":"uint32"}],"name":"viewRewardsForTicketId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_lotteryId","type":"uint256"},{"internalType":"uint256","name":"_cursor","type":"uint256"},{"internalType":"uint256","name":"_size","type":"uint256"}],"name":"viewUserInfoForLotteryId","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint32[]","name":"","type":"uint32[]"},{"internalType":"bool[]","name":"","type":"bool[]"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"withdrawBank","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawCooldown","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405260646007556802b5e3af16b188000060085562989680600955600b80547401df50ef7e506536354e7a805442dcbf25c7ac249b6001600160a81b03199091161790556014600c556228de80600d55600e805463ffffffff191660061790553480156200006f57600080fd5b506040516200542f3803806200542f833981016040819052620000929162000523565b6001600081815581546001600160a01b031916339081179092556040518291907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600e8054600160201b600160c01b0319166401000000006001600160a01b03851602179055600b805460ff60a01b1916600160a01b83151502179055620001276001546001600160a01b031690565b600380546001600160a01b0319166001600160a01b0392831617905560015416600480546001600160a01b0319166001600160a01b0392831617905560015416600280546001600160a01b03929092166001600160a01b031990921691909117905560116020527f4ad3b33220dddc71b994a52d72c06b10862965f7d926534c05c00fb7e819e7b7805463ffffffff199081166001179091557f17bc176d2408558f6e4111feebc3cab4e16b63e967be91cde721f4c8a488b55280548216600b1790557f08037d7b151cc412d25674a4e66b334d9ae9d2e5517a7feaae5cdb828bf1c62880548216606f1790557f9bfbaa59f8e10e7868f8b402de9d605a390c45ddaebd8c9de3c6f31e733c87ff805482166104571790557f251164fe1d8864fe5e86082eae9c288bc2b58695a4d28538dfe86e9e4f17558580548216612b67179055600560008181527fc550213cee30afd5e67ccba7be3d381bbc169034ae08eb3ec9168caca9fe55e780549093166201b20717909255805491620002ad8362000571565b9091555050604080516101a08101909152806003815260200142815260200142815260200160008152602001600081526020016040518060c0016040528060fa8152602001610177815260200161027181526020016104e281526020016109c4815260200161138881525081526020016107d081526020016040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525081526020016040518060c0016040528060008152602001600081526020016000815260200160008152602001600081526020016000815250815260200160065481526020016006548152602001600a548152602001620f424063ffffffff16815250600f6000600554815260200190815260200160002060008201518160000160006101000a81548160ff02191690836003811115620003fc57620003fc62000599565b02179055506020820151600182015560408201516002820155606082015160038201556080820151600482015560a0820151620004409060058301906006620004c9565b5060c0820151600b82015560e08201516200046290600c8301906006620004c9565b506101008201516200047b9060128301906006620004c9565b5061012082015160188201556101408201516019820155610160820151601a82015561018090910151601b909101805463ffffffff191663ffffffff90921691909117905550620005af9050565b8260068101928215620004fa579160200282015b82811115620004fa578251825591602001919060010190620004dd565b50620005089291506200050c565b5090565b5b808211156200050857600081556001016200050d565b600080604083850312156200053757600080fd5b82516001600160a01b03811681146200054f57600080fd5b602084015190925080151581146200056657600080fd5b809150509250929050565b6000600182016200059257634e487b7160e01b600052601160045260246000fd5b5060010190565b634e487b7160e01b600052602160045260246000fd5b614e7080620005bf6000396000f3fe608060405234801561001057600080fd5b50600436106102c85760003560e01c80637cb583bd1161017b578063c4937ab9116100d8578063da7429f81161008c578063f2b3c80911610071578063f2b3c809146105cc578063f2fde38b146105d5578063fe014066146105e857600080fd5b8063da7429f8146105af578063db19da0d146105c257600080fd5b8063c914914f116100bd578063c914914f14610564578063d86b298214610577578063da4ca0391461059c57600080fd5b8063c4937ab914610531578063c5f956af1461054457600080fd5b80638fc3539a1161012f5780639d8ca531116101145780639d8ca531146104f8578063b1829b821461050b578063be2ff4a91461051e57600080fd5b80638fc3539a146104b75780639c384653146104d857600080fd5b806388303dbd1161016057806388303dbd1461045e5780638904bf2f146104715780638da5cb5b1461049957600080fd5b80637cb583bd146102f957806380a061601461045657600080fd5b80632423807a11610229578063471aeab4116101dd5780636b873788116101c25780636b873788146104325780636be4097c14610445578063715018a61461044e57600080fd5b8063471aeab414610416578063686465b81461042957600080fd5b806331feb5651161020e57806331feb565146103f15780633cbfe3a1146103fa5780633f138d4b1461040357600080fd5b80632423807a146103be5780632e530cae146103de57600080fd5b80631f710996116102805780631fe86c6b116102655780631fe86c6b1461038f57806320211a30146103985780632385860b146103ab57600080fd5b80631f710996146103735780631f73664b1461038657600080fd5b806309b86c9d116102b157806309b86c9d14610310578063127effb21461032557806312a9769d1461036a57600080fd5b806305531eeb146102cd57806307fb5a9c146102f9575b600080fd5b6102e06102db366004614481565b6105fb565b6040516102f0949392919061452d565b60405180910390f35b61030261012c81565b6040519081526020016102f0565b61032361031e3660046145a1565b610927565b005b6003546103459073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102f0565b610302600a5481565b6103236103813660046145ca565b610a1a565b61030260085481565b61030260075481565b6103236103a63660046145fb565b610b0b565b6103236103b9366004614616565b610d3f565b6103d16103cc36600461464f565b611434565b6040516102f091906146f5565b6103026103ec3660046147b9565b611595565b61030260095481565b610302600d5481565b6103236104113660046147ee565b61161c565b610323610424366004614818565b6117c3565b61030260065481565b61032361044036600461464f565b61197e565b61030260055481565b610323611a6e565b600554610302565b61032361046c36600461487f565b611b5e565b600e5461034590640100000000900473ffffffffffffffffffffffffffffffffffffffff1681565b60015473ffffffffffffffffffffffffffffffffffffffff16610345565b6104ca6104c53660046148cb565b6122cd565b6040516102f092919061490d565b6002546103459073ffffffffffffffffffffffffffffffffffffffff1681565b61032361050636600461464f565b612493565b61032361051936600461493b565b61273a565b61032361052c36600461464f565b612d0c565b61030261053f36600461498a565b612f87565b6004546103459073ffffffffffffffffffffffffffffffffffffffff1681565b6103236105723660046149b6565b61306a565b600e546105879063ffffffff1681565b60405163ffffffff90911681526020016102f0565b6103236105aa366004614a30565b613802565b6103236105bd366004614818565b613aa3565b6103026228dfac81565b610302610bb881565b6103236105e33660046145a1565b613b99565b6103236105f63660046145a1565b613d4b565b73ffffffffffffffffffffffffffffffffffffffff84166000908152601360209081526040808320868452909152812054606091829182919085906106408882614a99565b821115610654576106518882614a99565b91505b60008267ffffffffffffffff81111561066f5761066f614ab2565b604051908082528060200260200182016040528015610698578160200160208202803683370190505b50905060008367ffffffffffffffff8111156106b6576106b6614ab2565b6040519080825280602002602001820160405280156106df578160200160208202803683370190505b50905060008467ffffffffffffffff8111156106fd576106fd614ab2565b604051908082528060200260200182016040528015610726578160200160208202803683370190505b50905060005b8581101561090157601360008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008e81526020019081526020016000208c826107909190614ae1565b815481106107a0576107a0614af4565b90600052602060002001548482815181106107bd576107bd614af4565b602002602001018181525050601060008583815181106107df576107df614af4565b6020026020010151815260200190815260200160002060000160009054906101000a900463ffffffff1683828151811061081b5761081b614af4565b602002602001019063ffffffff16908163ffffffff1681525050600073ffffffffffffffffffffffffffffffffffffffff166010600086848151811061086357610863614af4565b602090810291909101810151825281019190915260400160002054640100000000900473ffffffffffffffffffffffffffffffffffffffff16036108ca5760018282815181106108b5576108b5614af4565b911515602092830291909101909101526108ef565b60008282815181106108de576108de614af4565b911515602092830291909101909101525b806108f981614b23565b91505061072c565b5082828261090f888f614ae1565b98509850985098505050505050945094509450949050565b600b5473ffffffffffffffffffffffffffffffffffffffff1633146109d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4f6e6c79204f6e6f75742063616e206368616e6765206665652061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b600b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600b5473ffffffffffffffffffffffffffffffffffffffff163314610ac1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f6e6c79204f6e6f75742063616e20656e61626c652f64697361626c6520736560448201527f727669636520666565000000000000000000000000000000000000000000000060648201526084016109ca565b600b805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b60015473ffffffffffffffffffffffffffffffffffffffff163314610b8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ca565b60068163ffffffff161115610bfd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f6e756d62657273436f756e74206d757374206265203c3d20360000000000000060448201526064016109ca565b60028163ffffffff161015610c6e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f6e756d62657273436f756e74206d757374206265203e3d20320000000000000060448201526064016109ca565b6005541580610ca2575060036005546000908152600f602052604090205460ff166003811115610ca057610ca0614668565b145b610d08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f486173206e6f742066696e6973686564206c6f7474657279000000000000000060448201526064016109ca565b600e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff92909216919091179055565b60015473ffffffffffffffffffffffffffffffffffffffff16331480610d7c575060035473ffffffffffffffffffffffffffffffffffffffff1633145b610de2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f74206f776e6572206f72206f70657261746f72000000000000000000000060448201526064016109ca565b600260005403610e4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109ca565b60026000818155848152600f602052604090205460ff166003811115610e7657610e76614668565b14610edd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4c6f7474657279206e6f7420636c6f736500000000000000000000000000000060448201526064016109ca565b6000838152600f60205260408120600b0154819061271090610eff9082614a99565b6000878152600f60205260409020601a0154610f1b9190614b5b565b610f259190614ba1565b6000868152600f6020908152604080832060188101546019820154601a90920154835142818701528085018c905260608082018e9052608082019390935260a081019390935260c083015260e08201869052434061010083015241901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001661012082015244610134820152456101548201523a61017480830191909152825180830390910181526101949091019091528051910120919250610feb620f424083614bb5565b610ff890620f4240614ae1565b90506000805b600e5463ffffffff908116908216101561128e57600e54600090829061102c9060019063ffffffff16614bc9565b6110369190614bc9565b90506000611045826001614be6565b61105090600a614d14565b61105a9086614d31565b63ffffffff80841660009081526011602052604090205461107c929116614be6565b60008c815260126020908152604080832063ffffffff851684529091529020549091506110aa908990614a99565b60008c8152600f6020526040902060120163ffffffff8416600681106110d2576110d2614af4565b015560008b815260126020908152604080832063ffffffff851684529091529020546110ff908990614a99565b156111fe5760008b8152600f6020526040902060050163ffffffff83166006811061112c5761112c614af4565b0154156111f95760008b815260126020908152604080832063ffffffff8516845290915290205461271090611162908a90614a99565b60008d8152600f60205260409020899060050163ffffffff86166006811061118c5761118c614af4565b01546111989190614b5b565b6111a29190614ba1565b6111ac9190614ba1565b60008c8152600f60205260409020600c0163ffffffff8416600681106111d4576111d4614af4565b015560008b815260126020908152604080832063ffffffff8516845290915290205497505b611279565b60008b8152600f60205260408120600c0163ffffffff84166006811061122657611226614af4565b015560008b8152600f6020526040902061271090889060050163ffffffff85166006811061125657611256614af4565b01546112629190614b5b565b61126c9190614ba1565b6112769085614ae1565b93505b5050808061128690614d54565b915050610ffe565b506000888152600f60205260409020601b8101805463ffffffff85167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000090911617905580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166003179055851561130657600a5560005b6000888152600f60205260409020601a0154611323908590614a99565b61132d9082614ae1565b600b5490915074010000000000000000000000000000000000000000900460ff16156113b157600c54600090611364606484614ba1565b61136e9190614b5b565b905061137a8183614a99565b600b54600e549193506113af91640100000000900473ffffffffffffffffffffffffffffffffffffffff908116911683613e90565b505b600454600e546113e39173ffffffffffffffffffffffffffffffffffffffff6401000000009092048216911683613e90565b6005546040805163ffffffff85168152602081018890527f98e31a6607b8b15b4d5b91de54f4c09ffe4c4cf162aa532c70b5213754e2e703910160405180910390a250506001600055505050505050565b61143c614366565b6000828152600f60205260409081902081516101a081019092528054829060ff16600381111561146e5761146e614668565b600381111561147f5761147f614668565b81526001820154602082015260028201546040808301919091526003830154606083015260048301546080830152805160c081019182905260a09092019190600584019060069082845b8154815260200190600101908083116114c9575050509183525050600b82015460208201526040805160c081018252910190600c830160068282826020028201915b81548152602001906001019080831161150b5750505091835250506040805160c081019182905260209092019190601284019060069082845b8154815260200190600101908083116115445750505091835250506018820154602082015260198201546040820152601a8201546060820152601b9091015463ffffffff1660809091015292915050565b600060036000858152600f602052604090205460ff1660038111156115bc576115bc614668565b146115c957506000611615565b6000848152600f6020526040902060190154831180156115fa57506000848152600f60205260409020601801548311155b1561160757506000611615565b611612848484613f69565b90505b9392505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461169d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ca565b600e5473ffffffffffffffffffffffffffffffffffffffff838116640100000000909204161461174f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f596f7520646f6e742063616e207265636f766572206c6f747465727920746f6b60448201527f656e00000000000000000000000000000000000000000000000000000000000060648201526084016109ca565b61177073ffffffffffffffffffffffffffffffffffffffff83163383613e90565b6040805173ffffffffffffffffffffffffffffffffffffffff84168152602081018390527f74545154aac348a3eac92596bd1971957ca94795f4e954ec5f613b55fab78129910160405180910390a15050565b60015473ffffffffffffffffffffffffffffffffffffffff16331480611800575060025473ffffffffffffffffffffffffffffffffffffffff1633145b611866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f74206f776e6572206f7220696e6a6563746f72000000000000000000000060448201526064016109ca565b60016000838152600f602052604090205460ff16600381111561188b5761188b614668565b146118f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c6f7474657279206e6f74206f70656e0000000000000000000000000000000060448201526064016109ca565b600e5461191f90640100000000900473ffffffffffffffffffffffffffffffffffffffff16333084614073565b6000828152600f60205260408120601a018054839290611940908490614ae1565b909155505060405181815282907f1bbd659dd628a25f7ff2eabb69c74a56939c539728282275c1c9c1a2d3e340499060200160405180910390a25050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146119ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ca565b80600003611a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f4d757374206265203e203000000000000000000000000000000000000000000060448201526064016109ca565b600755565b60015473ffffffffffffffffffffffffffffffffffffffff163314611aef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ca565b60015460405160009173ffffffffffffffffffffffffffffffffffffffff16907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b333b15611bc7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f436f6e7472616374206e6f7420616c6c6f77656400000000000000000000000060448201526064016109ca565b333214611c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f50726f787920636f6e7472616374206e6f7420616c6c6f77656400000000000060448201526064016109ca565b600260005403611c9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109ca565b60026000908155819003611d0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4e6f207469636b6574207370656369666965640000000000000000000000000060448201526064016109ca565b600754811115611d78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f546f6f206d616e79207469636b6574730000000000000000000000000000000060448201526064016109ca565b60016000848152600f602052604090205460ff166003811115611d9d57611d9d614668565b14611e04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4c6f7474657279206973206e6f74206f70656e0000000000000000000000000060448201526064016109ca565b6000838152600f60205260409020600201544210611e7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4c6f7474657279206973206f766572000000000000000000000000000000000060448201526064016109ca565b6000838152600f602052604081206004810154600390910154611ea29190846140d7565b600e54909150611ed290640100000000900473ffffffffffffffffffffffffffffffffffffffff16333084614073565b6000848152600f60205260408120601a018054839290611ef3908490614ae1565b90915550600090505b8281101561228a576000848483818110611f1857611f18614af4565b9050602002016020810190611f2d91906145fb565b9050611f3b6006600a614d77565b611f459082614bc9565b611f5290620f4240614be6565b9050620f42408163ffffffff1610158015611f765750621e847f8163ffffffff1611155b611fdc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4f7574736964652072616e67650000000000000000000000000000000000000060448201526064016109ca565b600086815260126020526040812090611ff6600a84614d31565b612001906001614be6565b63ffffffff1681526020810191909152604001600090812080549161202583614b23565b9091555050600086815260126020526040812090612044606484614d31565b61204f90600b614be6565b63ffffffff1681526020810191909152604001600090812080549161207383614b23565b90915550506000868152601260205260408120906120936103e884614d31565b61209e90606f614be6565b63ffffffff168152602081019190915260400160009081208054916120c283614b23565b90915550506000868152601260205260408120906120e261271084614d31565b6120ee90610457614be6565b63ffffffff1681526020810191909152604001600090812080549161211283614b23565b9091555050600086815260126020526040812090612133620186a084614d31565b61213f90612b67614be6565b63ffffffff1681526020810191909152604001600090812080549161216383614b23565b9091555050600086815260126020526040812090612184620f424084614d31565b612191906201b207614be6565b63ffffffff168152602081019190915260400160009081208054916121b583614b23565b90915550503360008181526013602090815260408083208a84528252808320600680548254600181018455928652848620909201919091558151808301835263ffffffff808816825281850196875282548652601090945291842091518254955173ffffffffffffffffffffffffffffffffffffffff16640100000000027fffffffffffffffff000000000000000000000000000000000000000000000000909616931692909217939093179092558154919061227183614b23565b919050555050808061228290614b23565b915050611efc565b50604051828152849033907fd7d247b583de1023852eef87b48f54354dbec771d01bc2cc49e96094efc322b99060200160405180910390a3505060016000555050565b6060808260008167ffffffffffffffff8111156122ec576122ec614ab2565b604051908082528060200260200182016040528015612315578160200160208202803683370190505b50905060008267ffffffffffffffff81111561233357612333614ab2565b60405190808252806020026020018201604052801561235c578160200160208202803683370190505b50905060005b83811015612484576010600089898481811061238057612380614af4565b90506020020135815260200190815260200160002060000160009054906101000a900463ffffffff168382815181106123bb576123bb614af4565b63ffffffff9092166020928302919091019091015260006010818a8a858181106123e7576123e7614af4565b6020908102929092013583525081019190915260400160002054640100000000900473ffffffffffffffffffffffffffffffffffffffff160361244d57600182828151811061243857612438614af4565b91151560209283029190910190910152612472565b600082828151811061246157612461614af4565b911515602092830291909101909101525b8061247c81614b23565b915050612362565b509093509150505b9250929050565b60015473ffffffffffffffffffffffffffffffffffffffff163314806124d0575060035473ffffffffffffffffffffffffffffffffffffffff1633145b612536576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f74206f776e6572206f72206f70657261746f72000000000000000000000060448201526064016109ca565b6002600054036125a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109ca565b600260005560016000828152600f602052604090205460ff1660038111156125cc576125cc614668565b14612633576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c6f7474657279206e6f74206f70656e0000000000000000000000000000000060448201526064016109ca565b6000818152600f602052604090206002015442116126ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c6f7474657279206e6f74206f7665720000000000000000000000000000000060448201526064016109ca565b6006546000828152600f6020526040902060198101919091558054600291907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001830217905550807f3728e75294796694d59d2ffced9c394279baf7b9ebd2702db43f5f04bac6792960065460405161272a91815260200190565b60405180910390a2506001600055565b60015473ffffffffffffffffffffffffffffffffffffffff16331480612777575060035473ffffffffffffffffffffffffffffffffffffffff1633145b6127dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f74206f776e6572206f72206f70657261746f72000000000000000000000060448201526064016109ca565b6005541580612811575060036005546000908152600f602052604090205460ff16600381111561280f5761280f614668565b145b612877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4e6f742074696d6520746f207374617274206c6f74746572790000000000000060448201526064016109ca565b61012c6128844287614a99565b11801561289c57506228dfac61289a4287614a99565b105b612902576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4c6f7474657279206c656e677468206f757473696465206f662072616e67650060448201526064016109ca565b61012c83101561296e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f446973636f756e742064697669736f7220746f6f206c6f77000000000000000060448201526064016109ca565b610bb88111156129da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f54726561737572792066656520746f6f2068696768000000000000000000000060448201526064016109ca565b60a08201356080830135606084013560408501356129fd60208701358735614ae1565b612a079190614ae1565b612a119190614ae1565b612a1b9190614ae1565b612a259190614ae1565b61271014612a8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f52657761726473206d75737420657175616c203130303030000000000000000060448201526064016109ca565b60058054906000612a9f83614b23565b9091555050604080516101a0810190915280600181526020014281526020018681526020018581526020018481526020018360068060200260405190810160405280929190826006602002808284376000920182905250928452505060208083018590526040805160c080820183528482528184018590528183018590526060808301869052608080840187905260a080850188905285890194909452845180840186528781528087018890528086018890528083018890528082018890528085018890529188019190915260065490870181905291860191909152600a549085015260e09093018290526005548252600f9052208151815482907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001836003811115612bd057612bd0614668565b02179055506020820151600182015560408201516002820155606082015160038201556080820151600482015560a0820151612c1290600583019060066143e7565b5060c0820151600b82015560e0820151612c3290600c83019060066143e7565b50610100820151612c4990601283019060066143e7565b5061012082015160188201556101408201516019820155610160820151601a82015561018090910151601b90910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff909216919091179055600554600654600a5460408051428152602081018a9052908101889052606081019290925260808201527f367e70f8c0e0c0a6504d92172bda155c02022d532fc85b5d66a9c49e31c8bc779060a00160405180910390a250506000600a55505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314612d8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ca565b6005541580612dc1575060036005546000908152600f602052604090205460ff166003811115612dbf57612dbf614668565b145b612e4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f596f752063616e742077697468647261772062616e6b207768696c65206c6f7460448201527f74657279206973206e6f742066696e697368656400000000000000000000000060648201526084016109ca565b600d546005546000908152600f6020526040902060020154612e6f9190614ae1565b4211612ed7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f576974686472617720636f6f6c646f776e21000000000000000000000000000060448201526064016109ca565b600b5474010000000000000000000000000000000000000000900460ff1615612f5857600c54600090612f0b606484614ba1565b612f159190614b5b565b9050612f218183614a99565b600b54600e54919350612f5691640100000000900473ffffffffffffffffffffffffffffffffffffffff908116911683613e90565b505b600e54612f8490640100000000900473ffffffffffffffffffffffffffffffffffffffff163383613e90565b50565b600061012c841015612ff5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d757374206265203e3d204d494e5f444953434f554e545f44495649534f520060448201526064016109ca565b8160000361305f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4e756d626572206f66207469636b657473206d757374206265203e203000000060448201526064016109ca565b6116128484846140d7565b333b156130d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f436f6e7472616374206e6f7420616c6c6f77656400000000000000000000000060448201526064016109ca565b33321461313c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f50726f787920636f6e7472616374206e6f7420616c6c6f77656400000000000060448201526064016109ca565b6002600054036131a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109ca565b6002600055828114613216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e6f742073616d65206c656e677468000000000000000000000000000000000060448201526064016109ca565b6000839003613281576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4c656e677468206d757374206265203e3000000000000000000000000000000060448201526064016109ca565b6007548311156132ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f546f6f206d616e79207469636b6574730000000000000000000000000000000060448201526064016109ca565b60036000868152600f602052604090205460ff16600381111561331257613312614668565b14613379576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4c6f7474657279206e6f7420636c61696d61626c65000000000000000000000060448201526064016109ca565b6000805b8481101561378b57600684848381811061339957613399614af4565b90506020020160208101906133ae91906145fb565b63ffffffff161061341b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f427261636b6574206f7574206f662072616e676500000000000000000000000060448201526064016109ca565b600086868381811061342f5761342f614af4565b90506020020135905080600f60008a815260200190815260200160002060190154116134b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5469636b6574496420746f6f206869676800000000000000000000000000000060448201526064016109ca565b6000888152600f6020526040902060180154811015613532576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5469636b6574496420746f6f206c6f770000000000000000000000000000000060448201526064016109ca565b600081815260106020526040902054640100000000900473ffffffffffffffffffffffffffffffffffffffff1633146135c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4e6f7420746865206f776e65720000000000000000000000000000000000000060448201526064016109ca565b600081815260106020526040812080547fffffffffffffffff0000000000000000000000000000000000000000ffffffff16905561362c898388888781811061361257613612614af4565b905060200201602081019061362791906145fb565b613f69565b905080600003613698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4e6f207072697a6520666f72207468697320627261636b65740000000000000060448201526064016109ca565b8585848181106136aa576136aa614af4565b90506020020160208101906136bf91906145fb565b63ffffffff1660051461376a5761370389838888878181106136e3576136e3614af4565b90506020020160208101906136f891906145fb565b613627906001614be6565b1561376a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f427261636b6574206d757374206265206869676865720000000000000000000060448201526064016109ca565b6137748185614ae1565b93505050808061378390614b23565b91505061337d565b50600e546137b890640100000000900473ffffffffffffffffffffffffffffffffffffffff163383613e90565b6040805182815260208101869052879133917f0f5fca62da8fb5d95525b49e5eaa7b20bc6bd9e2f6b64b493442d1c0bd6ef486910160405180910390a35050600160005550505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314613883576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ca565b73ffffffffffffffffffffffffffffffffffffffff8316613900576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616e6e6f74206265207a65726f20616464726573730000000000000000000060448201526064016109ca565b73ffffffffffffffffffffffffffffffffffffffff821661397d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616e6e6f74206265207a65726f20616464726573730000000000000000000060448201526064016109ca565b73ffffffffffffffffffffffffffffffffffffffff81166139fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616e6e6f74206265207a65726f20616464726573730000000000000000000060448201526064016109ca565b6003805473ffffffffffffffffffffffffffffffffffffffff8581167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316811790935560048054868316908416811790915560028054928616929093168217909255604080519384526020840192909252908201527f3e945b7660001d46cfd5e729545f7f0b6c65bdee54066a91c7acad703f1b731e9060600160405180910390a1505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314613b24576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ca565b80821115613b8e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6d696e5072696365206d757374206265203c206d61785072696365000000000060448201526064016109ca565b600991909155600855565b60015473ffffffffffffffffffffffffffffffffffffffff163314613c1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ca565b73ffffffffffffffffffffffffffffffffffffffff8116613cbd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109ca565b60015460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60015473ffffffffffffffffffffffffffffffffffffffff163314613dcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ca565b73ffffffffffffffffffffffffffffffffffffffff8116613e49576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616e6e6f74206265207a65726f20616464726573730000000000000000000060448201526064016109ca565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052613f649084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261410e565b505050565b6000838152600f60209081526040808320601b0154858452601090925282205463ffffffff918216911682613f9f856001614be6565b613faa90600a614d14565b613fb49083614d31565b63ffffffff808716600090815260116020526040902054613fd6929116614be6565b90506000613fe5866001614be6565b613ff090600a614d14565b613ffa9085614d31565b63ffffffff80881660009081526011602052604090205461401c929116614be6565b90508063ffffffff168263ffffffff1603614066576000888152600f60205260409020600c0163ffffffff87166006811061405957614059614af4565b0154945050505050611615565b6000945050505050611615565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526140d19085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613ee2565b50505050565b600083826140e6826001614ae1565b6140f09190614a99565b6140fa8486614b5b565b6141049190614b5b565b6116129190614ba1565b6000614170826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661421a9092919063ffffffff16565b805190915015613f64578080602001905181019061418e9190614d8c565b613f64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016109ca565b6060611612848460008585843b61428d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109ca565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516142b69190614dcd565b60006040518083038185875af1925050503d80600081146142f3576040519150601f19603f3d011682016040523d82523d6000602084013e6142f8565b606091505b5091509150614308828286614313565b979650505050505050565b60608315614322575081611615565b8251156143325782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ca9190614de9565b604080516101a0810190915280600081526020016000815260200160008152602001600081526020016000815260200161439e614425565b8152602001600081526020016143b2614425565b81526020016143bf614425565b8152602001600081526020016000815260200160008152602001600063ffffffff1681525090565b8260068101928215614415579160200282015b828111156144155782518255916020019190600101906143fa565b50614421929150614443565b5090565b6040518060c001604052806006906020820280368337509192915050565b5b808211156144215760008155600101614444565b803573ffffffffffffffffffffffffffffffffffffffff8116811461447c57600080fd5b919050565b6000806000806080858703121561449757600080fd5b6144a085614458565b966020860135965060408601359560600135945092505050565b600081518084526020808501945080840160005b838110156144f057815163ffffffff16875295820195908201906001016144ce565b509495945050505050565b600081518084526020808501945080840160005b838110156144f057815115158752958201959082019060010161450f565b6080808252855190820181905260009060209060a0840190828901845b828110156145665781518452928401929084019060010161454a565b5050508381038285015261457a81886144ba565b915050828103604084015261458f81866144fb565b91505082606083015295945050505050565b6000602082840312156145b357600080fd5b61161582614458565b8015158114612f8457600080fd5b6000602082840312156145dc57600080fd5b8135611615816145bc565b803563ffffffff8116811461447c57600080fd5b60006020828403121561460d57600080fd5b611615826145e7565b60008060006060848603121561462b57600080fd5b83359250602084013591506040840135614644816145bc565b809150509250925092565b60006020828403121561466157600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106146ce577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b8060005b60068110156140d15781518452602093840193909101906001016146d6565b600061038082019050614709828451614697565b6020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015161474360a08401826146d2565b5060c0830151610160818185015260e08501519150610180614767818601846146d2565b610100860151925061477d6102408601846146d2565b6101208601516103008601526101408601516103208601529085015161034085015284015163ffffffff811661036085015290505b5092915050565b6000806000606084860312156147ce57600080fd5b83359250602084013591506147e5604085016145e7565b90509250925092565b6000806040838503121561480157600080fd5b61480a83614458565b946020939093013593505050565b6000806040838503121561482b57600080fd5b50508035926020909101359150565b60008083601f84011261484c57600080fd5b50813567ffffffffffffffff81111561486457600080fd5b6020830191508360208260051b850101111561248c57600080fd5b60008060006040848603121561489457600080fd5b83359250602084013567ffffffffffffffff8111156148b257600080fd5b6148be8682870161483a565b9497909650939450505050565b600080602083850312156148de57600080fd5b823567ffffffffffffffff8111156148f557600080fd5b6149018582860161483a565b90969095509350505050565b60408152600061492060408301856144ba565b828103602084015261493281856144fb565b95945050505050565b6000806000806000610140868803121561495457600080fd5b85359450602086013593506040860135925061012086018781111561497857600080fd5b94979396509194606001933592915050565b60008060006060848603121561499f57600080fd5b505081359360208301359350604090920135919050565b6000806000806000606086880312156149ce57600080fd5b85359450602086013567ffffffffffffffff808211156149ed57600080fd5b6149f989838a0161483a565b90965094506040880135915080821115614a1257600080fd5b50614a1f8882890161483a565b969995985093965092949392505050565b600080600060608486031215614a4557600080fd5b614a4e84614458565b9250614a5c60208501614458565b91506147e560408501614458565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115614aac57614aac614a6a565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b80820180821115614aac57614aac614a6a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614b5457614b54614a6a565b5060010190565b8082028115828204841417614aac57614aac614a6a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082614bb057614bb0614b72565b500490565b600082614bc457614bc4614b72565b500690565b63ffffffff8281168282160390808211156147b2576147b2614a6a565b63ffffffff8181168382160190808211156147b2576147b2614a6a565b600181815b80851115614c40578163ffffffff04821115614c2657614c26614a6a565b80851615614c3357918102915b93841c9390800290614c08565b509250929050565b600082614c5757506001614aac565b81614c6457506000614aac565b8160018114614c7a5760028114614c8457614cb5565b6001915050614aac565b60ff841115614c9557614c95614a6a565b6001841b915063ffffffff821115614caf57614caf614a6a565b50614aac565b5060208310610133831016604e8410600b8410161715614cec575081810a63ffffffff811115614ce757614ce7614a6a565b614aac565b614cf68383614c03565b8063ffffffff04821115614d0c57614d0c614a6a565b029392505050565b600063ffffffff614d29818516828516614c48565b949350505050565b600063ffffffff80841680614d4857614d48614b72565b92169190910692915050565b600063ffffffff808316818103614d6d57614d6d614a6a565b6001019392505050565b600061161560ff841663ffffffff8416614c48565b600060208284031215614d9e57600080fd5b8151611615816145bc565b60005b83811015614dc4578181015183820152602001614dac565b50506000910152565b60008251614ddf818460208701614da9565b9190910192915050565b6020815260008251806020840152614e08816040850160208701614da9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fea26469706673582212206fc0717c142118d6284405804f9a984dc977ef66aa130f613dacbbd6db7276bb64736f6c63430008110033000000000000000000000000c0177cce8c459ca42f23568a7d729e81db6d25a90000000000000000000000000000000000000000000000000000000000000001
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c0177cce8c459ca42f23568a7d729e81db6d25a90000000000000000000000000000000000000000000000000000000000000001
-----Decoded View---------------
Arg [0] : _cakeTokenAddress (address): 0xc0177cce8c459ca42f23568a7d729e81db6d25a9
Arg [1] : _OnoutFeeEnabled (bool): True
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000c0177cce8c459ca42f23568a7d729e81db6d25a9
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000001
Deployed ByteCode Sourcemap
23218:30116:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49753:1433;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;24023:54;;24068:9;24023:54;;;;;2842:25:1;;;2830:2;2815:18;24023:54:0;2696:177:1;27247:187:0;;;;;;:::i;:::-;;:::i;:::-;;23374:30;;;;;;;;;;;;3245:42:1;3233:55;;;3215:74;;3203:2;3188:18;23374:30:0;3069:226:1;23705:42:0;;;;;;27442:182;;;;;;:::i;:::-;;:::i;23586:46::-;;;;;;23527:50;;;;;;43910:421;;;;;;:::i;:::-;;:::i;34929:4266::-;;;;;;:::i;:::-;;:::i;47464:128::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;48799:641::-;;;;;;:::i;:::-;;:::i;23639:57::-;;;;;;23916:41;;;;;;42874:338;;;;;;:::i;:::-;;:::i;39394:393::-;;;;;;:::i;:::-;;:::i;23488:30::-;;;;;;45055:224;;;;;;:::i;:::-;;:::i;23450:31::-;;;;;;2665:148;;;:::i;47244:115::-;47335:16;;47244:115;;29429:2292;;;;;;:::i;:::-;;:::i;24363:23::-;;;;;;;;;;;;2014:87;2087:6;;;;2014:87;;47740:702;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;23337:30::-;;;;;;;;;34177:465;;;;;;:::i;:::-;;:::i;40237:2358::-;;;;;;:::i;:::-;;:::i;43220:682::-;;;;;;:::i;:::-;;:::i;46720:458::-;;;;;;:::i;:::-;;:::i;23411:30::-;;;;;;;;;32007:2042;;;;;;:::i;:::-;;:::i;24264:30::-;;;;;;;;;;;;11472:10:1;11460:23;;;11442:42;;11430:2;11415:18;24264:30:0;11298:192:1;45575:670:0;;;;;;:::i;:::-;;:::i;44591:360::-;;;;;;:::i;:::-;;:::i;24119:64::-;;24164:19;24119:64;;24201:47;;24244:4;24201:47;;2968:244;;;;;;:::i;:::-;;:::i;46253:222::-;;;;;;:::i;:::-;;:::i;49753:1433::-;50159:33;;;50050:7;50159:33;;;:26;:33;;;;;;;;:45;;;;;;;;:52;49961:16;;;;;;50050:7;50102:5;;50238:40;50271:7;50159:52;50238:40;:::i;:::-;50228:6;:51;50224:133;;;50305:40;50338:7;50305:30;:40;:::i;:::-;50296:49;;50224:133;50369:33;50419:6;50405:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50405:21:0;;50369:57;;50437:29;50482:6;50469:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50469:20:0;;50437:52;;50500:28;50542:6;50531:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50531:18:0;;50500:49;;50567:9;50562:530;50586:6;50582:1;:10;50562:530;;;50636:26;:33;50663:5;50636:33;;;;;;;;;;;;;;;:45;50670:10;50636:45;;;;;;;;;;;50686:7;50682:1;:11;;;;:::i;:::-;50636:58;;;;;;;;:::i;:::-;;;;;;;;;50614:16;50631:1;50614:19;;;;;;;;:::i;:::-;;;;;;:80;;;;;50728:8;:29;50737:16;50754:1;50737:19;;;;;;;;:::i;:::-;;;;;;;50728:29;;;;;;;;;;;:36;;;;;;;;;;;;50709:13;50723:1;50709:16;;;;;;;;:::i;:::-;;;;;;:55;;;;;;;;;;;50870:1;50823:49;;:8;:29;50832:16;50849:1;50832:19;;;;;;;;:::i;:::-;;;;;;;;;;;;50823:29;;;;;;;;;;-1:-1:-1;50823:29:0;:35;;;;;;:49;50819:262;;50913:4;50893:14;50908:1;50893:17;;;;;;;;:::i;:::-;:24;;;:17;;;;;;;;;;;:24;50819:262;;;51060:5;51040:14;51055:1;51040:17;;;;;;;;:::i;:::-;:25;;;:17;;;;;;;;;;;:25;50819:262;50594:3;;;;:::i;:::-;;;;50562:530;;;-1:-1:-1;51112:16:0;51130:13;51145:14;51161:16;51171:6;51161:7;:16;:::i;:::-;51104:74;;;;;;;;;;;;;49753:1433;;;;;;;;;:::o;27247:187::-;27336:12;;;;27322:10;:26;27314:72;;;;;;;13066:2:1;27314:72:0;;;13048:21:1;13105:2;13085:18;;;13078:30;13144:34;13124:18;;;13117:62;13215:3;13195:18;;;13188:31;13236:19;;27314:72:0;;;;;;;;;27397:12;:29;;;;;;;;;;;;;;;27247:187::o;27442:182::-;27523:12;;;;27509:10;:26;27501:80;;;;;;;13468:2:1;27501:80:0;;;13450:21:1;13507:2;13487:18;;;13480:30;13546:34;13526:18;;;13519:62;13617:11;13597:18;;;13590:39;13646:19;;27501:80:0;13266:405:1;27501:80:0;27592:15;:24;;;;;;;;;;;;;;;;;27442:182::o;43910:421::-;2087:6;;2234:23;2087:6;737:10;2234:23;2226:68;;;;;;;13878:2:1;2226:68:0;;;13860:21:1;;;13897:18;;;13890:30;13956:34;13936:18;;;13929:62;14008:18;;2226:68:0;13676:356:1;2226:68:0;44016:1:::1;44000:13;:17;;;;43992:55;;;::::0;::::1;::::0;;14239:2:1;43992:55:0::1;::::0;::::1;14221:21:1::0;14278:2;14258:18;;;14251:30;14317:27;14297:18;;;14290:55;14362:18;;43992:55:0::1;14037:349:1::0;43992:55:0::1;44082:1;44066:13;:17;;;;44058:55;;;::::0;::::1;::::0;;14593:2:1;44058:55:0::1;::::0;::::1;14575:21:1::0;14632:2;14612:18;;;14605:30;14671:27;14651:18;;;14644:55;14716:18;;44058:55:0::1;14391:349:1::0;44058:55:0::1;44147:16;::::0;:21;;44146:84:::1;;-1:-1:-1::0;44213:16:0::1;44185;::::0;44174:28:::1;::::0;;;:10:::1;:28;::::0;;;;:35;::::1;;:55;::::0;::::1;;;;;;:::i;:::-;;44146:84;44124:158;;;::::0;::::1;::::0;;14947:2:1;44124:158:0::1;::::0;::::1;14929:21:1::0;14986:2;14966:18;;;14959:30;15025:26;15005:18;;;14998:54;15069:18;;44124:158:0::1;14745:348:1::0;44124:158:0::1;44295:12;:28:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;43910:421::o;34929:4266::-;2087:6;;;;26250:10;:21;;26249:58;;-1:-1:-1;26291:15:0;;;;26277:10;:29;26249:58;26241:92;;;;;;;15300:2:1;26241:92:0;;;15282:21:1;15339:2;15319:18;;;15312:30;15378:23;15358:18;;;15351:51;15419:18;;26241:92:0;15098:345:1;26241:92:0;4872:1:::1;5468:7;;:19:::0;5460:63:::1;;;::::0;::::1;::::0;;15650:2:1;5460:63:0::1;::::0;::::1;15632:21:1::0;15689:2;15669:18;;;15662:30;15728:33;15708:18;;;15701:61;15779:18;;5460:63:0::1;15448:355:1::0;5460:63:0::1;4872:1;5601:7;:18:::0;;;35144:22;;;:10:::2;:22;::::0;;;;:29;::::2;;:45;::::0;::::2;;;;;;:::i;:::-;;35136:75;;;::::0;::::2;::::0;;16010:2:1;35136:75:0::2;::::0;::::2;15992:21:1::0;16049:2;16029:18;;;16022:30;16088:19;16068:18;;;16061:47;16125:18;;35136:75:0::2;15808:341:1::0;35136:75:0::2;35299:40;35519:22:::0;;;:10:::2;:22;::::0;;;;:34:::2;;::::0;35299:40;;35569:5:::2;::::0;35511:42:::2;::::0;35569:5;35511:42:::2;:::i;:::-;35462:22;::::0;;;:10:::2;:22;::::0;;;;:44:::2;;::::0;35461:93:::2;::::0;;::::2;:::i;:::-;35445:129;;;;:::i;:::-;35587:18;35729:22:::0;;;:10:::2;:22;::::0;;;;;;;:36:::2;::::0;::::2;::::0;35780:47:::2;::::0;::::2;::::0;35842:44:::2;::::0;;::::2;::::0;35623:464;;35654:15:::2;35623:464:::0;;::::2;17096:19:1::0;17131:12;;;17124:28;;;17168:12;;;;17161:28;;;17205:12;;;17198:28;;;;17242:13;;;17235:29;;;;17280:13;;;17273:29;17318:13;;;17311:29;;;35948:12:0::2;35938:23;17356:13:1::0;;;17349:29;35976:14:0::2;17413:15:1::0;;17430:66;17409:88;17394:13;;;17387:111;36005:16:0::2;17514:13:1::0;;;17507:29;36036:14:0::2;17552:13:1::0;;;17545:30;36065:11:0::2;17591:13:1::0;;;;17584:30;;;;35623:464:0;;;;;;;;;;17630:13:1;;;;35623:464:0;;;35613:475;;;::::2;::::0;17311:29:1;;-1:-1:-1;36147:20:0::2;36160:7;35613:475:::0;36147:20:::2;:::i;:::-;36136:32;::::0;:7:::2;:32;:::i;:::-;36108:61:::0;-1:-1:-1;36239:34:0::2;::::0;36373:1811:::2;36396:12;::::0;::::2;::::0;;::::2;36392:16:::0;;::::2;;36373:1811;;;36441:12;::::0;36430:8:::2;::::0;36460:1;;36441:16:::2;::::0;36456:1:::2;::::0;36441:12:::2;;:16;:::i;:::-;:20;;;;:::i;:::-;36430:31:::0;-1:-1:-1;36476:31:0::2;36563:5;36430:31:::0;36567:1:::2;36563:5;:::i;:::-;36550:19;::::0;36557:2:::2;36550:19;:::i;:::-;36535:35;::::0;:11;:35:::2;:::i;:::-;36510:21;::::0;;::::2;;::::0;;;:18:::2;:21;::::0;;;;;:61:::2;::::0;;:21:::2;:61;:::i;:::-;36656:38;::::0;;;:26:::2;:38;::::0;;;;;;;:64:::2;::::0;::::2;::::0;;;;;;;;36476:95;;-1:-1:-1;36656:116:0::2;::::0;36740:32;;36656:116:::2;:::i;:::-;36588:22;::::0;;;:10:::2;:22;::::0;;;;:45:::2;;:48;::::0;::::2;;::::0;::::2;;;;;:::i;:::-;;:184:::0;36892:38:::2;::::0;;;:26:::2;:38;::::0;;;;;;;:64:::2;::::0;::::2;::::0;;;;;;;;:99:::2;::::0;36959:32;;36892:99:::2;:::i;:::-;36891:123:::0;36869:1304:::2;;37178:22;::::0;;;:10:::2;:22;::::0;;;;:39:::2;;:42;::::0;::::2;;::::0;::::2;;;;;:::i;:::-;;::::0;:47;37174:622:::2;;37421:38;::::0;;;:26:::2;:38;::::0;;;;;;;:64:::2;::::0;::::2;::::0;;;;;;;;37583:5:::2;::::0;37421:132:::2;::::0;37521:32;;37421:132:::2;:::i;:::-;37320:22;::::0;;;:10:::2;:22;::::0;;;;37365;;37320:39:::2;;:42;::::0;::::2;;::::0;::::2;;;;;:::i;:::-;;;:67;;;;:::i;:::-;37319:235;;;;:::i;:::-;37318:270;;;;:::i;:::-;37250:22;::::0;;;:10:::2;:22;::::0;;;;:37:::2;;:40;::::0;::::2;;::::0;::::2;;;;;:::i;:::-;;:338:::0;37712:38:::2;::::0;;;:26:::2;:38;::::0;;;;;;;:64:::2;::::0;::::2;::::0;;;;;;;;;-1:-1:-1;37174:622:0::2;36869:1304;;;37986:1;37943:22:::0;;;:10:::2;:22;::::0;;;;:37:::2;;:40;::::0;::::2;;::::0;::::2;;;;;:::i;:::-;;:44:::0;38060:22:::2;::::0;;;:10:::2;:22;::::0;;;;38152:5:::2;::::0;38105:22;;38060:39:::2;;:42;::::0;::::2;;::::0;::::2;;;;;:::i;:::-;;;:67;;;;:::i;:::-;38059:98;;;;:::i;:::-;38008:149;::::0;;::::2;:::i;:::-;;;36869:1304;36415:1769;;36410:3;;;;;:::i;:::-;;;;36373:1811;;;-1:-1:-1::0;38245:22:0::2;::::0;;;:10:::2;:22;::::0;;;;:34:::2;::::0;::::2;:48:::0;;::::2;::::0;::::2;::::0;;;::::2;;::::0;;38304;;;::::2;38336:16;38304:48;::::0;;38365:148;::::2;;;38400:27;:56:::0;38500:1:::2;38365:148;38556:22;::::0;;;:10:::2;:22;::::0;;;;:44:::2;;::::0;:69:::2;::::0;38603:22;;38556:69:::2;:::i;:::-;38525:101;::::0;;::::2;:::i;:::-;38643:15;::::0;38525:101;;-1:-1:-1;38643:15:0;;::::2;;;38639:326;;;38787:8;::::0;38725:24:::2;::::0;38752:32:::2;38781:3;38752:26:::0;:32:::2;:::i;:::-;:43;;;;:::i;:::-;38725:70:::0;-1:-1:-1;38839:45:0::2;38725:70:::0;38839:26;:45:::2;:::i;:::-;38922:12;::::0;38899:9:::2;::::0;38810:74;;-1:-1:-1;38899:54:0::2;::::0;:9;;::::2;38922:12;38899:9:::0;;::::2;::::0;38922:12:::2;38936:16:::0;38899:22:::2;:54::i;:::-;38660:305;38639:326;39044:15;::::0;39021:9:::2;::::0;:67:::2;::::0;39044:15:::2;39021:9:::0;;;::::2;::::0;::::2;::::0;39044:15:::2;39061:26:::0;39021:22:::2;:67::i;:::-;39123:16;::::0;39104:83:::2;::::0;;20272:10:1;20260:23;;20242:42;;20315:2;20300:18;;20293:34;;;39104:83:0::2;::::0;20215:18:1;39104:83:0::2;;;;;;;-1:-1:-1::0;;4828:1:0::1;5780:7;:22:::0;-1:-1:-1;;;;;;34929:4266:0:o;47464:128::-;47528:14;;:::i;:::-;47562:22;;;;:10;:22;;;;;;;47555:29;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;47555:29:0;;;-1:-1:-1;;47555:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;47555:29:0;;;-1:-1:-1;;47555:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;47555:29:0;;;-1:-1:-1;;47555:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47464:128;-1:-1:-1;;47464:128:0:o;48799:641::-;48944:7;49050:16;49017:22;;;;:10;:22;;;;;:29;;;:49;;;;;;;;:::i;:::-;;49013:90;;-1:-1:-1;49090:1:0;49083:8;;49013:90;49177:22;;;;:10;:22;;;;;:47;;;:59;-1:-1:-1;49176:129:0;;;;-1:-1:-1;49255:22:0;;;;:10;:22;;;;;:36;;;:49;-1:-1:-1;49255:49:0;49176:129;49158:194;;;-1:-1:-1;49339:1:0;49332:8;;49158:194;49371:61;49400:10;49412:9;49423:8;49371:28;:61::i;:::-;49364:68;;48799:641;;;;;;:::o;42874:338::-;2087:6;;2234:23;2087:6;737:10;2234:23;2226:68;;;;;;;13878:2:1;2226:68:0;;;13860:21:1;;;13897:18;;;13890:30;13956:34;13936:18;;;13929:62;14008:18;;2226:68:0;13676:356:1;2226:68:0;43010:9:::1;::::0;::::1;42985:35:::0;;::::1;43010:9:::0;;;::::1;;42985:35;42977:82;;;::::0;::::1;::::0;;20540:2:1;42977:82:0::1;::::0;::::1;20522:21:1::0;20579:2;20559:18;;;20552:30;20618:34;20598:18;;;20591:62;20689:4;20669:18;;;20662:32;20711:19;;42977:82:0::1;20338:398:1::0;42977:82:0::1;43070:69;:34;::::0;::::1;43113:10;43126:12:::0;43070:34:::1;:69::i;:::-;43157:47;::::0;;20945:42:1;20933:55;;20915:74;;21020:2;21005:18;;20998:34;;;43157:47:0::1;::::0;20888:18:1;43157:47:0::1;;;;;;;42874:338:::0;;:::o;39394:393::-;2087:6;;;;26088:10;:21;;26087:58;;-1:-1:-1;26129:15:0;;;;26115:10;:29;26087:58;26079:92;;;;;;;21245:2:1;26079:92:0;;;21227:21:1;21284:2;21264:18;;;21257:30;21323:23;21303:18;;;21296:51;21364:18;;26079:92:0;21043:345:1;26079:92:0;39542:11:::1;39509:22;::::0;;;:10:::1;:22;::::0;;;;:29;::::1;;:44;::::0;::::1;;;;;;:::i;:::-;;39501:73;;;::::0;::::1;::::0;;21595:2:1;39501:73:0::1;::::0;::::1;21577:21:1::0;21634:2;21614:18;;;21607:30;21673:18;21653;;;21646:46;21709:18;;39501:73:0::1;21393:340:1::0;39501:73:0::1;39587:9;::::0;:71:::1;::::0;:9;;::::1;;;39622:10;39643:4;39650:7:::0;39587:26:::1;:71::i;:::-;39669:22;::::0;;;:10:::1;:22;::::0;;;;:44:::1;;:55:::0;;39717:7;;39669:22;:55:::1;::::0;39717:7;;39669:55:::1;:::i;:::-;::::0;;;-1:-1:-1;;39742:37:0::1;::::0;2842:25:1;;;39759:10:0;;39742:37:::1;::::0;2830:2:1;2815:18;39742:37:0::1;;;;;;;39394:393:::0;;:::o;45055:224::-;2087:6;;2234:23;2087:6;737:10;2234:23;2226:68;;;;;;;13878:2:1;2226:68:0;;;13860:21:1;;;13897:18;;;13890:30;13956:34;13936:18;;;13929:62;14008:18;;2226:68:0;13676:356:1;2226:68:0;45161:23:::1;45188:1;45161:28:::0;45153:52:::1;;;::::0;::::1;::::0;;21940:2:1;45153:52:0::1;::::0;::::1;21922:21:1::0;21979:2;21959:18;;;21952:30;22018:13;21998:18;;;21991:41;22049:18;;45153:52:0::1;21738:335:1::0;45153:52:0::1;45216:29;:55:::0;45055:224::o;2665:148::-;2087:6;;2234:23;2087:6;737:10;2234:23;2226:68;;;;;;;13878:2:1;2226:68:0;;;13860:21:1;;;13897:18;;;13890:30;13956:34;13936:18;;;13929:62;14008:18;;2226:68:0;13676:356:1;2226:68:0;2756:6:::1;::::0;2735:40:::1;::::0;2772:1:::1;::::0;2735:40:::1;2756:6;::::0;2735:40:::1;::::0;2772:1;;2735:40:::1;2786:6;:19:::0;;;::::1;::::0;;2665:148::o;29429:2292::-;25783:10;53267:18;53313:8;25762:57;;;;;;;22280:2:1;25762:57:0;;;22262:21:1;22319:2;22299:18;;;22292:30;22358:22;22338:18;;;22331:50;22398:18;;25762:57:0;22078:344:1;25762:57:0;25838:10;25852:9;25838:23;25830:62;;;;;;;22629:2:1;25830:62:0;;;22611:21:1;22668:2;22648:18;;;22641:30;22707:28;22687:18;;;22680:56;22753:18;;25830:62:0;22427:350:1;25830:62:0;4872:1:::1;5468:7;;:19:::0;5460:63:::1;;;::::0;::::1;::::0;;15650:2:1;5460:63:0::1;::::0;::::1;15632:21:1::0;15689:2;15669:18;;;15662:30;15728:33;15708:18;;;15701:61;15779:18;;5460:63:0::1;15448:355:1::0;5460:63:0::1;4872:1;5601:7;:18:::0;;;29606:26;;;29598:58:::2;;;::::0;::::2;::::0;;22984:2:1;29598:58:0::2;::::0;::::2;22966:21:1::0;23023:2;23003:18;;;22996:30;23062:21;23042:18;;;23035:49;23101:18;;29598:58:0::2;22782:343:1::0;29598:58:0::2;29700:29;::::0;29675:54;::::2;;29667:83;;;::::0;::::2;::::0;;23332:2:1;29667:83:0::2;::::0;::::2;23314:21:1::0;23371:2;23351:18;;;23344:30;23410:18;23390;;;23383:46;23446:18;;29667:83:0::2;23130:340:1::0;29667:83:0::2;29804:11;29771:22;::::0;;;:10:::2;:22;::::0;;;;:29;::::2;;:44;::::0;::::2;;;;;;:::i;:::-;;29763:76;;;::::0;::::2;::::0;;23677:2:1;29763:76:0::2;::::0;::::2;23659:21:1::0;23716:2;23696:18;;;23689:30;23755:21;23735:18;;;23728:49;23794:18;;29763:76:0::2;23475:343:1::0;29763:76:0::2;29876:22;::::0;;;:10:::2;:22;::::0;;;;:30:::2;;::::0;29858:15:::2;:48;29850:76;;;::::0;::::2;::::0;;24025:2:1;29850:76:0::2;::::0;::::2;24007:21:1::0;24064:2;24044:18;;;24037:30;24103:17;24083:18;;;24076:45;24138:18;;29850:76:0::2;23823:339:1::0;29850:76:0::2;29993:28;30073:22:::0;;;:10:::2;:22;::::0;;;;:38:::2;::::0;::::2;::::0;30126:40:::2;::::0;;::::2;::::0;30024:189:::2;::::0;30073:38;30181:14;30024:34:::2;:189::i;:::-;30276:9;::::0;29993:220;;-1:-1:-1;30276:84:0::2;::::0;:9;;::::2;;;30311:10;30332:4;29993:220:::0;30276:26:::2;:84::i;:::-;30444:22;::::0;;;:10:::2;:22;::::0;;;;:44:::2;;:68:::0;;30492:20;;30444:22;:68:::2;::::0;30492:20;;30444:68:::2;:::i;:::-;::::0;;;-1:-1:-1;30530:9:0::2;::::0;-1:-1:-1;30525:1109:0::2;30545:25:::0;;::::2;30525:1109;;;30592:23;30618:14;;30633:1;30618:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;30592:43:::0;-1:-1:-1;30690:15:0::2;30703:1;30697:2;30690:15;:::i;:::-;30671:34;::::0;:16;:34:::2;:::i;:::-;:44;::::0;30708:7:::2;30671:44;:::i;:::-;30652:63;;30759:7;30739:16;:27;;;;30738:62;;;;;30792:7;30772:16;:27;;;;30738:62;30730:88;;;::::0;::::2;::::0;;24530:2:1;30730:88:0::2;::::0;::::2;24512:21:1::0;24569:2;24549:18;;;24542:30;24608:15;24588:18;;;24581:43;24641:18;;30730:88:0::2;24328:337:1::0;30730:88:0::2;30835:38;::::0;;;:26:::2;:38;::::0;;;;;30879:21:::2;30898:2;30879:16:::0;:21:::2;:::i;:::-;30874:27;::::0;:1:::2;:27;:::i;:::-;30835:67;;::::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;30835:67:0;;;:69;;;::::2;::::0;::::2;:::i;:::-;::::0;;;-1:-1:-1;;30919:38:0::2;::::0;;;:26:::2;:38;::::0;;;;;30964:22:::2;30983:3;30964:16:::0;:22:::2;:::i;:::-;30958:29;::::0;:2:::2;:29;:::i;:::-;30919:69;;::::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;30919:69:0;;;:71;;;::::2;::::0;::::2;:::i;:::-;::::0;;;-1:-1:-1;;31005:38:0::2;::::0;;;:26:::2;:38;::::0;;;;;31051:23:::2;31070:4;31051:16:::0;:23:::2;:::i;:::-;31044:31;::::0;:3:::2;:31;:::i;:::-;31005:71;;::::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;31005:71:0;;;:73;;;::::2;::::0;::::2;:::i;:::-;::::0;;;-1:-1:-1;;31093:38:0::2;::::0;;;:26:::2;:38;::::0;;;;;31140:24:::2;31159:5;31140:16:::0;:24:::2;:::i;:::-;31132:33;::::0;:4:::2;:33;:::i;:::-;31093:73;;::::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;31093:73:0;;;:75;;;::::2;::::0;::::2;:::i;:::-;::::0;;;-1:-1:-1;;31183:38:0::2;::::0;;;:26:::2;:38;::::0;;;;;31231:25:::2;31250:6;31231:16:::0;:25:::2;:::i;:::-;31222:35;::::0;:5:::2;:35;:::i;:::-;31183:75;;::::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;31183:75:0;;;:77;;;::::2;::::0;::::2;:::i;:::-;::::0;;;-1:-1:-1;;31275:38:0::2;::::0;;;:26:::2;:38;::::0;;;;;31324:26:::2;31343:7;31324:16:::0;:26:::2;:::i;:::-;31314:37;::::0;:6:::2;:37;:::i;:::-;31275:77;;::::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;31275:77:0;;;:79;;;::::2;::::0;::::2;:::i;:::-;::::0;;;-1:-1:-1;;31398:10:0::2;31371:38;::::0;;;:26:::2;:38;::::0;;;;;;;:50;;;;;;;;31427:15:::2;::::0;;31371:72;;::::2;::::0;::::2;::::0;;;;;;;;;;::::2;::::0;;;;31488:53;;;;::::2;::::0;;::::2;::::0;;::::2;::::0;;;;::::2;::::0;;;31469:15;;31460:25;;:8:::2;:25:::0;;;;;;:81;;;;;;31371:38:::2;31460:81;::::0;::::2;::::0;;;;;::::2;::::0;;;;;;;::::2;::::0;;;31605:17;;;31427:15;31605:17:::2;::::0;::::2;:::i;:::-;;;;;;30577:1057;30572:3;;;;;:::i;:::-;;;;30525:1109;;;-1:-1:-1::0;31651:62:0::2;::::0;2842:25:1;;;31679:10:0;;31667::::2;::::0;31651:62:::2;::::0;2830:2:1;2815:18;31651:62:0::2;;;;;;;-1:-1:-1::0;;4828:1:0::1;5780:7;:22:::0;-1:-1:-1;;29429:2292:0:o;47740:702::-;47865:15;;47930:10;47913:14;47930:10;47990:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47990:20:0;;47958:52;;48021:28;48063:6;48052:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48052:18:0;;48021:49;;48088:9;48083:301;48107:6;48103:1;:10;48083:301;;;48154:8;:23;48163:10;;48174:1;48163:13;;;;;;;:::i;:::-;;;;;;;48154:23;;;;;;;;;;;:30;;;;;;;;;;;;48135:13;48149:1;48135:16;;;;;;;;:::i;:::-;:49;;;;:16;;;;;;;;;;;:49;48244:1;48203:8;48244:1;48212:10;;48223:1;48212:13;;;;;;;:::i;:::-;;;;;;;;;;48203:23;;-1:-1:-1;48203:23:0;;;;;;;;-1:-1:-1;48203:23:0;:29;;;;;;:43;48199:174;;48287:4;48267:14;48282:1;48267:17;;;;;;;;:::i;:::-;:24;;;:17;;;;;;;;;;;:24;48199:174;;;48352:5;48332:14;48347:1;48332:17;;;;;;;;:::i;:::-;:25;;;:17;;;;;;;;;;;:25;48199:174;48115:3;;;;:::i;:::-;;;;48083:301;;;-1:-1:-1;48404:13:0;;-1:-1:-1;48419:14:0;-1:-1:-1;;47740:702:0;;;;;;:::o;34177:465::-;2087:6;;;;26250:10;:21;;26249:58;;-1:-1:-1;26291:15:0;;;;26277:10;:29;26249:58;26241:92;;;;;;;15300:2:1;26241:92:0;;;15282:21:1;15339:2;15319:18;;;15312:30;15378:23;15358:18;;;15351:51;15419:18;;26241:92:0;15098:345:1;26241:92:0;4872:1:::1;5468:7;;:19:::0;5460:63:::1;;;::::0;::::1;::::0;;15650:2:1;5460:63:0::1;::::0;::::1;15632:21:1::0;15689:2;15669:18;;;15662:30;15728:33;15708:18;;;15701:61;15779:18;;5460:63:0::1;15448:355:1::0;5460:63:0::1;4872:1;5601:7;:18:::0;34322:11:::2;34289:22;::::0;;;:10:::2;:22;::::0;;;;:29;::::2;;:44;::::0;::::2;;;;;;:::i;:::-;;34281:73;;;::::0;::::2;::::0;;21595:2:1;34281:73:0::2;::::0;::::2;21577:21:1::0;21634:2;21614:18;;;21607:30;21673:18;21653;;;21646:46;21709:18;;34281:73:0::2;21393:340:1::0;34281:73:0::2;34391:22;::::0;;;:10:::2;:22;::::0;;;;:30:::2;;::::0;34373:15:::2;:48;34365:77;;;::::0;::::2;::::0;;24872:2:1;34365:77:0::2;::::0;::::2;24854:21:1::0;24911:2;24891:18;;;24884:30;24950:18;24930;;;24923:46;24986:18;;34365:77:0::2;24670:340:1::0;34365:77:0::2;34503:15;::::0;34453:22:::2;::::0;;;:10:::2;:22;::::0;;;;:47:::2;::::0;::::2;:65:::0;;;;34531:44;;34563:12:::2;::::0;34453:22;34531:44;::::2;::::0;34563:12;34531:44:::2;;;;;34606:10;34593:41;34618:15;;34593:41;;;;2842:25:1::0;;2830:2;2815:18;;2696:177;34593:41:0::2;;;;;;;;-1:-1:-1::0;4828:1:0::1;5780:7;:22:::0;34177:465::o;40237:2358::-;2087:6;;;;26250:10;:21;;26249:58;;-1:-1:-1;26291:15:0;;;;26277:10;:29;26249:58;26241:92;;;;;;;15300:2:1;26241:92:0;;;15282:21:1;15339:2;15319:18;;;15312:30;15378:23;15358:18;;;15351:51;15419:18;;26241:92:0;15098:345:1;26241:92:0;40516:16:::1;::::0;:21;;40515:84:::1;;-1:-1:-1::0;40582:16:0::1;40554;::::0;40543:28:::1;::::0;;;:10:::1;:28;::::0;;;;:35;::::1;;:55;::::0;::::1;;;;;;:::i;:::-;;40515:84;40493:159;;;::::0;::::1;::::0;;25217:2:1;40493:159:0::1;::::0;::::1;25199:21:1::0;25256:2;25236:18;;;25229:30;25295:27;25275:18;;;25268:55;25340:18;;40493:159:0::1;25015:349:1::0;40493:159:0::1;24068:9;40689:26;40700:15;40689:8:::0;:26:::1;:::i;:::-;40688:49;40687:106;;;;-1:-1:-1::0;24164:19:0::1;40744:26;40755:15;40744:8:::0;:26:::1;:::i;:::-;40743:49;40687:106;40665:187;;;::::0;::::1;::::0;;25571:2:1;40665:187:0::1;::::0;::::1;25553:21:1::0;25610:2;25590:18;;;25583:30;25649:33;25629:18;;;25622:61;25700:18;;40665:187:0::1;25369:355:1::0;40665:187:0::1;24013:3;41049:16;:40;;41041:77;;;::::0;::::1;::::0;;25931:2:1;41041:77:0::1;::::0;::::1;25913:21:1::0;25970:2;25950:18;;;25943:30;26009:26;25989:18;;;25982:54;26053:18;;41041:77:0::1;25729:348:1::0;41041:77:0::1;24244:4;41137:12;:32;;41129:66;;;::::0;::::1;::::0;;26284:2:1;41129:66:0::1;::::0;::::1;26266:21:1::0;26323:2;26303:18;;;26296:30;26362:23;26342:18;;;26335:51;26403:18;;41129:66:0::1;26082:345:1::0;41129:66:0::1;41431:20:::0;;::::1;;41391::::0;;::::1;;41351::::0;;::::1;;41311::::0;;::::1;;41231:60;41431:20;41271::::0;::::1;;41231::::0;::::1;:60;:::i;:::-;:100;;;;:::i;:::-;:140;;;;:::i;:::-;:180;;;;:::i;:::-;:220;;;;:::i;:::-;41456:5;41230:231;41208:305;;;::::0;::::1;::::0;;26634:2:1;41208:305:0::1;::::0;::::1;26616:21:1::0;26673:2;26653:18;;;26646:30;26712:26;26692:18;;;26685:54;26756:18;;41208:305:0::1;26432:348:1::0;41208:305:0::1;41526:16;:18:::0;;;:16:::1;:18;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;41588:726:0::1;::::0;;::::1;::::0;::::1;::::0;;;;41619:11:::1;41588:726;;;;41656:15;41588:726;;;;41695:8;41588:726;;;;41737:18;41588:726;;;;41787:16;41588:726;;;;41836:17;41588:726;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;-1:-1:-1;41588:726:0;;;-1:-1:-1;;41588:726:0::1;::::0;;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42137:15:::1;::::0;41588:726;;;;;;;;;;;;;42246:27:::1;::::0;41588:726;;;;;;;;;;;41568:16:::1;::::0;41557:28;;:10:::1;:28:::0;;;:757;;;;:28;;:757;::::1;::::0;;::::1;::::0;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;41557:757:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;;:::i;:::-;-1:-1:-1::0;41557:757:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;;:::i;:::-;-1:-1:-1::0;41557:757:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;;:::i;:::-;-1:-1:-1::0;41557:757:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;42358:16:::1;::::0;42475:15:::1;::::0;42505:27:::1;::::0;42332:211:::1;::::0;;42389:15:::1;27044:25:1::0;;27100:2;27085:18;;27078:34;;;27128:18;;;27121:34;;;27186:2;27171:18;;27164:34;;;;27229:3;27214:19;;27207:35;42332:211:0::1;::::0;27031:3:1;27016:19;42332:211:0::1;;;;;;;-1:-1:-1::0;;42586:1:0::1;42556:27;:31:::0;-1:-1:-1;;;40237:2358:0:o;43220:682::-;2087:6;;2234:23;2087:6;737:10;2234:23;2226:68;;;;;;;13878:2:1;2226:68:0;;;13860:21:1;;;13897:18;;;13890:30;13956:34;13936:18;;;13929:62;14008:18;;2226:68:0;13676:356:1;2226:68:0;43317:16:::1;::::0;:21;;43316:84:::1;;-1:-1:-1::0;43383:16:0::1;43355;::::0;43344:28:::1;::::0;;;:10:::1;:28;::::0;;;;:35;::::1;;:55;::::0;::::1;;;;;;:::i;:::-;;43316:84;43294:186;;;::::0;::::1;::::0;;27455:2:1;43294:186:0::1;::::0;::::1;27437:21:1::0;27494:2;27474:18;;;27467:30;27533:34;27513:18;;;27506:62;27604:22;27584:18;;;27577:50;27644:19;;43294:186:0::1;27253:416:1::0;43294:186:0::1;43556:16;::::0;43528::::1;::::0;43517:28:::1;::::0;;;:10:::1;:28;::::0;;;;:36:::1;;::::0;:55:::1;::::0;43556:16;43517:55:::1;:::i;:::-;43499:15;:73;43491:104;;;::::0;::::1;::::0;;27876:2:1;43491:104:0::1;::::0;::::1;27858:21:1::0;27915:2;27895:18;;;27888:30;27954:20;27934:18;;;27927:48;27992:18;;43491:104:0::1;27674:342:1::0;43491:104:0::1;43612:15;::::0;;;::::1;;;43608:228;;;43690:8;::::0;43644:22:::1;::::0;43669:18:::1;43684:3;43669:12:::0;:18:::1;:::i;:::-;:29;;;;:::i;:::-;43644:54:::0;-1:-1:-1;43728:29:0::1;43644:54:::0;43728:12;:29:::1;:::i;:::-;43795:12;::::0;43772:9:::1;::::0;43713:44;;-1:-1:-1;43772:52:0::1;::::0;:9;;::::1;43795:12;43772:9:::0;;::::1;::::0;43795:12:::1;43809:14:::0;43772:22:::1;:52::i;:::-;43629:207;43608:228;43846:9;::::0;:48:::1;::::0;:9;;::::1;;;43869:10;43881:12:::0;43846:22:::1;:48::i;:::-;43220:682:::0;:::o;46720:458::-;46892:7;24013:3;46920:16;:40;;46912:84;;;;;;;28223:2:1;46912:84:0;;;28205:21:1;28262:2;28242:18;;;28235:30;28301:33;28281:18;;;28274:61;28352:18;;46912:84:0;28021:355:1;46912:84:0;47015:14;47033:1;47015:19;47007:61;;;;;;;28583:2:1;47007:61:0;;;28565:21:1;28622:2;28602:18;;;28595:30;28661:31;28641:18;;;28634:59;28710:18;;47007:61:0;28381:353:1;47007:61:0;47088:82;47123:16;47141:12;47155:14;47088:34;:82::i;32007:2042::-;25783:10;53267:18;53313:8;25762:57;;;;;;;22280:2:1;25762:57:0;;;22262:21:1;22319:2;22299:18;;;22292:30;22358:22;22338:18;;;22331:50;22398:18;;25762:57:0;22078:344:1;25762:57:0;25838:10;25852:9;25838:23;25830:62;;;;;;;22629:2:1;25830:62:0;;;22611:21:1;22668:2;22648:18;;;22641:30;22707:28;22687:18;;;22680:56;22753:18;;25830:62:0;22427:350:1;25830:62:0;4872:1:::1;5468:7;;:19:::0;5460:63:::1;;;::::0;::::1;::::0;;15650:2:1;5460:63:0::1;::::0;::::1;15632:21:1::0;15689:2;15669:18;;;15662:30;15728:33;15708:18;;;15701:61;15779:18;;5460:63:0::1;15448:355:1::0;5460:63:0::1;4872:1;5601:7;:18:::0;32205:37;;::::2;32197:65;;;::::0;::::2;::::0;;28941:2:1;32197:65:0::2;::::0;::::2;28923:21:1::0;28980:2;28960:18;;;28953:30;29019:17;28999:18;;;28992:45;29054:18;;32197:65:0::2;28739:339:1::0;32197:65:0::2;32302:1;32281:22:::0;;;32273:52:::2;;;::::0;::::2;::::0;;29285:2:1;32273:52:0::2;::::0;::::2;29267:21:1::0;29324:2;29304:18;;;29297:30;29363:19;29343:18;;;29336:47;29400:18;;32273:52:0::2;29083:341:1::0;32273:52:0::2;32365:29;::::0;32344:50;::::2;;32336:79;;;::::0;::::2;::::0;;23332:2:1;32336:79:0::2;::::0;::::2;23314:21:1::0;23371:2;23351:18;;;23344:30;23410:18;23390;;;23383:46;23446:18;;32336:79:0::2;23130:340:1::0;32336:79:0::2;32467:16;32434:22;::::0;;;:10:::2;:22;::::0;;;;:29;::::2;;:49;::::0;::::2;;;;;;:::i;:::-;;32426:83;;;::::0;::::2;::::0;;29631:2:1;32426:83:0::2;::::0;::::2;29613:21:1::0;29670:2;29650:18;;;29643:30;29709:23;29689:18;;;29682:51;29750:18;;32426:83:0::2;29429:345:1::0;32426:83:0::2;32573:30;::::0;32616:1217:::2;32636:21:::0;;::::2;32616:1217;;;32702:1;32687:9;;32697:1;32687:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:16;;;32679:49;;;::::0;::::2;::::0;;29981:2:1;32679:49:0::2;::::0;::::2;29963:21:1::0;30020:2;30000:18;;;29993:30;30059:22;30039:18;;;30032:50;30099:18;;32679:49:0::2;29779:344:1::0;32679:49:0::2;32772:20;32795:10;;32806:1;32795:13;;;;;;;:::i;:::-;;;;;;;32772:36;;32883:12;32833:10;:22;32844:10;32833:22;;;;;;;;;;;:47;;;:62;32825:92;;;::::0;::::2;::::0;;30330:2:1;32825:92:0::2;::::0;::::2;30312:21:1::0;30369:2;30349:18;;;30342:30;30408:19;30388:18;;;30381:47;30445:18;;32825:92:0::2;30128:341:1::0;32825:92:0::2;32940:22;::::0;;;:10:::2;:22;::::0;;;;:36:::2;;::::0;:52;-1:-1:-1;32940:52:0::2;32932:81;;;::::0;::::2;::::0;;30676:2:1;32932:81:0::2;::::0;::::2;30658:21:1::0;30715:2;30695:18;;;30688:30;30754:18;30734;;;30727:46;30790:18;;32932:81:0::2;30474:340:1::0;32932:81:0::2;33050:22;::::0;;;:8:::2;:22;::::0;;;;:28;;;::::2;;;33036:10;:42;33028:68;;;::::0;::::2;::::0;;31021:2:1;33028:68:0::2;::::0;::::2;31003:21:1::0;31060:2;31040:18;;;31033:30;31099:15;31079:18;;;31072:43;31132:18;;33028:68:0::2;30819:337:1::0;33028:68:0::2;33214:1;33175:22:::0;;;:8:::2;:22;::::0;;;;:41;;;::::2;::::0;;33261:68:::2;33290:10:::0;33184:12;33316:9;;33326:1;33316:12;;::::2;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;33261:28;:68::i;:::-;33233:96;;33413:17;33434:1;33413:22:::0;33405:60:::2;;;::::0;::::2;::::0;;31363:2:1;33405:60:0::2;::::0;::::2;31345:21:1::0;31402:2;31382:18;;;31375:30;31441:27;31421:18;;;31414:55;31486:18;;33405:60:0::2;31161:349:1::0;33405:60:0::2;33486:9;;33496:1;33486:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:17;;33502:1;33486:17;33482:231;;33554:72;33583:10;33595:12;33609:9;;33619:1;33609:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:16;::::0;33624:1:::2;33609:16;:::i;33554:72::-;:77:::0;33524:173:::2;;;::::0;::::2;::::0;;31717:2:1;33524:173:0::2;::::0;::::2;31699:21:1::0;31756:2;31736:18;;;31729:30;31795:24;31775:18;;;31768:52;31837:18;;33524:173:0::2;31515:346:1::0;33524:173:0::2;33778:43;33804:17:::0;33778:43;::::2;:::i;:::-;;;32664:1169;;32659:3;;;;;:::i;:::-;;;;32616:1217;;;-1:-1:-1::0;33886:9:0::2;::::0;:58:::2;::::0;:9;;::::2;;;33909:10;33921:22:::0;33886::::2;:58::i;:::-;33962:79;::::0;;32040:25:1;;;32096:2;32081:18;;32074:34;;;34011:10:0;;33975::::2;::::0;33962:79:::2;::::0;32013:18:1;33962:79:0::2;;;;;;;-1:-1:-1::0;;4828:1:0::1;5780:7;:22:::0;-1:-1:-1;;;;32007:2042:0:o;45575:670::-;2087:6;;2234:23;2087:6;737:10;2234:23;2226:68;;;;;;;13878:2:1;2226:68:0;;;13860:21:1;;;13897:18;;;13890:30;13956:34;13936:18;;;13929:62;14008:18;;2226:68:0;13676:356:1;2226:68:0;45777:30:::1;::::0;::::1;45769:65;;;::::0;::::1;::::0;;32321:2:1;45769:65:0::1;::::0;::::1;32303:21:1::0;32360:2;32340:18;;;32333:30;32399:24;32379:18;;;32372:52;32441:18;;45769:65:0::1;32119:346:1::0;45769:65:0::1;45853:30;::::0;::::1;45845:65;;;::::0;::::1;::::0;;32321:2:1;45845:65:0::1;::::0;::::1;32303:21:1::0;32360:2;32340:18;;;32333:30;32399:24;32379:18;;;32372:52;32441:18;;45845:65:0::1;32119:346:1::0;45845:65:0::1;45929:30;::::0;::::1;45921:65;;;::::0;::::1;::::0;;32321:2:1;45921:65:0::1;::::0;::::1;32303:21:1::0;32360:2;32340:18;;;32333:30;32399:24;32379:18;;;32372:52;32441:18;;45921:65:0::1;32119:346:1::0;45921:65:0::1;45999:15;:34:::0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;46044:15:::1;:34:::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;46089:15:::1;:34:::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;46141:96:::1;::::0;;32733:34:1;;;32798:2;32783:18;;32776:43;;;;32835:18;;;32828:43;46141:96:0::1;::::0;32660:2:1;32645:18;46141:96:0::1;;;;;;;45575:670:::0;;;:::o;44591:360::-;2087:6;;2234:23;2087:6;737:10;2234:23;2226:68;;;;;;;13878:2:1;2226:68:0;;;13860:21:1;;;13897:18;;;13890:30;13956:34;13936:18;;;13929:62;14008:18;;2226:68:0;13676:356:1;2226:68:0;44778:21:::1;44753;:46;;44745:86;;;::::0;::::1;::::0;;33084:2:1;44745:86:0::1;::::0;::::1;33066:21:1::0;33123:2;33103:18;;;33096:30;33162:29;33142:18;;;33135:57;33209:18;;44745:86:0::1;32882:351:1::0;44745:86:0::1;44844:20;:44:::0;;;;44899:20:::1;:44:::0;44591:360::o;2968:244::-;2087:6;;2234:23;2087:6;737:10;2234:23;2226:68;;;;;;;13878:2:1;2226:68:0;;;13860:21:1;;;13897:18;;;13890:30;13956:34;13936:18;;;13929:62;14008:18;;2226:68:0;13676:356:1;2226:68:0;3057:22:::1;::::0;::::1;3049:73;;;::::0;::::1;::::0;;33440:2:1;3049:73:0::1;::::0;::::1;33422:21:1::0;33479:2;33459:18;;;33452:30;33518:34;33498:18;;;33491:62;33589:8;33569:18;;;33562:36;33615:19;;3049:73:0::1;33238:402:1::0;3049:73:0::1;3159:6;::::0;3138:38:::1;::::0;::::1;::::0;;::::1;::::0;3159:6:::1;::::0;3138:38:::1;::::0;3159:6:::1;::::0;3138:38:::1;3187:6;:17:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;2968:244::o;46253:222::-;2087:6;;2234:23;2087:6;737:10;2234:23;2226:68;;;;;;;13878:2:1;2226:68:0;;;13860:21:1;;;13897:18;;;13890:30;13956:34;13936:18;;;13929:62;14008:18;;2226:68:0;13676:356:1;2226:68:0;46363:30:::1;::::0;::::1;46355:65;;;::::0;::::1;::::0;;32321:2:1;46355:65:0::1;::::0;::::1;32303:21:1::0;32360:2;32340:18;;;32333:30;32399:24;32379:18;;;32372:52;32441:18;;46355:65:0::1;32119:346:1::0;46355:65:0::1;46433:15;:34:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;46253:222::o;17270:211::-;17414:58;;20945:42:1;20933:55;;17414:58:0;;;20915:74:1;21005:18;;;20998:34;;;17387:86:0;;17407:5;;17437:23;;20888:18:1;;17414:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17387:19;:86::i;:::-;17270:211;;;:::o;51431:1032::-;51582:7;51674:22;;;:10;:22;;;;;;;;:34;;;51817:19;;;:8;:19;;;;;:26;51674:34;;;;;51817:26;51582:7;52053:12;:8;51674:34;52053:12;:::i;:::-;52040:26;;52047:2;52040:26;:::i;:::-;52017:50;;:19;:50;:::i;:::-;51972:28;;;;;;;;:18;:28;;;;;;:96;;;:28;:96;:::i;:::-;51938:130;-1:-1:-1;52081:28:0;52171:12;:8;52182:1;52171:12;:::i;:::-;52158:26;;52165:2;52158:26;:::i;:::-;52144:41;;:10;:41;:::i;:::-;52112:28;;;;;;;;:18;:28;;;;;;:74;;;:28;:74;:::i;:::-;52081:105;;52311:21;52283:49;;:24;:49;;;52279:177;;52356:22;;;;:10;:22;;;;;:37;;:47;;;;;;;;;;:::i;:::-;;;52349:54;;;;;;;;52279:177;52443:1;52436:8;;;;;;;;17489:248;17660:68;;33857:42:1;33926:15;;;17660:68:0;;;33908:34:1;33978:15;;33958:18;;;33951:43;34010:18;;;34003:34;;;17633:96:0;;17653:5;;17683:27;;33820:18:1;;17660:68:0;33645:398:1;17633:96:0;17489:248;;;;:::o;52760:300::-;52933:7;53036:16;53017:14;52994:20;53036:16;53013:1;52994:20;:::i;:::-;:37;;;;:::i;:::-;52961:29;52976:14;52961:12;:29;:::i;:::-;:71;;;;:::i;:::-;52960:92;;;;:::i;19897:774::-;20321:23;20347:69;20375:4;20347:69;;;;;;;;;;;;;;;;;20355:5;20347:27;;;;:69;;;;;:::i;:::-;20431:17;;20321:95;;-1:-1:-1;20431:21:0;20427:237;;20586:10;20575:30;;;;;;;;;;;;:::i;:::-;20567:85;;;;;;;34500:2:1;20567:85:0;;;34482:21:1;34539:2;34519:18;;;34512:30;34578:34;34558:18;;;34551:62;34649:12;34629:18;;;34622:40;34679:19;;20567:85:0;34298:406:1;12189:229:0;12326:12;12358:52;12380:6;12388:4;12394:1;12397:12;12326;53267:18;;13596:60;;;;;;;35318:2:1;13596:60:0;;;35300:21:1;35357:2;35337:18;;;35330:30;35396:31;35376:18;;;35369:59;35445:18;;13596:60:0;35116:353:1;13596:60:0;13730:12;13744:23;13771:6;:11;;13790:5;13797:4;13771:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13729:73;;;;13820:52;13838:7;13847:10;13859:12;13820:17;:52::i;:::-;13813:59;13309:571;-1:-1:-1;;;;;;;13309:571:0:o;15958:777::-;16108:12;16137:7;16133:595;;;-1:-1:-1;16168:10:0;16161:17;;16133:595;16282:17;;:21;16278:439;;16545:10;16539:17;16606:15;16593:10;16589:2;16585:19;16578:44;16278:439;16688:12;16681:20;;;;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:196:1;82:20;;142:42;131:54;;121:65;;111:93;;200:1;197;190:12;111:93;14:196;;;:::o;215:391::-;301:6;309;317;325;378:3;366:9;357:7;353:23;349:33;346:53;;;395:1;392;385:12;346:53;418:29;437:9;418:29;:::i;:::-;408:39;494:2;479:18;;466:32;;-1:-1:-1;545:2:1;530:18;;517:32;;596:2;581:18;568:32;;-1:-1:-1;215:391:1;-1:-1:-1;;;215:391:1:o;710:451::-;762:3;800:5;794:12;827:6;822:3;815:19;853:4;882:2;877:3;873:12;866:19;;919:2;912:5;908:14;940:1;950:186;964:6;961:1;958:13;950:186;;;1029:13;;1044:10;1025:30;1013:43;;1076:12;;;;1111:15;;;;986:1;979:9;950:186;;;-1:-1:-1;1152:3:1;;710:451;-1:-1:-1;;;;;710:451:1:o;1166:448::-;1216:3;1254:5;1248:12;1281:6;1276:3;1269:19;1307:4;1336:2;1331:3;1327:12;1320:19;;1373:2;1366:5;1362:14;1394:1;1404:185;1418:6;1415:1;1412:13;1404:185;;;1493:13;;1486:21;1479:29;1467:42;;1529:12;;;;1564:15;;;;1440:1;1433:9;1404:185;;1619:1072;1985:3;1998:22;;;2069:13;;1970:19;;;2091:22;;;1937:4;;2167;;2144:3;2129:19;;;2194:15;;;1937:4;2237:169;2251:6;2248:1;2245:13;2237:169;;;2312:13;;2300:26;;2346:12;;;;2381:15;;;;2273:1;2266:9;2237:169;;;2241:3;;;2451:9;2446:3;2442:19;2437:2;2426:9;2422:18;2415:47;2485:40;2521:3;2513:6;2485:40;:::i;:::-;2471:54;;;2573:9;2565:6;2561:22;2556:2;2545:9;2541:18;2534:50;2601:41;2635:6;2627;2601:41;:::i;:::-;2593:49;;;2678:6;2673:2;2662:9;2658:18;2651:34;1619:1072;;;;;;;:::o;2878:186::-;2937:6;2990:2;2978:9;2969:7;2965:23;2961:32;2958:52;;;3006:1;3003;2996:12;2958:52;3029:29;3048:9;3029:29;:::i;3300:118::-;3386:5;3379:13;3372:21;3365:5;3362:32;3352:60;;3408:1;3405;3398:12;3423:241;3479:6;3532:2;3520:9;3511:7;3507:23;3503:32;3500:52;;;3548:1;3545;3538:12;3500:52;3587:9;3574:23;3606:28;3628:5;3606:28;:::i;3669:163::-;3736:20;;3796:10;3785:22;;3775:33;;3765:61;;3822:1;3819;3812:12;3837:184;3895:6;3948:2;3936:9;3927:7;3923:23;3919:32;3916:52;;;3964:1;3961;3954:12;3916:52;3987:28;4005:9;3987:28;:::i;4026:377::-;4100:6;4108;4116;4169:2;4157:9;4148:7;4144:23;4140:32;4137:52;;;4185:1;4182;4175:12;4137:52;4221:9;4208:23;4198:33;;4278:2;4267:9;4263:18;4250:32;4240:42;;4332:2;4321:9;4317:18;4304:32;4345:28;4367:5;4345:28;:::i;:::-;4392:5;4382:15;;;4026:377;;;;;:::o;4408:180::-;4467:6;4520:2;4508:9;4499:7;4495:23;4491:32;4488:52;;;4536:1;4533;4526:12;4488:52;-1:-1:-1;4559:23:1;;4408:180;-1:-1:-1;4408:180:1:o;4593:184::-;4645:77;4642:1;4635:88;4742:4;4739:1;4732:15;4766:4;4763:1;4756:15;4782:291;4860:1;4853:5;4850:12;4840:200;;4896:77;4893:1;4886:88;4997:4;4994:1;4987:15;5025:4;5022:1;5015:15;4840:200;5049:18;;4782:291::o;5078:326::-;5171:5;5194:1;5204:194;5218:4;5215:1;5212:11;5204:194;;;5277:13;;5265:26;;5314:4;5338:12;;;;5373:15;;;;5238:1;5231:9;5204:194;;5409:1325;5549:4;5591:3;5580:9;5576:19;5568:27;;5604:48;5642:9;5633:6;5627:13;5604:48;:::i;:::-;5708:4;5700:6;5696:17;5690:24;5683:4;5672:9;5668:20;5661:54;5771:4;5763:6;5759:17;5753:24;5746:4;5735:9;5731:20;5724:54;5834:4;5826:6;5822:17;5816:24;5809:4;5798:9;5794:20;5787:54;5897:4;5889:6;5885:17;5879:24;5872:4;5861:9;5857:20;5850:54;5951:4;5943:6;5939:17;5933:24;5966:60;6020:4;6009:9;6005:20;5991:12;5966:60;:::i;:::-;;6063:4;6055:6;6051:17;6045:24;6088:6;6130:2;6125;6114:9;6110:18;6103:30;6182:4;6174:6;6170:17;6164:24;6142:46;;6207:6;6222:60;6278:2;6267:9;6263:18;6247:14;6222:60;:::i;:::-;6331:6;6323;6319:19;6313:26;6291:48;;6348:64;6404:6;6393:9;6389:22;6373:14;6348:64;:::i;:::-;6470:6;6458:19;;6452:26;6443:6;6428:22;;6421:58;6537:6;6525:19;;6519:26;6510:6;6495:22;;6488:58;6592:15;;;6586:22;6577:6;6562:22;;6555:54;6646:15;;6640:22;687:10;676:22;;6720:6;6705:22;;664:35;6640:22;-1:-1:-1;6671:57:1;;5409:1325;;;;:::o;6739:320::-;6815:6;6823;6831;6884:2;6872:9;6863:7;6859:23;6855:32;6852:52;;;6900:1;6897;6890:12;6852:52;6936:9;6923:23;6913:33;;6993:2;6982:9;6978:18;6965:32;6955:42;;7016:37;7049:2;7038:9;7034:18;7016:37;:::i;:::-;7006:47;;6739:320;;;;;:::o;7064:254::-;7132:6;7140;7193:2;7181:9;7172:7;7168:23;7164:32;7161:52;;;7209:1;7206;7199:12;7161:52;7232:29;7251:9;7232:29;:::i;:::-;7222:39;7308:2;7293:18;;;;7280:32;;-1:-1:-1;;;7064:254:1:o;7323:248::-;7391:6;7399;7452:2;7440:9;7431:7;7427:23;7423:32;7420:52;;;7468:1;7465;7458:12;7420:52;-1:-1:-1;;7491:23:1;;;7561:2;7546:18;;;7533:32;;-1:-1:-1;7323:248:1:o;7576:366::-;7638:8;7648:6;7702:3;7695:4;7687:6;7683:17;7679:27;7669:55;;7720:1;7717;7710:12;7669:55;-1:-1:-1;7743:20:1;;7786:18;7775:30;;7772:50;;;7818:1;7815;7808:12;7772:50;7855:4;7847:6;7843:17;7831:29;;7915:3;7908:4;7898:6;7895:1;7891:14;7883:6;7879:27;7875:38;7872:47;7869:67;;;7932:1;7929;7922:12;7947:503;8041:6;8049;8057;8110:2;8098:9;8089:7;8085:23;8081:32;8078:52;;;8126:1;8123;8116:12;8078:52;8162:9;8149:23;8139:33;;8223:2;8212:9;8208:18;8195:32;8250:18;8242:6;8239:30;8236:50;;;8282:1;8279;8272:12;8236:50;8321:69;8382:7;8373:6;8362:9;8358:22;8321:69;:::i;:::-;7947:503;;8409:8;;-1:-1:-1;8295:95:1;;-1:-1:-1;;;;7947:503:1:o;8700:436::-;8786:6;8794;8847:2;8835:9;8826:7;8822:23;8818:32;8815:52;;;8863:1;8860;8853:12;8815:52;8903:9;8890:23;8936:18;8928:6;8925:30;8922:50;;;8968:1;8965;8958:12;8922:50;9007:69;9068:7;9059:6;9048:9;9044:22;9007:69;:::i;:::-;9095:8;;8981:95;;-1:-1:-1;8700:436:1;-1:-1:-1;;;;8700:436:1:o;9141:453::-;9390:2;9379:9;9372:21;9353:4;9416:55;9467:2;9456:9;9452:18;9444:6;9416:55;:::i;:::-;9519:9;9511:6;9507:22;9502:2;9491:9;9487:18;9480:50;9547:41;9581:6;9573;9547:41;:::i;:::-;9539:49;9141:453;-1:-1:-1;;;;;9141:453:1:o;9599:530::-;9719:6;9727;9735;9743;9751;9804:3;9792:9;9783:7;9779:23;9775:33;9772:53;;;9821:1;9818;9811:12;9772:53;9857:9;9844:23;9834:33;;9914:2;9903:9;9899:18;9886:32;9876:42;;9965:2;9954:9;9950:18;9937:32;9927:42;;10003:3;9992:9;9988:19;10026:7;10022:2;10019:15;10016:35;;;10047:1;10044;10037:12;10016:35;9599:530;;;;-1:-1:-1;9599:530:1;;10085:2;10070:18;;10107:16;;9599:530;-1:-1:-1;;9599:530:1:o;10134:316::-;10211:6;10219;10227;10280:2;10268:9;10259:7;10255:23;10251:32;10248:52;;;10296:1;10293;10286:12;10248:52;-1:-1:-1;;10319:23:1;;;10389:2;10374:18;;10361:32;;-1:-1:-1;10440:2:1;10425:18;;;10412:32;;10134:316;-1:-1:-1;10134:316:1:o;10455:838::-;10585:6;10593;10601;10609;10617;10670:2;10658:9;10649:7;10645:23;10641:32;10638:52;;;10686:1;10683;10676:12;10638:52;10722:9;10709:23;10699:33;;10783:2;10772:9;10768:18;10755:32;10806:18;10847:2;10839:6;10836:14;10833:34;;;10863:1;10860;10853:12;10833:34;10902:69;10963:7;10954:6;10943:9;10939:22;10902:69;:::i;:::-;10990:8;;-1:-1:-1;10876:95:1;-1:-1:-1;11078:2:1;11063:18;;11050:32;;-1:-1:-1;11094:16:1;;;11091:36;;;11123:1;11120;11113:12;11091:36;;11162:71;11225:7;11214:8;11203:9;11199:24;11162:71;:::i;:::-;10455:838;;;;-1:-1:-1;10455:838:1;;-1:-1:-1;11252:8:1;;11136:97;10455:838;-1:-1:-1;;;10455:838:1:o;11495:334::-;11572:6;11580;11588;11641:2;11629:9;11620:7;11616:23;11612:32;11609:52;;;11657:1;11654;11647:12;11609:52;11680:29;11699:9;11680:29;:::i;:::-;11670:39;;11728:38;11762:2;11751:9;11747:18;11728:38;:::i;:::-;11718:48;;11785:38;11819:2;11808:9;11804:18;11785:38;:::i;11834:184::-;11886:77;11883:1;11876:88;11983:4;11980:1;11973:15;12007:4;12004:1;11997:15;12023:128;12090:9;;;12111:11;;;12108:37;;;12125:18;;:::i;:::-;12023:128;;;;:::o;12156:184::-;12208:77;12205:1;12198:88;12305:4;12302:1;12295:15;12329:4;12326:1;12319:15;12345:125;12410:9;;;12431:10;;;12428:36;;;12444:18;;:::i;12475:184::-;12527:77;12524:1;12517:88;12624:4;12621:1;12614:15;12648:4;12645:1;12638:15;12664:195;12703:3;12734:66;12727:5;12724:77;12721:103;;12804:18;;:::i;:::-;-1:-1:-1;12851:1:1;12840:13;;12664:195::o;16154:168::-;16227:9;;;16258;;16275:15;;;16269:22;;16255:37;16245:71;;16296:18;;:::i;16327:184::-;16379:77;16376:1;16369:88;16476:4;16473:1;16466:15;16500:4;16497:1;16490:15;16516:120;16556:1;16582;16572:35;;16587:18;;:::i;:::-;-1:-1:-1;16621:9:1;;16516:120::o;17654:112::-;17686:1;17712;17702:35;;17717:18;;:::i;:::-;-1:-1:-1;17751:9:1;;17654:112::o;17771:175::-;17839:10;17882;;;17870;;;17866:27;;17905:12;;;17902:38;;;17920:18;;:::i;17951:172::-;18018:10;18048;;;18060;;;18044:27;;18083:11;;;18080:37;;;18097:18;;:::i;18128:426::-;18217:1;18260:5;18217:1;18274:274;18295:7;18285:8;18282:21;18274:274;;;18358:4;18346:10;18342:21;18336:4;18333:31;18330:57;;;18367:18;;:::i;:::-;18417:7;18407:8;18403:22;18400:55;;;18437:16;;;;18400:55;18516:22;;;;18476:15;;;;18274:274;;;18278:3;18128:426;;;;;:::o;18559:930::-;18608:5;18638:8;18628:80;;-1:-1:-1;18679:1:1;18693:5;;18628:80;18727:4;18717:76;;-1:-1:-1;18764:1:1;18778:5;;18717:76;18809:4;18827:1;18822:59;;;;18895:1;18890:190;;;;18802:278;;18822:59;18852:1;18843:10;;18866:5;;;18890:190;18927:3;18917:8;18914:17;18911:43;;;18934:18;;:::i;:::-;18990:1;18980:8;18976:16;18967:25;;19018:10;19011:5;19008:21;19005:47;;;19032:18;;:::i;:::-;19065:5;;;18802:278;;19164:2;19154:8;19151:16;19145:3;19139:4;19136:13;19132:36;19126:2;19116:8;19113:16;19108:2;19102:4;19099:12;19095:35;19092:77;19089:219;;;-1:-1:-1;19201:19:1;;;19246:10;19236:21;;19233:47;;;19260:18;;:::i;:::-;19293:5;;19089:219;19340:34;19365:8;19359:4;19340:34;:::i;:::-;19414:6;19402:10;19398:23;19389:7;19386:36;19383:62;;;19425:18;;:::i;:::-;19463:20;;18559:930;-1:-1:-1;;;18559:930:1:o;19494:176::-;19552:5;19582:10;19610:54;19660:2;19650:8;19646:17;19641:2;19635:4;19631:13;19610:54;:::i;:::-;19601:63;19494:176;-1:-1:-1;;;;19494:176:1:o;19675:183::-;19706:1;19732:10;19769:2;19766:1;19762:10;19791:3;19781:37;;19798:18;;:::i;:::-;19836:10;;19832:20;;;;;19675:183;-1:-1:-1;;19675:183:1:o;19863:201::-;19901:3;19929:10;19974:2;19967:5;19963:14;20001:2;19992:7;19989:15;19986:41;;20007:18;;:::i;:::-;20056:1;20043:15;;19863:201;-1:-1:-1;;;19863:201:1:o;24167:156::-;24224:5;24253:64;24311:4;24301:8;24297:19;24284:10;24278:4;24274:21;24253:64;:::i;34048:245::-;34115:6;34168:2;34156:9;34147:7;34143:23;34139:32;34136:52;;;34184:1;34181;34174:12;34136:52;34216:9;34210:16;34235:28;34257:5;34235:28;:::i;35474:250::-;35559:1;35569:113;35583:6;35580:1;35577:13;35569:113;;;35659:11;;;35653:18;35640:11;;;35633:39;35605:2;35598:10;35569:113;;;-1:-1:-1;;35716:1:1;35698:16;;35691:27;35474:250::o;35729:287::-;35858:3;35896:6;35890:13;35912:66;35971:6;35966:3;35959:4;35951:6;35947:17;35912:66;:::i;:::-;35994:16;;;;;35729:287;-1:-1:-1;;35729:287:1:o;36021:455::-;36170:2;36159:9;36152:21;36133:4;36202:6;36196:13;36245:6;36240:2;36229:9;36225:18;36218:34;36261:79;36333:6;36328:2;36317:9;36313:18;36308:2;36300:6;36296:15;36261:79;:::i;:::-;36392:2;36380:15;36397:66;36376:88;36361:104;;;;36467:2;36357:113;;36021:455;-1:-1:-1;;36021:455:1:o
Swarm Source
ipfs://6fc0717c142118d6284405804f9a984dc977ef66aa130f613dacbbd6db7276bb
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.