Everyday giveaways up to 8.88BTC, Lucky Spins. Deposit BONUS 300% and Cashbacks!
5000+ Slots & Live Casino Games, 50+cryptos. Register with BscScan and get 760% deposit bonus. Win Big$, withdraw it fast.
Join Pasino and get the daily chance to win US$100k and 0.5 BTC
5000+ Slots, Live casino games, 50+ cryptos, 100% bet insurance. Register with Bscscan and get 240% first deposit bonus.
Get a Welcome Bonus of 7 BTC + 250 Free Spins this season!
3000+ Slots, 20+ Cryptos, 75K Raffle, Sports Promos - World's largest Crypto Casino & Sportsbook - Provably Fair!
Overview
BNB Balance
BNB Value
$0.00Token Holdings
Could not find any matches!
- BEP-20 Tokens (100)1.484921 APCArenaPlay (APC)$0.00@0.003245.06302142 FTMFantom (FTM)$35.28@0.7829543.57662884 NBMNFTBlackMark... (NBM)$0.00@0.0082 BUSDBinance-Peg ... (BUSD)$82.17@1.00210.00174976 ETHBinance-Peg ... (ETH)$5.94@3,396.494180,938.22024664 CakePancakeSwap ... (Cake)$204,773.70@2.531,213.47393623 www.zkfair.winBEP-20: ! A-ZKF (www.zk...)678 BNB-ARB AirDrop (www.bnb-arbitrum.com)BEP-20: ! BNB-ARB (BNB-AR...)8,888 TRON Rare Address Generator https://RareTron.orgBEP-20: ! RareTro... (TRON R...)416 PancakeLP.comBEP-20: $ Pancake... (Pancak...)91,237.34006651 AIMBEP-20: aimade.ar... (AIM)7,164,276.74530495 AkoinNFTBEP-20: akoinnft.... (AkoinN...)37,785.21393442 ALIBEP-20: Ali Proto... (ALI)425 Visit https://www.ankrdao.org to earn rewards.BEP-20: Ankrdao.o... (Visit ...)47,063.30482251 ANREBEP-20: Anr Excha... (ANRE)7,442.64711434 APEBEP-20: apenft.or... (APE)13,174.44667941 ATGBEP-20: autograph... (ATG)21,364.96827037 BABIBEP-20: babylons.... (BABI)1 BeeTokenBee Token68,001.65626639 BEYOBEP-20: beyondnft... (BEYO)80,000 binance-launchpad.orgBEP-20: binance-l... (binanc...)10 bitkoinBEP-20: bitkoin (bitkoi...)13,174.44667941 BLOCKSPORTBEP-20: blockspor... (BLOCKS...)5 BDOGBEP-20: BSC Doges... (BDOG)0.02503 candyBEP-20: CakeCandy... (candy)13 CARBONCCBEP-20: CarbonCC ... (CARBON...)0.0001 CDBEP-20: Coin Diam... (CD)330.77423024 Doge LongBEP-20: Doge Long (Doge L...)11,111 doge711BEP-20: doge711 (doge71...)2 ECBBEP-20: Empire Co... (ECB)7,258.54 FXBFxBox$0.01@0.0032,571,783,122.6884 GameFiBEP-20: Game Fina... (GameFi)888,472,674,551.578 GameFiBEP-20: GameFI C... (GameFi)10,000 HayyaBEP-20: Hayya (Hayya)1,000,000 https://StakeKing.FinanceBEP-20: https://S... (https:...)4,179.597555 LAZIOBEP-20: Lazio Fan... (LAZIO)665 LCBEP-20: Lucky cat... (LC)1,000,001 LUEBEP-20: Lusle (LUE)500 LVPBEP-20: LV PLUS (LVP)1 MVGMad Viking Games$0.00@0.00045,000,000 MAVBEP-20: Maverick ... (MAV)1,000 MEBOXBEP-20: Mebox.io (MEBOX)1,000 MEBOXBEP-20: Mebox.io (MEBOX)2 BNB Claim Rewards: https://fomomems.site/BEP-20: MEMES (BNB Cl...)100 MXSBEP-20: Meta-XS (MXS)1.00000136 MBANKBEP-20: MetaBank (MBANK)5 BMCBEP-20: MetaBit C... (BMC)1.98 MBCHBEP-20: MetaBotCh... (MBCH)2,776 $ MetaWin.farmBEP-20: MetaWin.f... ($ Meta...)150,000 MNEBMinereum BSC0 M32Minereum32 - Only 32 Tokens Supply211.7856567 MohBEP-20: Moohcow (Moh)8,000 Moon-Dex.ioBEP-20: Moon-Dex.... (Moon-D...)115 MDTBEP-20: Moondrive... (MDT)999 NOBLENoble Gift Token21,890.76808159 OPUSBEP-20: opus.audi... (OPUS)2.20915198 Cake-LPBEP-20: Pancake L... (Cake-L...)0.001 Cake-LPBEP-20: Pancake L... (Cake-L...)19.93733818 Cake-LPBEP-20: Pancake L... (Cake-L...)1,000,000 PENGUBEP-20: Penguin T... (PENGU)1 Swap $pufETH at https://puffereth.xyzBEP-20: PufETH (Swap $...)6,666 Rare Address Generator at https://rareAddress.comBEP-20: RareAddre... (Rare A...)8,888 TRON Rare Address Generator https://RareTron.orgBEP-20: RareTronO... (TRON R...)0.0000097 SHACKShackleford$0.00@0.2476211.8776675 secBEP-20: smile emo... (sec)78,314,794,668.0383 HESTBEP-20: Snel Hest (HEST)9,000,000 SDTBEP-20: stakedao.... (SDT)94.00000231 SultanBEP-20: Sultan (Sultan)15,000 TSLBEP-20: tesla-dro... (TSL)222.3 TADABEP-20: TheADA (TADA)65,000ERC20 ***9,000 USDТ (stable-event.net)BEP-20: USDТ (sta... (USDТ (...)0.666 VRILVRIL token600 WMBEP-20: WearMask ... (WM)0.0001 wkeyDAOBEP-20: WebKey DA... (wkeyDA...)901,871,510,406.79 WildBEP-20: Wild Tok... (Wild)0.01 YESGOBEP-20: yesgo (YESGO)20.64000008 ZEONBEP-20: ZEON (ZEON)56.3941576 SRCXSource Token$0.44@0.00791,000 TokenBEP-20 TOKEN*[Suspicious]5,000,000 TokenBEP-20 TOKEN*[Suspicious]3,600 TokenBEP-20 TOKEN*[Suspicious]6,272 TokenBEP-20 TOKEN*[Suspicious]92,136 TokenBEP-20 TOKEN*[Suspicious]70,400 TokenBEP-20 TOKEN*[Suspicious]1 TokenBEP-20 TOKEN*[Suspicious]100 TokenBEP-20 TOKEN*[Suspicious]950,005 TokenBEP-20 TOKEN*[Suspicious]923 TokenBEP-20 TOKEN*[Suspicious]936 TokenBEP-20 TOKEN*[Suspicious]923 TokenBEP-20 TOKEN*[Suspicious]31,820 TokenBEP-20 TOKEN*[Suspicious]5,311 TokenBEP-20 TOKEN*[Spam]8,888 TokenBEP-20 TOKEN*[Spam]1 TokenBEP-20 TOKEN*[Spam]1,207 TokenBEP-20 TOKEN*[Spam]1 TokenBEP-20 TOKEN*[Spam]1 TokenBEP-20 TOKEN*[Spam]9,000 TokenBEP-20 TOKEN*[Spam]4,200 TokenBEP-20 TOKEN*[Spam]NFT Tokens (11)PLTPancake Lottery TicketBEP-721REWARD# rewardUSDT.orgBEP-1155Visit headpunks.app to mint FREE!Block Head Punks NFTBEP-1155AirdropPancakeDEX.orgBEP-1155
More Info
Private Name Tags
ContractCreator
Multichain Info
1 address found via
Latest 25 from a total of 1,672,987 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Buy Tickets | 45325301 | 2024-12-30 11:10:46 | 3 mins ago | 1735557046 | IN | 0 BNB$0.00 | 0.0026372 | 2 | ||||
Buy Tickets | 45325055 | 2024-12-30 10:58:28 | 16 mins ago | 1735556308 | IN | 0 BNB$0.00 | 0.00035577 | 1 | ||||
Buy Tickets | 45325054 | 2024-12-30 10:58:25 | 16 mins ago | 1735556305 | IN | 0 BNB$0.00 | 0.00076237 | 1 | ||||
Buy Tickets | 45324903 | 2024-12-30 10:50:52 | 23 mins ago | 1735555852 | IN | 0 BNB$0.00 | 0.00302921 | 5 | ||||
Buy Tickets | 45324732 | 2024-12-30 10:42:19 | 32 mins ago | 1735555339 | IN | 0 BNB$0.00 | 0.00095873 | 5 | ||||
Buy Tickets | 45324653 | 2024-12-30 10:38:22 | 36 mins ago | 1735555102 | IN | 0 BNB$0.00 | 0.00062774 | 1 | ||||
Buy Tickets | 45324651 | 2024-12-30 10:38:16 | 36 mins ago | 1735555096 | IN | 0 BNB$0.00 | 0.00038997 | 1 | ||||
Buy Tickets | 45324617 | 2024-12-30 10:36:34 | 37 mins ago | 1735554994 | IN | 0 BNB$0.00 | 0.00136562 | 1 | ||||
Buy Tickets | 45324560 | 2024-12-30 10:33:43 | 40 mins ago | 1735554823 | IN | 0 BNB$0.00 | 0.00403885 | 1 | ||||
Buy Tickets | 45324456 | 2024-12-30 10:28:31 | 45 mins ago | 1735554511 | IN | 0 BNB$0.00 | 0.00158162 | 7 | ||||
Buy Tickets | 45324381 | 2024-12-30 10:24:46 | 49 mins ago | 1735554286 | IN | 0 BNB$0.00 | 0.00022594 | 1 | ||||
Buy Tickets | 45324368 | 2024-12-30 10:24:07 | 50 mins ago | 1735554247 | IN | 0 BNB$0.00 | 0.00112973 | 5 | ||||
Buy Tickets | 45324321 | 2024-12-30 10:21:46 | 52 mins ago | 1735554106 | IN | 0 BNB$0.00 | 0.00072913 | 3 | ||||
Buy Tickets | 45324309 | 2024-12-30 10:21:10 | 53 mins ago | 1735554070 | IN | 0 BNB$0.00 | 0.00062774 | 1 | ||||
Claim Tickets | 45324303 | 2024-12-30 10:20:52 | 53 mins ago | 1735554052 | IN | 0 BNB$0.00 | 0.0002232 | 3 | ||||
Buy Tickets | 45324289 | 2024-12-30 10:20:10 | 54 mins ago | 1735554010 | IN | 0 BNB$0.00 | 0.00024304 | 1 | ||||
Buy Tickets | 45324151 | 2024-12-30 10:13:16 | 1 hr ago | 1735553596 | IN | 0 BNB$0.00 | 0.00029408 | 1.21 | ||||
Buy Tickets | 45324140 | 2024-12-30 10:12:43 | 1 hr ago | 1735553563 | IN | 0 BNB$0.00 | 0.00079657 | 1 | ||||
Buy Tickets | 45324083 | 2024-12-30 10:09:52 | 1 hr ago | 1735553392 | IN | 0 BNB$0.00 | 0.0009216 | 1 | ||||
Buy Tickets | 45324057 | 2024-12-30 10:08:34 | 1 hr ago | 1735553314 | IN | 0 BNB$0.00 | 0.00077947 | 1 | ||||
Buy Tickets | 45323842 | 2024-12-30 9:57:49 | 1 hr ago | 1735552669 | IN | 0 BNB$0.00 | 0.00026735 | 1.1 | ||||
Buy Tickets | 45323793 | 2024-12-30 9:55:22 | 1 hr ago | 1735552522 | IN | 0 BNB$0.00 | 0.00106853 | 1 | ||||
Buy Tickets | 45323781 | 2024-12-30 9:54:46 | 1 hr ago | 1735552486 | IN | 0 BNB$0.00 | 0.00051501 | 1 | ||||
Buy Tickets | 45323636 | 2024-12-30 9:47:31 | 1 hr ago | 1735552051 | IN | 0 BNB$0.00 | 0.00024304 | 1 | ||||
Buy Tickets | 45323535 | 2024-12-30 9:42:28 | 1 hr ago | 1735551748 | IN | 0 BNB$0.00 | 0.00035577 | 1 |
Contract Source Code (Solidity)
- - function _msgSender()
- - function _msgData()
- - function owner()
- - function renounceOwnership()
- - function transferOwnership(address ne ...
- interface IERC20
- - function totalSupply()
- - function balanceOf(address account)
- - function transfer(address recipient, ...
- - function allowance(address owner, add ...
- - function approve(address spender, uin ...
- - function transferFrom(
- library Address
- - function isContract(address account)
- - function sendValue(address payable re ...
- - function functionCall(address target, ...
- - function functionCall(
- - function functionCallWithValue(
- - function functionCallWithValue(
- - function functionStaticCall(address t ...
- - function functionStaticCall(
- - function functionDelegateCall(address ...
- - function functionDelegateCall(
- - function _verifyCallResult(
- library SafeERC20
- - function safeTransfer(
- - function safeTransferFrom(
- - function safeApprove(
- - function safeIncreaseAllowance(
- - function safeDecreaseAllowance(
- - function _callOptionalReturn(IERC20 t ...
- interface IRandomNumberGenerator
- - function getRandomNumber(uint256 _see ...
- - function viewLatestLotteryId()
- - function viewRandomResult()
- interface IPancakeSwapLottery
- - function buyTickets(uint256 _lotteryI ...
- - function claimTickets(
- - function closeLottery(uint256 _lotter ...
- - function drawFinalNumberAndMakeLotter ...
- - function injectFunds(uint256 _lottery ...
- - function startLottery(
- - function viewCurrentLotteryId()
- contract PancakeSwapLottery is Ree ... *
- - function buyTickets(uint256 _lotteryI ...
- - function claimTickets(
- - function closeLottery(uint256 _lotter ...
- - function drawFinalNumberAndMakeLotter ...
- - function changeRandomGenerator(addres ...
- - function injectFunds(uint256 _lottery ...
- - function startLottery(
- - function recoverWrongTokens(address _ ...
- - function setMinAndMaxTicketPriceInCak ...
- - function setMaxNumberTicketsPerBuy(ui ...
- - function setOperatorAndTreasuryAndInj ...
- - function calculateTotalPriceForBulkTi ...
- - function viewCurrentLotteryId()
- - function viewLottery(uint256 _lottery ...
- - function viewNumbersAndStatusesForTic ...
- - function viewRewardsForTicketId(
- - function viewUserInfoForLotteryId(
- - function _calculateRewardsForTicketId ...
- - function _calculateTotalPriceForBulkT ...
- - function _isContract(address _addr)
/** *Submitted for verification at BscScan.com on 2021-07-02 */ // File: @openzeppelin/contracts/utils/Context.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /* * @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; } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.8.0; /** * @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; } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol pragma solidity ^0.8.0; /** * @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; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @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); } } } } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol pragma solidity ^0.8.0; /** * @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"); } } } // File: contracts/interfaces/IRandomNumberGenerator.sol pragma solidity ^0.8.4; interface IRandomNumberGenerator { /** * Requests randomness from a user-provided seed */ function getRandomNumber(uint256 _seed) external; /** * View latest lotteryId numbers */ function viewLatestLotteryId() external view returns (uint256); /** * Views random result */ function viewRandomResult() external view returns (uint32); } // File: contracts/interfaces/IPancakeSwapLottery.sol pragma solidity ^0.8.4; 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, 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); } // File: contracts/PancakeSwapLottery.sol pragma solidity ^0.8.4; pragma abicoder v2; /** @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.005 ether; uint256 public pendingInjectionNextLottery; uint256 public constant MIN_DISCOUNT_DIVISOR = 300; uint256 public constant MIN_LENGTH_LOTTERY = 4 hours - 5 minutes; // 4 hours uint256 public constant MAX_LENGTH_LOTTERY = 4 days + 5 minutes; // 4 days uint256 public constant MAX_TREASURY_FEE = 3000; // 30% IERC20 public cakeToken; IRandomNumberGenerator public randomGenerator; 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"); _; } 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 NewRandomGenerator(address indexed randomGenerator); event TicketsPurchase(address indexed buyer, uint256 indexed lotteryId, uint256 numberTickets); event TicketsClaim(address indexed claimer, uint256 amount, uint256 indexed lotteryId, uint256 numberTickets); /** * @notice Constructor * @dev RandomNumberGenerator must be deployed prior to this contract * @param _cakeTokenAddress: address of the CAKE token * @param _randomGeneratorAddress: address of the RandomGenerator contract used to work with ChainLink VRF */ constructor(address _cakeTokenAddress, address _randomGeneratorAddress) { cakeToken = IERC20(_cakeTokenAddress); randomGenerator = IRandomNumberGenerator(_randomGeneratorAddress); // Initializes a mapping _bracketCalculator[0] = 1; _bracketCalculator[1] = 11; _bracketCalculator[2] = 111; _bracketCalculator[3] = 1111; _bracketCalculator[4] = 11111; _bracketCalculator[5] = 111111; } /** * @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]; 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 onlyOperator nonReentrant { require(_lotteries[_lotteryId].status == Status.Open, "Lottery not open"); require(block.timestamp > _lotteries[_lotteryId].endTime, "Lottery not over"); _lotteries[_lotteryId].firstTicketIdNextLottery = currentTicketId; // Request a random number from the generator based on a seed randomGenerator.getRandomNumber(uint256(keccak256(abi.encodePacked(_lotteryId, 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, bool _autoInjection) external override onlyOperator nonReentrant { require(_lotteries[_lotteryId].status == Status.Close, "Lottery not close"); require(_lotteryId == randomGenerator.viewLatestLotteryId(), "Numbers not drawn"); // Calculate the finalNumber based on the randomResult generated by ChainLink's fallback uint32 finalNumber = randomGenerator.viewRandomResult(); // 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; // 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 < 6; i++) { uint32 j = 5 - 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); // Transfer CAKE to treasury address cakeToken.safeTransfer(treasuryAddress, amountToWithdrawToTreasury); emit LotteryNumberDrawn(currentLotteryId, finalNumber, numberAddressesInPreviousBracket); } /** * @notice Change the random generator * @dev The calls to functions are used to verify the new generator implements them properly. * It is necessary to wait for the VRF response before starting a round. * Callable only by the contract owner * @param _randomGeneratorAddress: address of the random generator */ function changeRandomGenerator(address _randomGeneratorAddress) external onlyOwner { require(_lotteries[currentLotteryId].status == Status.Claimable, "Lottery not in claimable"); // Request a random number from the generator based on a seed IRandomNumberGenerator(_randomGeneratorAddress).getRandomNumber( uint256(keccak256(abi.encodePacked(currentLotteryId, currentTicketId))) ); // Calculate the finalNumber based on the randomResult generated by ChainLink's fallback IRandomNumberGenerator(_randomGeneratorAddress).viewRandomResult(); randomGenerator = IRandomNumberGenerator(_randomGeneratorAddress); emit NewRandomGenerator(_randomGeneratorAddress); } /** * @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 onlyOperator { 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), "Cannot be CAKE token"); IERC20(_tokenAddress).safeTransfer(address(msg.sender), _tokenAmount); emit AdminTokenRecovery(_tokenAddress, _tokenAmount); } /** * @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); } /** * @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; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
[{"inputs":[{"internalType":"address","name":"_cakeTokenAddress","type":"address"},{"internalType":"address","name":"_randomGeneratorAddress","type":"address"}],"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":"randomGenerator","type":"address"}],"name":"NewRandomGenerator","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":"address","name":"_randomGeneratorAddress","type":"address"}],"name":"changeRandomGenerator","outputs":[],"stateMutability":"nonpayable","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":"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":"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":[],"name":"randomGenerator","outputs":[{"internalType":"contract IRandomNumberGenerator","name":"","type":"address"}],"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":"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"}]
Contract Creation Code
608060405260646007556802b5e3af16b18800006008556611c37937e080006009553480156200002e57600080fd5b5060405162005154380380620051548339810160408190526200005191620001fd565b6001600081815581546001600160a01b031916339081179092556040518291907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600b80546001600160a01b039384166001600160a01b0319918216178255600c805493909416921691909117909155600f6020527ff4803e074bd026baaf6ed2e288c9515f68c72fb7216eebdd7cae1718a53ec375805463ffffffff199081166001179091557f169f97de0d9a84d840042b17d3c6b9638b3d6fd9024c9eb0c7a306a17b49f88f805482169092179091557fa74ba3945261e09fde15ba3db55005b205e61eeb4ad811ac0faa2b315bffeead80548216606f1790557f45f76dafbbad695564362934e24d72eedc57f9fc1a65f39bca62176cc8296828805482166104571790557f367ccd2d0ac16bf7110a5dffe0801fdc9452a95a1adb7e1a12fe97dd3e9a4edd80548216612b6717905560056000527f6bda57492eba051cb4a12a1e19df47c9755d78165341d4009b1d09b3f361620480549091166201b20717905562000234565b80516001600160a01b0381168114620001f857600080fd5b919050565b6000806040838503121562000210578182fd5b6200021b83620001e0565b91506200022b60208401620001e0565b90509250929050565b614f1080620002446000396000f3fe608060405234801561001057600080fd5b50600436106102415760003560e01c806388303dbd11610145578063c4937ab9116100bd578063da7429f81161008c578063dcbad90d11610071578063dcbad90d146104df578063f2b3c809146104ff578063f2fde38b1461050857600080fd5b8063da7429f8146104c2578063db19da0d146104d557600080fd5b8063c4937ab914610469578063c5f956af1461047c578063c914914f1461049c578063da4ca039146104af57600080fd5b806398359fa1116101145780639d8ca531116100f95780639d8ca53114610430578063b1829b8214610443578063c38de5391461045657600080fd5b806398359fa1146103fd5780639c3846531461041057600080fd5b806388303dbd1461038b5780638904bf2f1461039e5780638da5cb5b146103be5780638fc3539a146103dc57600080fd5b806331feb565116101d85780636b873788116101a7578063715018a61161018c578063715018a6146103725780637cb583bd1461037a57806380a061601461038357600080fd5b80636b873788146103565780636be4097c1461036957600080fd5b806331feb5651461031c5780633f138d4b14610325578063471aeab41461033a578063686465b81461034d57600080fd5b80631f73664b116102145780631f73664b146102d75780631fe86c6b146102e05780632423807a146102e95780632e530cae1461030957600080fd5b806305531eeb1461024657806307fb5a9c14610272578063127effb21461028957806312a9769d146102ce575b600080fd5b610259610254366004614650565b61051b565b60405161026994939291906149f8565b60405180910390f35b61027b61371481565b604051908152602001610269565b6003546102a99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610269565b61027b600a5481565b61027b60085481565b61027b60075481565b6102fc6102f73660046146e4565b6109ce565b6040516102699190614aeb565b61027b61031736600461489d565b610b7d565b61027b60095481565b610338610333366004614627565b610c2b565b005b610338610348366004614804565b610daa565b61027b60065481565b6103386103643660046146e4565b610f84565b61027b60055481565b610338611071565b61027b61012c81565b60055461027b565b61033861039936600461478b565b611161565b600b546102a99073ffffffffffffffffffffffffffffffffffffffff1681565b60015473ffffffffffffffffffffffffffffffffffffffff166102a9565b6103ef6103ea366004614688565b6118ee565b604051610269929190614a6c565b61033861040b3660046145cb565b611bc6565b6002546102a99073ffffffffffffffffffffffffffffffffffffffff1681565b61033861043e3660046146e4565b611ec1565b610338610451366004614850565b612240565b6103386104643660046147d5565b6128b8565b61027b610477366004614825565b6130d2565b6004546102a99073ffffffffffffffffffffffffffffffffffffffff1681565b6103386104aa366004614714565b6131b2565b6103386104bd3660046145e5565b613a26565b6103386104d0366004614804565b613cc7565b61027b6205472c81565b600c546102a99073ffffffffffffffffffffffffffffffffffffffff1681565b61027b610bb881565b6103386105163660046145cb565b613dbd565b73ffffffffffffffffffffffffffffffffffffffff84166000908152601160209081526040808320868452909152812054606091829182919085906105608882614d71565b821115610574576105718882614d71565b91505b60008267ffffffffffffffff8111156105b6577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156105df578160200160208202803683370190505b50905060008367ffffffffffffffff811115610624577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561064d578160200160208202803683370190505b50905060008467ffffffffffffffff811115610692577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156106bb578160200160208202803683370190505b50905060005b858110156109a857601160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008e81526020019081526020016000208c826107259190614bae565b8154811061075c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001548482815181106107a0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050600e60008583815181106107e9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200190815260200160002060000160009054906101000a900463ffffffff1683828151811061084c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019063ffffffff16908163ffffffff1681525050600073ffffffffffffffffffffffffffffffffffffffff16600e60008684815181106108bb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602090810291909101810151825281019190915260400160002054640100000000900473ffffffffffffffffffffffffffffffffffffffff16141561094a576001828281518110610935577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b91151560209283029190910190910152610996565b6000828281518110610985577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b911515602092830291909101909101525b806109a081614dd9565b9150506106c1565b508282826109b6888f614bae565b98509850985098505050505050945094509450949050565b6109d661446d565b6000828152600d60205260409081902081516101a081019092528054829060ff166003811115610a2f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811115610a67577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526001820154602082015260028201546040808301919091526003830154606083015260048301546080830152805160c081019182905260a09092019190600584019060069082845b815481526020019060010190808311610ab1575050509183525050600b82015460208201526040805160c081018252910190600c830160068282826020028201915b815481526020019060010190808311610af35750505091835250506040805160c081019182905260209092019190601284019060069082845b815481526020019060010190808311610b2c5750505091835250506018820154602082015260198201546040820152601a8201546060820152601b9091015463ffffffff1660809091015292915050565b600060036000858152600d602052604090205460ff166003811115610bcb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14610bd857506000610c24565b6000848152600d602052604090206019015483118015610c0957506000848152600d60205260409020601801548311155b15610c1657506000610c24565b610c21848484613f6f565b90505b9392505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610cb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600b5473ffffffffffffffffffffffffffffffffffffffff83811691161415610d36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f43616e6e6f742062652043414b4520746f6b656e0000000000000000000000006044820152606401610ca8565b610d5773ffffffffffffffffffffffffffffffffffffffff831633836140a1565b6040805173ffffffffffffffffffffffffffffffffffffffff84168152602081018390527f74545154aac348a3eac92596bd1971957ca94795f4e954ec5f613b55fab78129910160405180910390a15050565b60015473ffffffffffffffffffffffffffffffffffffffff16331480610de7575060025473ffffffffffffffffffffffffffffffffffffffff1633145b610e4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f74206f776e6572206f7220696e6a6563746f7200000000000000000000006044820152606401610ca8565b60016000838152600d602052604090205460ff166003811115610e99577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14610f00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c6f7474657279206e6f74206f70656e000000000000000000000000000000006044820152606401610ca8565b600b54610f259073ffffffffffffffffffffffffffffffffffffffff1633308461417a565b6000828152600d60205260408120601a018054839290610f46908490614bae565b909155505060405181815282907f1bbd659dd628a25f7ff2eabb69c74a56939c539728282275c1c9c1a2d3e340499060200160405180910390a25050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611005576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca8565b8061106c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f4d757374206265203e20300000000000000000000000000000000000000000006044820152606401610ca8565b600755565b60015473ffffffffffffffffffffffffffffffffffffffff1633146110f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca8565b60015460405160009173ffffffffffffffffffffffffffffffffffffffff16907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b333b156111ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f436f6e7472616374206e6f7420616c6c6f7765640000000000000000000000006044820152606401610ca8565b333214611233576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f50726f787920636f6e7472616374206e6f7420616c6c6f7765640000000000006044820152606401610ca8565b600260005414156112a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610ca8565b60026000558061130c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4e6f207469636b657420737065636966696564000000000000000000000000006044820152606401610ca8565b600754811115611378576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f546f6f206d616e79207469636b657473000000000000000000000000000000006044820152606401610ca8565b60016000848152600d602052604090205460ff1660038111156113c4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1461142b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4c6f7474657279206973206e6f74206f70656e000000000000000000000000006044820152606401610ca8565b6000838152600d602052604090206002015442106114a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4c6f7474657279206973206f76657200000000000000000000000000000000006044820152606401610ca8565b6000838152600d6020526040812060048101546003909101546114c99190846141de565b600b549091506114f19073ffffffffffffffffffffffffffffffffffffffff1633308461417a565b6000848152600d60205260408120601a018054839290611512908490614bae565b90915550600090505b828110156118ab57600084848381811061155e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b905060200201602081019061157391906148d5565b9050620f42408163ffffffff16101580156115975750621e847f8163ffffffff1611155b6115fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4f7574736964652072616e6765000000000000000000000000000000000000006044820152606401610ca8565b600086815260106020526040812090611617600a84614e36565b611622906001614bc6565b63ffffffff1681526020810191909152604001600090812080549161164683614dd9565b9091555050600086815260106020526040812090611665606484614e36565b61167090600b614bc6565b63ffffffff1681526020810191909152604001600090812080549161169483614dd9565b90915550506000868152601060205260408120906116b46103e884614e36565b6116bf90606f614bc6565b63ffffffff168152602081019190915260400160009081208054916116e383614dd9565b909155505060008681526010602052604081209061170361271084614e36565b61170f90610457614bc6565b63ffffffff1681526020810191909152604001600090812080549161173383614dd9565b9091555050600086815260106020526040812090611754620186a084614e36565b61176090612b67614bc6565b63ffffffff1681526020810191909152604001600090812080549161178483614dd9565b90915550506000868152601060205260408120906117a5620f424084614e36565b6117b2906201b207614bc6565b63ffffffff168152602081019190915260400160009081208054916117d683614dd9565b90915550503360008181526011602090815260408083208a84528252808320600680548254600181018455928652848620909201919091558151808301835263ffffffff808816825281850196875282548652600e90945291842091518254955173ffffffffffffffffffffffffffffffffffffffff16640100000000027fffffffffffffffff000000000000000000000000000000000000000000000000909616931692909217939093179092558154919061189283614dd9565b91905055505080806118a390614dd9565b91505061151b565b50604051828152849033907fd7d247b583de1023852eef87b48f54354dbec771d01bc2cc49e96094efc322b99060200160405180910390a3505060016000555050565b6060808260008167ffffffffffffffff811115611934577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561195d578160200160208202803683370190505b50905060008267ffffffffffffffff8111156119a2577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156119cb578160200160208202803683370190505b50905060005b83811015611bb757600e6000898984818110611a16577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020135815260200190815260200160002060000160009054906101000a900463ffffffff16838281518110611a78577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b63ffffffff909216602092830291909101909101526000600e818a8a85818110611acb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020908102929092013583525081019190915260400160002054640100000000900473ffffffffffffffffffffffffffffffffffffffff161415611b59576001828281518110611b44577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b91151560209283029190910190910152611ba5565b6000828281518110611b94577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b911515602092830291909101909101525b80611baf81614dd9565b9150506119d1565b509093509150505b9250929050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611c47576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca8565b60036005546000908152600d602052604090205460ff166003811115611c96577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14611cfd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4c6f7474657279206e6f7420696e20636c61696d61626c6500000000000000006044820152606401610ca8565b8073ffffffffffffffffffffffffffffffffffffffff1663b37217a4600554600654604051602001611d39929190918252602082015260400190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060e083901b7fffffffff000000000000000000000000000000000000000000000000000000001682526004820152602401600060405180830381600087803b158015611dbb57600080fd5b505af1158015611dcf573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663a1c4f55a6040518163ffffffff1660e01b815260040160206040518083038186803b158015611e1957600080fd5b505afa158015611e2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5191906148f1565b50600c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f383f8cb39dfa7c3fb901a460dd449ea924868f0a92ff03da64740fffa5f1de6290600090a250565b60035473ffffffffffffffffffffffffffffffffffffffff163314611f42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e6f74206f70657261746f7200000000000000000000000000000000000000006044820152606401610ca8565b60026000541415611faf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610ca8565b600260005560016000828152600d602052604090205460ff166003811115612000577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14612067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c6f7474657279206e6f74206f70656e000000000000000000000000000000006044820152606401610ca8565b6000818152600d602052604090206002015442116120e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c6f7474657279206e6f74206f766572000000000000000000000000000000006044820152606401610ca8565b6006546000828152600d6020908152604091829020601901839055600c5482519182018590529181019290925273ffffffffffffffffffffffffffffffffffffffff169063b37217a490606001604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060e083901b7fffffffff000000000000000000000000000000000000000000000000000000001682526004820152602401600060405180830381600087803b1580156121b057600080fd5b505af11580156121c4573d6000803e3d6000fd5b5050506000828152600d602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600217905560065491519182528392507f3728e75294796694d59d2ffced9c394279baf7b9ebd2702db43f5f04bac67929910160405180910390a2506001600055565b60035473ffffffffffffffffffffffffffffffffffffffff1633146122c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e6f74206f70657261746f7200000000000000000000000000000000000000006044820152606401610ca8565b600554158061231c575060036005546000908152600d602052604090205460ff16600381111561231a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b145b612382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4e6f742074696d6520746f207374617274206c6f7474657279000000000000006044820152606401610ca8565b61371461238f4287614d71565b1180156123a757506205472c6123a54287614d71565b105b61240d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4c6f7474657279206c656e677468206f757473696465206f662072616e6765006044820152606401610ca8565b600954841015801561242157506008548411155b612487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4f757473696465206f66206c696d6974730000000000000000000000000000006044820152606401610ca8565b61012c8310156124f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f446973636f756e742064697669736f7220746f6f206c6f7700000000000000006044820152606401610ca8565b610bb881111561255f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f54726561737572792066656520746f6f206869676800000000000000000000006044820152606401610ca8565b60a082013560808301356060840135604085013561258260208701358735614bae565b61258c9190614bae565b6125969190614bae565b6125a09190614bae565b6125aa9190614bae565b61271014612614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f52657761726473206d75737420657175616c20313030303000000000000000006044820152606401610ca8565b6005805490600061262483614dd9565b9091555050604080516101a0810190915280600181526020014281526020018681526020018581526020018481526020018360068060200260405190810160405280929190826006602002808284376000920182905250928452505060208083018590526040805160c080820183528482528184018590528183018590526060808301869052608080840187905260a080850188905285890194909452845180840186528781528087018890528086018890528083018890528082018890528085018890529188019190915260065490870181905291860191909152600a549085015260e09093018290526005548252600d9052208151815482907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600183600381111561277c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055506020820151600182015560408201516002820155606082015160038201556080820151600482015560a08201516127be90600583019060066144ee565b5060c0820151600b82015560e08201516127de90600c83019060066144ee565b506101008201516127f590601283019060066144ee565b5061012082015160188201556101408201516019820155610160820151601a82015561018090910151601b90910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff909216919091179055600554600654600a5460408051428152602081018a9052908101889052606081019290925260808201527f367e70f8c0e0c0a6504d92172bda155c02022d532fc85b5d66a9c49e31c8bc779060a00160405180910390a250506000600a55505050565b60035473ffffffffffffffffffffffffffffffffffffffff163314612939576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e6f74206f70657261746f7200000000000000000000000000000000000000006044820152606401610ca8565b600260005414156129a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610ca8565b60026000818155838152600d602052604090205460ff1660038111156129f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14612a5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4c6f7474657279206e6f7420636c6f73650000000000000000000000000000006044820152606401610ca8565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fbe5d9176040518163ffffffff1660e01b815260040160206040518083038186803b158015612ac457600080fd5b505afa158015612ad8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612afc91906146fc565b8214612b64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4e756d62657273206e6f7420647261776e0000000000000000000000000000006044820152606401610ca8565b600c54604080517fa1c4f55a000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163a1c4f55a916004808301926020929190829003018186803b158015612bcf57600080fd5b505afa158015612be3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c0791906148f1565b6000848152600d60205260408120600b015491925090819061271090612c2d9082614d71565b6000878152600d60205260409020601a0154612c499190614d34565b612c539190614bee565b90506000805b60068163ffffffff161015612fb7576000612c75826005614d88565b90506000612c84826001614bc6565b612c8f90600a614c49565b612c999088614e36565b63ffffffff8084166000908152600f6020526040902054612cbb929116614bc6565b60008a815260106020908152604080832063ffffffff85168452909152902054909150612ce9908790614d71565b60008a8152600d6020526040902060120163ffffffff841660068110612d38577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0155600089815260106020908152604080832063ffffffff85168452909152902054612d65908790614d71565b15612ed9576000898152600d6020526040902060050163ffffffff831660068110612db9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b015415612ed457600089815260106020908152604080832063ffffffff8516845290915290205461271090612def908890614d71565b60008b8152600d60205260409020879060050163ffffffff861660068110612e40577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0154612e4c9190614d34565b612e569190614bee565b612e609190614bee565b60008a8152600d60205260409020600c0163ffffffff841660068110612eaf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0155600089815260106020908152604080832063ffffffff8516845290915290205495505b612fa2565b6000898152600d60205260408120600c0163ffffffff841660068110612f28577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01556000898152600d6020526040902061271090869060050163ffffffff851660068110612f7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0154612f8b9190614d34565b612f959190614bee565b612f9f9085614bae565b93505b50508080612faf90614e12565b915050612c59565b506000868152600d60205260409020601b8101805463ffffffff87167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000090911617905580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166003179055841561302f57600a5560005b6000868152600d60205260409020601a015461304c908390614d71565b6130569082614bae565b600454600b549192506130839173ffffffffffffffffffffffffffffffffffffffff9081169116836140a1565b6005546040805163ffffffff87168152602081018690527f98e31a6607b8b15b4d5b91de54f4c09ffe4c4cf162aa532c70b5213754e2e703910160405180910390a25050600160005550505050565b600061012c841015613140576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d757374206265203e3d204d494e5f444953434f554e545f44495649534f52006044820152606401610ca8565b816131a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4e756d626572206f66207469636b657473206d757374206265203e20300000006044820152606401610ca8565b610c218484846141de565b333b1561321b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f436f6e7472616374206e6f7420616c6c6f7765640000000000000000000000006044820152606401610ca8565b333214613284576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f50726f787920636f6e7472616374206e6f7420616c6c6f7765640000000000006044820152606401610ca8565b600260005414156132f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610ca8565b600260005582811461335f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e6f742073616d65206c656e67746800000000000000000000000000000000006044820152606401610ca8565b826133c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4c656e677468206d757374206265203e300000000000000000000000000000006044820152606401610ca8565b600754831115613432576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f546f6f206d616e79207469636b657473000000000000000000000000000000006044820152606401610ca8565b60036000868152600d602052604090205460ff16600381111561347e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b146134e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4c6f7474657279206e6f7420636c61696d61626c6500000000000000000000006044820152606401610ca8565b6000805b848110156139b757600684848381811061352c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b905060200201602081019061354191906148d5565b63ffffffff16106135ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f427261636b6574206f7574206f662072616e67650000000000000000000000006044820152606401610ca8565b60008686838181106135e9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020135905080600d60008a81526020019081526020016000206019015411613671576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5469636b6574496420746f6f20686967680000000000000000000000000000006044820152606401610ca8565b6000888152600d60205260409020601801548110156136ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5469636b6574496420746f6f206c6f77000000000000000000000000000000006044820152606401610ca8565b6000818152600e6020526040902054640100000000900473ffffffffffffffffffffffffffffffffffffffff163314613781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4e6f7420746865206f776e6572000000000000000000000000000000000000006044820152606401610ca8565b6000818152600e6020526040812080547fffffffffffffffff0000000000000000000000000000000000000000ffffffff16905561380d89838888878181106137f3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b905060200201602081019061380891906148d5565b613f6f565b905080613876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4e6f207072697a6520666f72207468697320627261636b6574000000000000006044820152606401610ca8565b8585848181106138af577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906138c491906148d5565b63ffffffff166005146139965761392f898388888781811061390f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b905060200201602081019061392491906148d5565b613808906001614bc6565b15613996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f427261636b6574206d75737420626520686967686572000000000000000000006044820152606401610ca8565b6139a08185614bae565b9350505080806139af90614dd9565b9150506134e9565b50600b546139dc9073ffffffffffffffffffffffffffffffffffffffff1633836140a1565b6040805182815260208101869052879133917f0f5fca62da8fb5d95525b49e5eaa7b20bc6bd9e2f6b64b493442d1c0bd6ef486910160405180910390a35050600160005550505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314613aa7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca8565b73ffffffffffffffffffffffffffffffffffffffff8316613b24576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616e6e6f74206265207a65726f2061646472657373000000000000000000006044820152606401610ca8565b73ffffffffffffffffffffffffffffffffffffffff8216613ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616e6e6f74206265207a65726f2061646472657373000000000000000000006044820152606401610ca8565b73ffffffffffffffffffffffffffffffffffffffff8116613c1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616e6e6f74206265207a65726f2061646472657373000000000000000000006044820152606401610ca8565b6003805473ffffffffffffffffffffffffffffffffffffffff8581167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316811790935560048054868316908416811790915560028054928616929093168217909255604080519384526020840192909252908201527f3e945b7660001d46cfd5e729545f7f0b6c65bdee54066a91c7acad703f1b731e9060600160405180910390a1505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314613d48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca8565b80821115613db2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6d696e5072696365206d757374206265203c206d6178507269636500000000006044820152606401610ca8565b600991909155600855565b60015473ffffffffffffffffffffffffffffffffffffffff163314613e3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca8565b73ffffffffffffffffffffffffffffffffffffffff8116613ee1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610ca8565b60015460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000838152600d60209081526040808320601b0154858452600e90925282205463ffffffff918216911682613fa5856001614bc6565b613fb090600a614c49565b613fba9083614e36565b63ffffffff8087166000908152600f6020526040902054613fdc929116614bc6565b90506000613feb866001614bc6565b613ff690600a614c49565b6140009085614e36565b63ffffffff8088166000908152600f6020526040902054614022929116614bc6565b90508063ffffffff168263ffffffff161415614094576000888152600d60205260409020600c0163ffffffff871660068110614087577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0154945050505050610c24565b6000945050505050610c24565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526141759084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614215565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526141d89085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016140f3565b50505050565b600083826141ed826001614bae565b6141f79190614d71565b6142018486614d34565b61420b9190614d34565b610c219190614bee565b6000614277826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166143219092919063ffffffff16565b805190915015614175578080602001905181019061429591906146c8565b614175576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610ca8565b6060610c21848460008585843b614394576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ca8565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516143bd91906149dc565b60006040518083038185875af1925050503d80600081146143fa576040519150601f19603f3d011682016040523d82523d6000602084013e6143ff565b606091505b509150915061440f82828661441a565b979650505050505050565b60608315614429575081610c24565b8251156144395782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca89190614a9a565b604080516101a081019091528060008152602001600081526020016000815260200160008152602001600081526020016144a561452c565b8152602001600081526020016144b961452c565b81526020016144c661452c565b8152602001600081526020016000815260200160008152602001600063ffffffff1681525090565b826006810192821561451c579160200282015b8281111561451c578251825591602001919060010190614501565b5061452892915061454a565b5090565b6040518060c001604052806006906020820280368337509192915050565b5b80821115614528576000815560010161454b565b803573ffffffffffffffffffffffffffffffffffffffff8116811461458357600080fd5b919050565b60008083601f840112614599578182fd5b50813567ffffffffffffffff8111156145b0578182fd5b6020830191508360208260051b8501011115611bbf57600080fd5b6000602082840312156145dc578081fd5b610c248261455f565b6000806000606084860312156145f9578182fd5b6146028461455f565b92506146106020850161455f565b915061461e6040850161455f565b90509250925092565b60008060408385031215614639578182fd5b6146428361455f565b946020939093013593505050565b60008060008060808587031215614665578081fd5b61466e8561455f565b966020860135965060408601359560600135945092505050565b6000806020838503121561469a578182fd5b823567ffffffffffffffff8111156146b0578283fd5b6146bc85828601614588565b90969095509350505050565b6000602082840312156146d9578081fd5b8151610c2481614eb7565b6000602082840312156146f5578081fd5b5035919050565b60006020828403121561470d578081fd5b5051919050565b60008060008060006060868803121561472b578081fd5b85359450602086013567ffffffffffffffff80821115614749578283fd5b61475589838a01614588565b9096509450604088013591508082111561476d578283fd5b5061477a88828901614588565b969995985093965092949392505050565b60008060006040848603121561479f578283fd5b83359250602084013567ffffffffffffffff8111156147bc578283fd5b6147c886828701614588565b9497909650939450505050565b600080604083850312156147e7578182fd5b8235915060208301356147f981614eb7565b809150509250929050565b60008060408385031215614816578182fd5b50508035926020909101359150565b600080600060608486031215614839578283fd5b505081359360208301359350604090920135919050565b60008060008060006101408688031215614868578283fd5b85359450602086013593506040860135925061012086018781111561488b578182fd5b94979396509194606001933592915050565b6000806000606084860312156148b1578081fd5b833592506020840135915060408401356148ca81614ec8565b809150509250925092565b6000602082840312156148e6578081fd5b8135610c2481614ec8565b600060208284031215614902578081fd5b8151610c2481614ec8565b6000815180845260208085019450808401835b8381101561493e578151151587529582019590820190600101614920565b509495945050505050565b8060005b60068110156141d857815184526020938401939091019060010161494d565b6000815180845260208085019450808401835b8381101561493e57815163ffffffff168752958201959082019060010161497f565b600481106149d8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b600082516149ee818460208701614dad565b9190910192915050565b6080808252855190820181905260009060209060a0840190828901845b82811015614a3157815184529284019290840190600101614a15565b50505083810382850152614a45818861496c565b9150508281036040840152614a5a818661490d565b91505082606083015295945050505050565b604081526000614a7f604083018561496c565b8281036020840152614a91818561490d565b95945050505050565b6020815260008251806020840152614ab9816040850160208701614dad565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b600061038082019050614aff8284516149a1565b6020830151602083015260408301516040830152606083015160608301526080830151608083015260a0830151614b3960a0840182614949565b5060c0830151610160818185015260e08501519150610180614b5d81860184614949565b6101008601519250614b73610240860184614949565b6101208601516103008601526101408601516103208601529085015161034085015284015163ffffffff811661036085015290505092915050565b60008219821115614bc157614bc1614e59565b500190565b600063ffffffff808316818516808303821115614be557614be5614e59565b01949350505050565b600082614bfd57614bfd614e88565b500490565b60018163ffffffff825b80861115614c4057828204831115614c2657614c26614e59565b80861615614c3357928202925b94851c9491800291614c0c565b50509250929050565b600063ffffffff614c5e818516828516614c66565b949350505050565b600082614c7557506001614d2e565b81614c8257506000614d2e565b8160018114614c985760028114614ca257614cd3565b6001915050614d2e565b60ff841115614cb357614cb3614e59565b6001841b915063ffffffff821115614ccd57614ccd614e59565b50614d2e565b5060208310610133831016604e8410600b8410161715614d0a575081810a63ffffffff811115614d0557614d05614e59565b614d2e565b614d148383614c02565b8063ffffffff04821115614d2a57614d2a614e59565b0290505b92915050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d6c57614d6c614e59565b500290565b600082821015614d8357614d83614e59565b500390565b600063ffffffff83811690831681811015614da557614da5614e59565b039392505050565b60005b83811015614dc8578181015183820152602001614db0565b838111156141d85750506000910152565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e0b57614e0b614e59565b5060010190565b600063ffffffff80831681811415614e2c57614e2c614e59565b6001019392505050565b600063ffffffff80841680614e4d57614e4d614e88565b92169190910692915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b8015158114614ec557600080fd5b50565b63ffffffff81168114614ec557600080fdfea2646970667358221220a51ec081c37362eda1bfcfd498a83c2dddba3e6bfb9d0ae936499ab9b17054a364736f6c634300080400330000000000000000000000000e09fabb73bd3ade0a17ecc321fd13a19e81ce820000000000000000000000008c6375aab6e5b26a30bf241ebbf29ad6e6c503c2
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102415760003560e01c806388303dbd11610145578063c4937ab9116100bd578063da7429f81161008c578063dcbad90d11610071578063dcbad90d146104df578063f2b3c809146104ff578063f2fde38b1461050857600080fd5b8063da7429f8146104c2578063db19da0d146104d557600080fd5b8063c4937ab914610469578063c5f956af1461047c578063c914914f1461049c578063da4ca039146104af57600080fd5b806398359fa1116101145780639d8ca531116100f95780639d8ca53114610430578063b1829b8214610443578063c38de5391461045657600080fd5b806398359fa1146103fd5780639c3846531461041057600080fd5b806388303dbd1461038b5780638904bf2f1461039e5780638da5cb5b146103be5780638fc3539a146103dc57600080fd5b806331feb565116101d85780636b873788116101a7578063715018a61161018c578063715018a6146103725780637cb583bd1461037a57806380a061601461038357600080fd5b80636b873788146103565780636be4097c1461036957600080fd5b806331feb5651461031c5780633f138d4b14610325578063471aeab41461033a578063686465b81461034d57600080fd5b80631f73664b116102145780631f73664b146102d75780631fe86c6b146102e05780632423807a146102e95780632e530cae1461030957600080fd5b806305531eeb1461024657806307fb5a9c14610272578063127effb21461028957806312a9769d146102ce575b600080fd5b610259610254366004614650565b61051b565b60405161026994939291906149f8565b60405180910390f35b61027b61371481565b604051908152602001610269565b6003546102a99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610269565b61027b600a5481565b61027b60085481565b61027b60075481565b6102fc6102f73660046146e4565b6109ce565b6040516102699190614aeb565b61027b61031736600461489d565b610b7d565b61027b60095481565b610338610333366004614627565b610c2b565b005b610338610348366004614804565b610daa565b61027b60065481565b6103386103643660046146e4565b610f84565b61027b60055481565b610338611071565b61027b61012c81565b60055461027b565b61033861039936600461478b565b611161565b600b546102a99073ffffffffffffffffffffffffffffffffffffffff1681565b60015473ffffffffffffffffffffffffffffffffffffffff166102a9565b6103ef6103ea366004614688565b6118ee565b604051610269929190614a6c565b61033861040b3660046145cb565b611bc6565b6002546102a99073ffffffffffffffffffffffffffffffffffffffff1681565b61033861043e3660046146e4565b611ec1565b610338610451366004614850565b612240565b6103386104643660046147d5565b6128b8565b61027b610477366004614825565b6130d2565b6004546102a99073ffffffffffffffffffffffffffffffffffffffff1681565b6103386104aa366004614714565b6131b2565b6103386104bd3660046145e5565b613a26565b6103386104d0366004614804565b613cc7565b61027b6205472c81565b600c546102a99073ffffffffffffffffffffffffffffffffffffffff1681565b61027b610bb881565b6103386105163660046145cb565b613dbd565b73ffffffffffffffffffffffffffffffffffffffff84166000908152601160209081526040808320868452909152812054606091829182919085906105608882614d71565b821115610574576105718882614d71565b91505b60008267ffffffffffffffff8111156105b6577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156105df578160200160208202803683370190505b50905060008367ffffffffffffffff811115610624577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561064d578160200160208202803683370190505b50905060008467ffffffffffffffff811115610692577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156106bb578160200160208202803683370190505b50905060005b858110156109a857601160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008e81526020019081526020016000208c826107259190614bae565b8154811061075c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001548482815181106107a0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050600e60008583815181106107e9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200190815260200160002060000160009054906101000a900463ffffffff1683828151811061084c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019063ffffffff16908163ffffffff1681525050600073ffffffffffffffffffffffffffffffffffffffff16600e60008684815181106108bb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602090810291909101810151825281019190915260400160002054640100000000900473ffffffffffffffffffffffffffffffffffffffff16141561094a576001828281518110610935577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b91151560209283029190910190910152610996565b6000828281518110610985577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b911515602092830291909101909101525b806109a081614dd9565b9150506106c1565b508282826109b6888f614bae565b98509850985098505050505050945094509450949050565b6109d661446d565b6000828152600d60205260409081902081516101a081019092528054829060ff166003811115610a2f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811115610a67577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526001820154602082015260028201546040808301919091526003830154606083015260048301546080830152805160c081019182905260a09092019190600584019060069082845b815481526020019060010190808311610ab1575050509183525050600b82015460208201526040805160c081018252910190600c830160068282826020028201915b815481526020019060010190808311610af35750505091835250506040805160c081019182905260209092019190601284019060069082845b815481526020019060010190808311610b2c5750505091835250506018820154602082015260198201546040820152601a8201546060820152601b9091015463ffffffff1660809091015292915050565b600060036000858152600d602052604090205460ff166003811115610bcb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14610bd857506000610c24565b6000848152600d602052604090206019015483118015610c0957506000848152600d60205260409020601801548311155b15610c1657506000610c24565b610c21848484613f6f565b90505b9392505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610cb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600b5473ffffffffffffffffffffffffffffffffffffffff83811691161415610d36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f43616e6e6f742062652043414b4520746f6b656e0000000000000000000000006044820152606401610ca8565b610d5773ffffffffffffffffffffffffffffffffffffffff831633836140a1565b6040805173ffffffffffffffffffffffffffffffffffffffff84168152602081018390527f74545154aac348a3eac92596bd1971957ca94795f4e954ec5f613b55fab78129910160405180910390a15050565b60015473ffffffffffffffffffffffffffffffffffffffff16331480610de7575060025473ffffffffffffffffffffffffffffffffffffffff1633145b610e4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f74206f776e6572206f7220696e6a6563746f7200000000000000000000006044820152606401610ca8565b60016000838152600d602052604090205460ff166003811115610e99577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14610f00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c6f7474657279206e6f74206f70656e000000000000000000000000000000006044820152606401610ca8565b600b54610f259073ffffffffffffffffffffffffffffffffffffffff1633308461417a565b6000828152600d60205260408120601a018054839290610f46908490614bae565b909155505060405181815282907f1bbd659dd628a25f7ff2eabb69c74a56939c539728282275c1c9c1a2d3e340499060200160405180910390a25050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611005576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca8565b8061106c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f4d757374206265203e20300000000000000000000000000000000000000000006044820152606401610ca8565b600755565b60015473ffffffffffffffffffffffffffffffffffffffff1633146110f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca8565b60015460405160009173ffffffffffffffffffffffffffffffffffffffff16907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b333b156111ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f436f6e7472616374206e6f7420616c6c6f7765640000000000000000000000006044820152606401610ca8565b333214611233576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f50726f787920636f6e7472616374206e6f7420616c6c6f7765640000000000006044820152606401610ca8565b600260005414156112a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610ca8565b60026000558061130c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4e6f207469636b657420737065636966696564000000000000000000000000006044820152606401610ca8565b600754811115611378576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f546f6f206d616e79207469636b657473000000000000000000000000000000006044820152606401610ca8565b60016000848152600d602052604090205460ff1660038111156113c4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1461142b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4c6f7474657279206973206e6f74206f70656e000000000000000000000000006044820152606401610ca8565b6000838152600d602052604090206002015442106114a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4c6f7474657279206973206f76657200000000000000000000000000000000006044820152606401610ca8565b6000838152600d6020526040812060048101546003909101546114c99190846141de565b600b549091506114f19073ffffffffffffffffffffffffffffffffffffffff1633308461417a565b6000848152600d60205260408120601a018054839290611512908490614bae565b90915550600090505b828110156118ab57600084848381811061155e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b905060200201602081019061157391906148d5565b9050620f42408163ffffffff16101580156115975750621e847f8163ffffffff1611155b6115fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4f7574736964652072616e6765000000000000000000000000000000000000006044820152606401610ca8565b600086815260106020526040812090611617600a84614e36565b611622906001614bc6565b63ffffffff1681526020810191909152604001600090812080549161164683614dd9565b9091555050600086815260106020526040812090611665606484614e36565b61167090600b614bc6565b63ffffffff1681526020810191909152604001600090812080549161169483614dd9565b90915550506000868152601060205260408120906116b46103e884614e36565b6116bf90606f614bc6565b63ffffffff168152602081019190915260400160009081208054916116e383614dd9565b909155505060008681526010602052604081209061170361271084614e36565b61170f90610457614bc6565b63ffffffff1681526020810191909152604001600090812080549161173383614dd9565b9091555050600086815260106020526040812090611754620186a084614e36565b61176090612b67614bc6565b63ffffffff1681526020810191909152604001600090812080549161178483614dd9565b90915550506000868152601060205260408120906117a5620f424084614e36565b6117b2906201b207614bc6565b63ffffffff168152602081019190915260400160009081208054916117d683614dd9565b90915550503360008181526011602090815260408083208a84528252808320600680548254600181018455928652848620909201919091558151808301835263ffffffff808816825281850196875282548652600e90945291842091518254955173ffffffffffffffffffffffffffffffffffffffff16640100000000027fffffffffffffffff000000000000000000000000000000000000000000000000909616931692909217939093179092558154919061189283614dd9565b91905055505080806118a390614dd9565b91505061151b565b50604051828152849033907fd7d247b583de1023852eef87b48f54354dbec771d01bc2cc49e96094efc322b99060200160405180910390a3505060016000555050565b6060808260008167ffffffffffffffff811115611934577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561195d578160200160208202803683370190505b50905060008267ffffffffffffffff8111156119a2577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156119cb578160200160208202803683370190505b50905060005b83811015611bb757600e6000898984818110611a16577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020135815260200190815260200160002060000160009054906101000a900463ffffffff16838281518110611a78577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b63ffffffff909216602092830291909101909101526000600e818a8a85818110611acb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020908102929092013583525081019190915260400160002054640100000000900473ffffffffffffffffffffffffffffffffffffffff161415611b59576001828281518110611b44577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b91151560209283029190910190910152611ba5565b6000828281518110611b94577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b911515602092830291909101909101525b80611baf81614dd9565b9150506119d1565b509093509150505b9250929050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611c47576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca8565b60036005546000908152600d602052604090205460ff166003811115611c96577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14611cfd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4c6f7474657279206e6f7420696e20636c61696d61626c6500000000000000006044820152606401610ca8565b8073ffffffffffffffffffffffffffffffffffffffff1663b37217a4600554600654604051602001611d39929190918252602082015260400190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060e083901b7fffffffff000000000000000000000000000000000000000000000000000000001682526004820152602401600060405180830381600087803b158015611dbb57600080fd5b505af1158015611dcf573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663a1c4f55a6040518163ffffffff1660e01b815260040160206040518083038186803b158015611e1957600080fd5b505afa158015611e2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5191906148f1565b50600c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f383f8cb39dfa7c3fb901a460dd449ea924868f0a92ff03da64740fffa5f1de6290600090a250565b60035473ffffffffffffffffffffffffffffffffffffffff163314611f42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e6f74206f70657261746f7200000000000000000000000000000000000000006044820152606401610ca8565b60026000541415611faf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610ca8565b600260005560016000828152600d602052604090205460ff166003811115612000577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14612067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c6f7474657279206e6f74206f70656e000000000000000000000000000000006044820152606401610ca8565b6000818152600d602052604090206002015442116120e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c6f7474657279206e6f74206f766572000000000000000000000000000000006044820152606401610ca8565b6006546000828152600d6020908152604091829020601901839055600c5482519182018590529181019290925273ffffffffffffffffffffffffffffffffffffffff169063b37217a490606001604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060e083901b7fffffffff000000000000000000000000000000000000000000000000000000001682526004820152602401600060405180830381600087803b1580156121b057600080fd5b505af11580156121c4573d6000803e3d6000fd5b5050506000828152600d602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600217905560065491519182528392507f3728e75294796694d59d2ffced9c394279baf7b9ebd2702db43f5f04bac67929910160405180910390a2506001600055565b60035473ffffffffffffffffffffffffffffffffffffffff1633146122c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e6f74206f70657261746f7200000000000000000000000000000000000000006044820152606401610ca8565b600554158061231c575060036005546000908152600d602052604090205460ff16600381111561231a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b145b612382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4e6f742074696d6520746f207374617274206c6f7474657279000000000000006044820152606401610ca8565b61371461238f4287614d71565b1180156123a757506205472c6123a54287614d71565b105b61240d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4c6f7474657279206c656e677468206f757473696465206f662072616e6765006044820152606401610ca8565b600954841015801561242157506008548411155b612487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4f757473696465206f66206c696d6974730000000000000000000000000000006044820152606401610ca8565b61012c8310156124f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f446973636f756e742064697669736f7220746f6f206c6f7700000000000000006044820152606401610ca8565b610bb881111561255f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f54726561737572792066656520746f6f206869676800000000000000000000006044820152606401610ca8565b60a082013560808301356060840135604085013561258260208701358735614bae565b61258c9190614bae565b6125969190614bae565b6125a09190614bae565b6125aa9190614bae565b61271014612614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f52657761726473206d75737420657175616c20313030303000000000000000006044820152606401610ca8565b6005805490600061262483614dd9565b9091555050604080516101a0810190915280600181526020014281526020018681526020018581526020018481526020018360068060200260405190810160405280929190826006602002808284376000920182905250928452505060208083018590526040805160c080820183528482528184018590528183018590526060808301869052608080840187905260a080850188905285890194909452845180840186528781528087018890528086018890528083018890528082018890528085018890529188019190915260065490870181905291860191909152600a549085015260e09093018290526005548252600d9052208151815482907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600183600381111561277c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055506020820151600182015560408201516002820155606082015160038201556080820151600482015560a08201516127be90600583019060066144ee565b5060c0820151600b82015560e08201516127de90600c83019060066144ee565b506101008201516127f590601283019060066144ee565b5061012082015160188201556101408201516019820155610160820151601a82015561018090910151601b90910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff909216919091179055600554600654600a5460408051428152602081018a9052908101889052606081019290925260808201527f367e70f8c0e0c0a6504d92172bda155c02022d532fc85b5d66a9c49e31c8bc779060a00160405180910390a250506000600a55505050565b60035473ffffffffffffffffffffffffffffffffffffffff163314612939576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e6f74206f70657261746f7200000000000000000000000000000000000000006044820152606401610ca8565b600260005414156129a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610ca8565b60026000818155838152600d602052604090205460ff1660038111156129f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14612a5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4c6f7474657279206e6f7420636c6f73650000000000000000000000000000006044820152606401610ca8565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fbe5d9176040518163ffffffff1660e01b815260040160206040518083038186803b158015612ac457600080fd5b505afa158015612ad8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612afc91906146fc565b8214612b64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4e756d62657273206e6f7420647261776e0000000000000000000000000000006044820152606401610ca8565b600c54604080517fa1c4f55a000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163a1c4f55a916004808301926020929190829003018186803b158015612bcf57600080fd5b505afa158015612be3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c0791906148f1565b6000848152600d60205260408120600b015491925090819061271090612c2d9082614d71565b6000878152600d60205260409020601a0154612c499190614d34565b612c539190614bee565b90506000805b60068163ffffffff161015612fb7576000612c75826005614d88565b90506000612c84826001614bc6565b612c8f90600a614c49565b612c999088614e36565b63ffffffff8084166000908152600f6020526040902054612cbb929116614bc6565b60008a815260106020908152604080832063ffffffff85168452909152902054909150612ce9908790614d71565b60008a8152600d6020526040902060120163ffffffff841660068110612d38577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0155600089815260106020908152604080832063ffffffff85168452909152902054612d65908790614d71565b15612ed9576000898152600d6020526040902060050163ffffffff831660068110612db9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b015415612ed457600089815260106020908152604080832063ffffffff8516845290915290205461271090612def908890614d71565b60008b8152600d60205260409020879060050163ffffffff861660068110612e40577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0154612e4c9190614d34565b612e569190614bee565b612e609190614bee565b60008a8152600d60205260409020600c0163ffffffff841660068110612eaf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0155600089815260106020908152604080832063ffffffff8516845290915290205495505b612fa2565b6000898152600d60205260408120600c0163ffffffff841660068110612f28577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01556000898152600d6020526040902061271090869060050163ffffffff851660068110612f7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0154612f8b9190614d34565b612f959190614bee565b612f9f9085614bae565b93505b50508080612faf90614e12565b915050612c59565b506000868152600d60205260409020601b8101805463ffffffff87167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000090911617905580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166003179055841561302f57600a5560005b6000868152600d60205260409020601a015461304c908390614d71565b6130569082614bae565b600454600b549192506130839173ffffffffffffffffffffffffffffffffffffffff9081169116836140a1565b6005546040805163ffffffff87168152602081018690527f98e31a6607b8b15b4d5b91de54f4c09ffe4c4cf162aa532c70b5213754e2e703910160405180910390a25050600160005550505050565b600061012c841015613140576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d757374206265203e3d204d494e5f444953434f554e545f44495649534f52006044820152606401610ca8565b816131a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4e756d626572206f66207469636b657473206d757374206265203e20300000006044820152606401610ca8565b610c218484846141de565b333b1561321b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f436f6e7472616374206e6f7420616c6c6f7765640000000000000000000000006044820152606401610ca8565b333214613284576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f50726f787920636f6e7472616374206e6f7420616c6c6f7765640000000000006044820152606401610ca8565b600260005414156132f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610ca8565b600260005582811461335f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e6f742073616d65206c656e67746800000000000000000000000000000000006044820152606401610ca8565b826133c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4c656e677468206d757374206265203e300000000000000000000000000000006044820152606401610ca8565b600754831115613432576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f546f6f206d616e79207469636b657473000000000000000000000000000000006044820152606401610ca8565b60036000868152600d602052604090205460ff16600381111561347e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b146134e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4c6f7474657279206e6f7420636c61696d61626c6500000000000000000000006044820152606401610ca8565b6000805b848110156139b757600684848381811061352c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b905060200201602081019061354191906148d5565b63ffffffff16106135ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f427261636b6574206f7574206f662072616e67650000000000000000000000006044820152606401610ca8565b60008686838181106135e9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020135905080600d60008a81526020019081526020016000206019015411613671576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5469636b6574496420746f6f20686967680000000000000000000000000000006044820152606401610ca8565b6000888152600d60205260409020601801548110156136ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5469636b6574496420746f6f206c6f77000000000000000000000000000000006044820152606401610ca8565b6000818152600e6020526040902054640100000000900473ffffffffffffffffffffffffffffffffffffffff163314613781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4e6f7420746865206f776e6572000000000000000000000000000000000000006044820152606401610ca8565b6000818152600e6020526040812080547fffffffffffffffff0000000000000000000000000000000000000000ffffffff16905561380d89838888878181106137f3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b905060200201602081019061380891906148d5565b613f6f565b905080613876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4e6f207072697a6520666f72207468697320627261636b6574000000000000006044820152606401610ca8565b8585848181106138af577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906138c491906148d5565b63ffffffff166005146139965761392f898388888781811061390f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b905060200201602081019061392491906148d5565b613808906001614bc6565b15613996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f427261636b6574206d75737420626520686967686572000000000000000000006044820152606401610ca8565b6139a08185614bae565b9350505080806139af90614dd9565b9150506134e9565b50600b546139dc9073ffffffffffffffffffffffffffffffffffffffff1633836140a1565b6040805182815260208101869052879133917f0f5fca62da8fb5d95525b49e5eaa7b20bc6bd9e2f6b64b493442d1c0bd6ef486910160405180910390a35050600160005550505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314613aa7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca8565b73ffffffffffffffffffffffffffffffffffffffff8316613b24576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616e6e6f74206265207a65726f2061646472657373000000000000000000006044820152606401610ca8565b73ffffffffffffffffffffffffffffffffffffffff8216613ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616e6e6f74206265207a65726f2061646472657373000000000000000000006044820152606401610ca8565b73ffffffffffffffffffffffffffffffffffffffff8116613c1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616e6e6f74206265207a65726f2061646472657373000000000000000000006044820152606401610ca8565b6003805473ffffffffffffffffffffffffffffffffffffffff8581167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316811790935560048054868316908416811790915560028054928616929093168217909255604080519384526020840192909252908201527f3e945b7660001d46cfd5e729545f7f0b6c65bdee54066a91c7acad703f1b731e9060600160405180910390a1505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314613d48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca8565b80821115613db2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6d696e5072696365206d757374206265203c206d6178507269636500000000006044820152606401610ca8565b600991909155600855565b60015473ffffffffffffffffffffffffffffffffffffffff163314613e3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca8565b73ffffffffffffffffffffffffffffffffffffffff8116613ee1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610ca8565b60015460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000838152600d60209081526040808320601b0154858452600e90925282205463ffffffff918216911682613fa5856001614bc6565b613fb090600a614c49565b613fba9083614e36565b63ffffffff8087166000908152600f6020526040902054613fdc929116614bc6565b90506000613feb866001614bc6565b613ff690600a614c49565b6140009085614e36565b63ffffffff8088166000908152600f6020526040902054614022929116614bc6565b90508063ffffffff168263ffffffff161415614094576000888152600d60205260409020600c0163ffffffff871660068110614087577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0154945050505050610c24565b6000945050505050610c24565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526141759084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614215565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526141d89085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016140f3565b50505050565b600083826141ed826001614bae565b6141f79190614d71565b6142018486614d34565b61420b9190614d34565b610c219190614bee565b6000614277826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166143219092919063ffffffff16565b805190915015614175578080602001905181019061429591906146c8565b614175576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610ca8565b6060610c21848460008585843b614394576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ca8565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516143bd91906149dc565b60006040518083038185875af1925050503d80600081146143fa576040519150601f19603f3d011682016040523d82523d6000602084013e6143ff565b606091505b509150915061440f82828661441a565b979650505050505050565b60608315614429575081610c24565b8251156144395782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca89190614a9a565b604080516101a081019091528060008152602001600081526020016000815260200160008152602001600081526020016144a561452c565b8152602001600081526020016144b961452c565b81526020016144c661452c565b8152602001600081526020016000815260200160008152602001600063ffffffff1681525090565b826006810192821561451c579160200282015b8281111561451c578251825591602001919060010190614501565b5061452892915061454a565b5090565b6040518060c001604052806006906020820280368337509192915050565b5b80821115614528576000815560010161454b565b803573ffffffffffffffffffffffffffffffffffffffff8116811461458357600080fd5b919050565b60008083601f840112614599578182fd5b50813567ffffffffffffffff8111156145b0578182fd5b6020830191508360208260051b8501011115611bbf57600080fd5b6000602082840312156145dc578081fd5b610c248261455f565b6000806000606084860312156145f9578182fd5b6146028461455f565b92506146106020850161455f565b915061461e6040850161455f565b90509250925092565b60008060408385031215614639578182fd5b6146428361455f565b946020939093013593505050565b60008060008060808587031215614665578081fd5b61466e8561455f565b966020860135965060408601359560600135945092505050565b6000806020838503121561469a578182fd5b823567ffffffffffffffff8111156146b0578283fd5b6146bc85828601614588565b90969095509350505050565b6000602082840312156146d9578081fd5b8151610c2481614eb7565b6000602082840312156146f5578081fd5b5035919050565b60006020828403121561470d578081fd5b5051919050565b60008060008060006060868803121561472b578081fd5b85359450602086013567ffffffffffffffff80821115614749578283fd5b61475589838a01614588565b9096509450604088013591508082111561476d578283fd5b5061477a88828901614588565b969995985093965092949392505050565b60008060006040848603121561479f578283fd5b83359250602084013567ffffffffffffffff8111156147bc578283fd5b6147c886828701614588565b9497909650939450505050565b600080604083850312156147e7578182fd5b8235915060208301356147f981614eb7565b809150509250929050565b60008060408385031215614816578182fd5b50508035926020909101359150565b600080600060608486031215614839578283fd5b505081359360208301359350604090920135919050565b60008060008060006101408688031215614868578283fd5b85359450602086013593506040860135925061012086018781111561488b578182fd5b94979396509194606001933592915050565b6000806000606084860312156148b1578081fd5b833592506020840135915060408401356148ca81614ec8565b809150509250925092565b6000602082840312156148e6578081fd5b8135610c2481614ec8565b600060208284031215614902578081fd5b8151610c2481614ec8565b6000815180845260208085019450808401835b8381101561493e578151151587529582019590820190600101614920565b509495945050505050565b8060005b60068110156141d857815184526020938401939091019060010161494d565b6000815180845260208085019450808401835b8381101561493e57815163ffffffff168752958201959082019060010161497f565b600481106149d8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b600082516149ee818460208701614dad565b9190910192915050565b6080808252855190820181905260009060209060a0840190828901845b82811015614a3157815184529284019290840190600101614a15565b50505083810382850152614a45818861496c565b9150508281036040840152614a5a818661490d565b91505082606083015295945050505050565b604081526000614a7f604083018561496c565b8281036020840152614a91818561490d565b95945050505050565b6020815260008251806020840152614ab9816040850160208701614dad565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b600061038082019050614aff8284516149a1565b6020830151602083015260408301516040830152606083015160608301526080830151608083015260a0830151614b3960a0840182614949565b5060c0830151610160818185015260e08501519150610180614b5d81860184614949565b6101008601519250614b73610240860184614949565b6101208601516103008601526101408601516103208601529085015161034085015284015163ffffffff811661036085015290505092915050565b60008219821115614bc157614bc1614e59565b500190565b600063ffffffff808316818516808303821115614be557614be5614e59565b01949350505050565b600082614bfd57614bfd614e88565b500490565b60018163ffffffff825b80861115614c4057828204831115614c2657614c26614e59565b80861615614c3357928202925b94851c9491800291614c0c565b50509250929050565b600063ffffffff614c5e818516828516614c66565b949350505050565b600082614c7557506001614d2e565b81614c8257506000614d2e565b8160018114614c985760028114614ca257614cd3565b6001915050614d2e565b60ff841115614cb357614cb3614e59565b6001841b915063ffffffff821115614ccd57614ccd614e59565b50614d2e565b5060208310610133831016604e8410600b8410161715614d0a575081810a63ffffffff811115614d0557614d05614e59565b614d2e565b614d148383614c02565b8063ffffffff04821115614d2a57614d2a614e59565b0290505b92915050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d6c57614d6c614e59565b500290565b600082821015614d8357614d83614e59565b500390565b600063ffffffff83811690831681811015614da557614da5614e59565b039392505050565b60005b83811015614dc8578181015183820152602001614db0565b838111156141d85750506000910152565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e0b57614e0b614e59565b5060010190565b600063ffffffff80831681811415614e2c57614e2c614e59565b6001019392505050565b600063ffffffff80841680614e4d57614e4d614e88565b92169190910692915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b8015158114614ec557600080fd5b50565b63ffffffff81168114614ec557600080fdfea2646970667358221220a51ec081c37362eda1bfcfd498a83c2dddba3e6bfb9d0ae936499ab9b17054a364736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000e09fabb73bd3ade0a17ecc321fd13a19e81ce820000000000000000000000008c6375aab6e5b26a30bf241ebbf29ad6e6c503c2
-----Decoded View---------------
Arg [0] : _cakeTokenAddress (address): 0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82
Arg [1] : _randomGeneratorAddress (address): 0x8c6375Aab6e5B26a30bF241EBBf29AD6e6c503c2
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000e09fabb73bd3ade0a17ecc321fd13a19e81ce82
Arg [1] : 0000000000000000000000008c6375aab6e5b26a30bf241ebbf29ad6e6c503c2
Deployed Bytecode Sourcemap
24291:27679:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48391:1433;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;24878:64;;24923:19;24878:64;;;;;28756:25:1;;;28744:2;28729:18;24878:64:0;28711:76:1;24447:30:0;;;;;;;;;;;;9099:42:1;9087:55;;;9069:74;;9057:2;9042:18;24447:30:0;9024:125:1;24770:42:0;;;;;;24659:46;;;;;;24600:50;;;;;;46102:128;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;47437:641::-;;;;;;:::i;:::-;;:::i;24712:49::-;;;;;;42869:326;;;;;;:::i;:::-;;:::i;:::-;;39400:393;;;;;;:::i;:::-;;:::i;24561:30::-;;;;;;43921:224;;;;;;:::i;:::-;;:::i;24523:31::-;;;;;;2743:148;;;:::i;24821:50::-;;24868:3;24821:50;;45882:115;45973:16;;45882:115;;28938:2214;;;;;;:::i;:::-;;:::i;25103:23::-;;;;;;;;;2092:87;2165:6;;;;2092:87;;46378:702;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;38447:754::-;;;;;;:::i;:::-;;:::i;24410:30::-;;;;;;;;;33608:640;;;;;;:::i;:::-;;:::i;40243:2347::-;;;;;;:::i;:::-;;:::i;34535:3549::-;;;;;;:::i;:::-;;:::i;45358:458::-;;;;;;:::i;:::-;;:::i;24484:30::-;;;;;;;;;31438:2042;;;;;;:::i;:::-;;:::i;44441:670::-;;;;;;:::i;:::-;;:::i;43457:360::-;;;;;;:::i;:::-;;:::i;24960:63::-;;25005:18;24960:63;;25133:45;;;;;;;;;25040:47;;25083:4;25040:47;;3046:244;;;;;;:::i;:::-;;:::i;48391:1433::-;48797:33;;;48688:7;48797:33;;;:26;:33;;;;;;;;:45;;;;;;;;:52;48599:16;;;;;;48688:7;48740:5;;48876:40;48909:7;48797:52;48876:40;:::i;:::-;48866:6;:51;48862:133;;;48943:40;48976:7;48943:30;:40;:::i;:::-;48934:49;;48862:133;49007:33;49057:6;49043:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49043:21:0;;49007:57;;49075:29;49120:6;49107:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49107:20:0;;49075:52;;49138:28;49180:6;49169:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49169:18:0;;49138:49;;49205:9;49200:530;49224:6;49220:1;:10;49200:530;;;49274:26;:33;49301:5;49274:33;;;;;;;;;;;;;;;:45;49308:10;49274:45;;;;;;;;;;;49324:7;49320:1;:11;;;;:::i;:::-;49274:58;;;;;;;;;;;;;;;;;;;;;;;;49252:16;49269:1;49252:19;;;;;;;;;;;;;;;;;;;;;:80;;;;;49366:8;:29;49375:16;49392:1;49375:19;;;;;;;;;;;;;;;;;;;;;;49366:29;;;;;;;;;;;:36;;;;;;;;;;;;49347:13;49361:1;49347:16;;;;;;;;;;;;;;;;;;;;;:55;;;;;;;;;;;49508:1;49461:49;;:8;:29;49470:16;49487:1;49470:19;;;;;;;;;;;;;;;;;;;;;;;;;;;49461:29;;;;;;;;;;-1:-1:-1;49461:29:0;:35;;;;;;:49;49457:262;;;49551:4;49531:14;49546:1;49531:17;;;;;;;;;;;;;;;;:24;;;:17;;;;;;;;;;;:24;49457:262;;;49698:5;49678:14;49693:1;49678:17;;;;;;;;;;;;;;;;:25;;;:17;;;;;;;;;;;:25;49457:262;49232:3;;;;:::i;:::-;;;;49200:530;;;-1:-1:-1;49750:16:0;49768:13;49783:14;49799:16;49809:6;49799:7;:16;:::i;:::-;49742:74;;;;;;;;;;;;;48391:1433;;;;;;;;;:::o;46102:128::-;46166:14;;:::i;:::-;46200:22;;;;:10;:22;;;;;;;46193:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46193:29:0;;;-1:-1:-1;;46193:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46193:29:0;;;-1:-1:-1;;46193:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46193:29:0;;;-1:-1:-1;;46193:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46102:128;-1:-1:-1;;46102:128:0:o;47437:641::-;47582:7;47688:16;47655:22;;;;:10;:22;;;;;:29;;;:49;;;;;;;;;;;;;;;;;47651:90;;-1:-1:-1;47728:1:0;47721:8;;47651:90;47815:22;;;;:10;:22;;;;;:47;;;:59;-1:-1:-1;47814:129:0;;;;-1:-1:-1;47893:22:0;;;;:10;:22;;;;;:36;;;:49;-1:-1:-1;47893:49:0;47814:129;47796:194;;;-1:-1:-1;47977:1:0;47970:8;;47796:194;48009:61;48038:10;48050:9;48061:8;48009:28;:61::i;:::-;48002:68;;47437:641;;;;;;:::o;42869:326::-;2165:6;;2312:23;2165:6;735:10;2312:23;2304:68;;;;;;;19011:2:1;2304:68:0;;;18993:21:1;;;19030:18;;;19023:30;19089:34;19069:18;;;19062:62;19141:18;;2304:68:0;;;;;;;;;43005:9:::1;::::0;::::1;42980:35:::0;;::::1;43005:9:::0;::::1;42980:35;;42972:68;;;::::0;::::1;::::0;;24691:2:1;42972:68:0::1;::::0;::::1;24673:21:1::0;24730:2;24710:18;;;24703:30;24769:22;24749:18;;;24742:50;24809:18;;42972:68:0::1;24663:170:1::0;42972:68:0::1;43053:69;:34;::::0;::::1;43096:10;43109:12:::0;43053:34:::1;:69::i;:::-;43140:47;::::0;;10173:42:1;10161:55;;10143:74;;10248:2;10233:18;;10226:34;;;43140:47:0::1;::::0;10116:18:1;43140:47:0::1;;;;;;;42869:326:::0;;:::o;39400:393::-;2165:6;;;;26880:10;:21;;26879:58;;-1:-1:-1;26921:15:0;;;;26907:10;:29;26879:58;26871:92;;;;;;;21465:2:1;26871:92:0;;;21447:21:1;21504:2;21484:18;;;21477:30;21543:23;21523:18;;;21516:51;21584:18;;26871:92:0;21437:171:1;26871:92:0;39548:11:::1;39515:22;::::0;;;:10:::1;:22;::::0;;;;:29;::::1;;:44;::::0;::::1;;;;;;;;;;;;;;;39507:73;;;::::0;::::1;::::0;;21120:2:1;39507:73:0::1;::::0;::::1;21102:21:1::0;21159:2;21139:18;;;21132:30;21198:18;21178;;;21171:46;21234:18;;39507:73:0::1;21092:166:1::0;39507:73:0::1;39593:9;::::0;:71:::1;::::0;:9:::1;;39628:10;39649:4;39656:7:::0;39593:26:::1;:71::i;:::-;39675:22;::::0;;;:10:::1;:22;::::0;;;;:44:::1;;:55:::0;;39723:7;;39675:22;:55:::1;::::0;39723:7;;39675:55:::1;:::i;:::-;::::0;;;-1:-1:-1;;39748:37:0::1;::::0;28756:25:1;;;39765:10:0;;39748:37:::1;::::0;28744:2:1;28729:18;39748:37:0::1;;;;;;;39400:393:::0;;:::o;43921:224::-;2165:6;;2312:23;2165:6;735:10;2312:23;2304:68;;;;;;;19011:2:1;2304:68:0;;;18993:21:1;;;19030:18;;;19023:30;19089:34;19069:18;;;19062:62;19141:18;;2304:68:0;18983:182:1;2304:68:0;44027:28;44019:52:::1;;;::::0;::::1;::::0;;20420:2:1;44019:52:0::1;::::0;::::1;20402:21:1::0;20459:2;20439:18;;;20432:30;20498:13;20478:18;;;20471:41;20529:18;;44019:52:0::1;20392:161:1::0;44019:52:0::1;44082:29;:55:::0;43921:224::o;2743:148::-;2165:6;;2312:23;2165:6;735:10;2312:23;2304:68;;;;;;;19011:2:1;2304:68:0;;;18993:21:1;;;19030:18;;;19023:30;19089:34;19069:18;;;19062:62;19141:18;;2304:68:0;18983:182:1;2304:68:0;2834:6:::1;::::0;2813:40:::1;::::0;2850:1:::1;::::0;2813:40:::1;2834:6;::::0;2813:40:::1;::::0;2850:1;;2813:40:::1;2864:6;:19:::0;;;::::1;::::0;;2743:148::o;28938:2214::-;26575:10;51905:18;51951:8;26554:57;;;;;;;14067:2:1;26554:57:0;;;14049:21:1;14106:2;14086:18;;;14079:30;14145:22;14125:18;;;14118:50;14185:18;;26554:57:0;14039:170:1;26554:57:0;26630:10;26644:9;26630:23;26622:62;;;;;;;18656:2:1;26622:62:0;;;18638:21:1;18695:2;18675:18;;;18668:30;18734:28;18714:18;;;18707:56;18780:18;;26622:62:0;18628:176:1;26622:62:0;5040:1:::1;5636:7;;:19;;5628:63;;;::::0;::::1;::::0;;25385:2:1;5628:63:0::1;::::0;::::1;25367:21:1::0;25424:2;25404:18;;;25397:30;25463:33;25443:18;;;25436:61;25514:18;;5628:63:0::1;25357:181:1::0;5628:63:0::1;5040:1;5769:7;:18:::0;29115:26;29107:58:::2;;;::::0;::::2;::::0;;17624:2:1;29107:58:0::2;::::0;::::2;17606:21:1::0;17663:2;17643:18;;;17636:30;17702:21;17682:18;;;17675:49;17741:18;;29107:58:0::2;17596:169:1::0;29107:58:0::2;29209:29;::::0;29184:54;::::2;;29176:83;;;::::0;::::2;::::0;;26091:2:1;29176:83:0::2;::::0;::::2;26073:21:1::0;26130:2;26110:18;;;26103:30;26169:18;26149;;;26142:46;26205:18;;29176:83:0::2;26063:166:1::0;29176:83:0::2;29313:11;29280:22;::::0;;;:10:::2;:22;::::0;;;;:29;::::2;;:44;::::0;::::2;;;;;;;;;;;;;;;29272:76;;;::::0;::::2;::::0;;19716:2:1;29272:76:0::2;::::0;::::2;19698:21:1::0;19755:2;19735:18;;;19728:30;19794:21;19774:18;;;19767:49;19833:18;;29272:76:0::2;19688:169:1::0;29272:76:0::2;29385:22;::::0;;;:10:::2;:22;::::0;;;;:30:::2;;::::0;29367:15:::2;:48;29359:76;;;::::0;::::2;::::0;;19372:2:1;29359:76:0::2;::::0;::::2;19354:21:1::0;19411:2;19391:18;;;19384:30;19450:17;19430:18;;;19423:45;19485:18;;29359:76:0::2;19344:165:1::0;29359:76:0::2;29502:28;29582:22:::0;;;:10:::2;:22;::::0;;;;:38:::2;::::0;::::2;::::0;29635:40:::2;::::0;;::::2;::::0;29533:189:::2;::::0;29582:38;29690:14;29533:34:::2;:189::i;:::-;29785:9;::::0;29502:220;;-1:-1:-1;29785:84:0::2;::::0;:9:::2;;29820:10;29841:4;29502:220:::0;29785:26:::2;:84::i;:::-;29953:22;::::0;;;:10:::2;:22;::::0;;;;:44:::2;;:68:::0;;30001:20;;29953:22;:68:::2;::::0;30001:20;;29953:68:::2;:::i;:::-;::::0;;;-1:-1:-1;30039:9:0::2;::::0;-1:-1:-1;30034:1031:0::2;30054:25:::0;;::::2;30034:1031;;;30101:23;30127:14;;30142:1;30127:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30101:43;;30190:7;30170:16;:27;;;;30169:62;;;;;30223:7;30203:16;:27;;;;30169:62;30161:88;;;::::0;::::2;::::0;;18314:2:1;30161:88:0::2;::::0;::::2;18296:21:1::0;18353:2;18333:18;;;18326:30;18392:15;18372:18;;;18365:43;18425:18;;30161:88:0::2;18286:163:1::0;30161:88:0::2;30266:38;::::0;;;:26:::2;:38;::::0;;;;;30310:21:::2;30329:2;30310:16:::0;:21:::2;:::i;:::-;30305:27;::::0;:1:::2;:27;:::i;:::-;30266:67;;::::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;30266:67:0;;;:69;;;::::2;::::0;::::2;:::i;:::-;::::0;;;-1:-1:-1;;30350:38:0::2;::::0;;;:26:::2;:38;::::0;;;;;30395:22:::2;30414:3;30395:16:::0;:22:::2;:::i;:::-;30389:29;::::0;:2:::2;:29;:::i;:::-;30350:69;;::::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;30350:69:0;;;:71;;;::::2;::::0;::::2;:::i;:::-;::::0;;;-1:-1:-1;;30436:38:0::2;::::0;;;:26:::2;:38;::::0;;;;;30482:23:::2;30501:4;30482:16:::0;:23:::2;:::i;:::-;30475:31;::::0;:3:::2;:31;:::i;:::-;30436:71;;::::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;30436:71:0;;;:73;;;::::2;::::0;::::2;:::i;:::-;::::0;;;-1:-1:-1;;30524:38:0::2;::::0;;;:26:::2;:38;::::0;;;;;30571:24:::2;30590:5;30571:16:::0;:24:::2;:::i;:::-;30563:33;::::0;:4:::2;:33;:::i;:::-;30524:73;;::::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;30524:73:0;;;:75;;;::::2;::::0;::::2;:::i;:::-;::::0;;;-1:-1:-1;;30614:38:0::2;::::0;;;:26:::2;:38;::::0;;;;;30662:25:::2;30681:6;30662:16:::0;:25:::2;:::i;:::-;30653:35;::::0;:5:::2;:35;:::i;:::-;30614:75;;::::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;30614:75:0;;;:77;;;::::2;::::0;::::2;:::i;:::-;::::0;;;-1:-1:-1;;30706:38:0::2;::::0;;;:26:::2;:38;::::0;;;;;30755:26:::2;30774:7;30755:16:::0;:26:::2;:::i;:::-;30745:37;::::0;:6:::2;:37;:::i;:::-;30706:77;;::::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;30706:77:0;;;:79;;;::::2;::::0;::::2;:::i;:::-;::::0;;;-1:-1:-1;;30829:10:0::2;30802:38;::::0;;;:26:::2;:38;::::0;;;;;;;:50;;;;;;;;30858:15:::2;::::0;;30802:72;;::::2;::::0;::::2;::::0;;;;;;;;;;::::2;::::0;;;;30919:53;;;;::::2;::::0;;::::2;::::0;;::::2;::::0;;;;::::2;::::0;;;30900:15;;30891:25;;:8:::2;:25:::0;;;;;;:81;;;;;;30802:38:::2;30891:81;::::0;::::2;::::0;;;;;::::2;::::0;;;;;;;::::2;::::0;;;31036:17;;;30858:15;31036:17:::2;::::0;::::2;:::i;:::-;;;;;;30034:1031;30081:3;;;;;:::i;:::-;;;;30034:1031;;;-1:-1:-1::0;31082:62:0::2;::::0;28756:25:1;;;31110:10:0;;31098::::2;::::0;31082:62:::2;::::0;28744:2:1;28729:18;31082:62:0::2;;;;;;;-1:-1:-1::0;;4996:1:0::1;5948:7;:22:::0;-1:-1:-1;;28938:2214:0:o;46378:702::-;46503:15;;46568:10;46551:14;46568:10;46628:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46628:20:0;;46596:52;;46659:28;46701:6;46690:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46690:18:0;;46659:49;;46726:9;46721:301;46745:6;46741:1;:10;46721:301;;;46792:8;:23;46801:10;;46812:1;46801:13;;;;;;;;;;;;;;;;;;;;;46792:23;;;;;;;;;;;:30;;;;;;;;;;;;46773:13;46787:1;46773:16;;;;;;;;;;;;;;;;:49;;;;:16;;;;;;;;;;;:49;46882:1;46841:8;46882:1;46850:10;;46861:1;46850:13;;;;;;;;;;;;;;;;;;;;;;;;46841:23;;-1:-1:-1;46841:23:0;;;;;;;;-1:-1:-1;46841:23:0;:29;;;;;;:43;46837:174;;;46925:4;46905:14;46920:1;46905:17;;;;;;;;;;;;;;;;:24;;;:17;;;;;;;;;;;:24;46837:174;;;46990:5;46970:14;46985:1;46970:17;;;;;;;;;;;;;;;;:25;;;:17;;;;;;;;;;;:25;46837:174;46753:3;;;;:::i;:::-;;;;46721:301;;;-1:-1:-1;47042:13:0;;-1:-1:-1;47057:14:0;-1:-1:-1;;46378:702:0;;;;;;:::o;38447:754::-;2165:6;;2312:23;2165:6;735:10;2312:23;2304:68;;;;;;;19011:2:1;2304:68:0;;;18993:21:1;;;19030:18;;;19023:30;19089:34;19069:18;;;19062:62;19141:18;;2304:68:0;18983:182:1;2304:68:0;38588:16:::1;38560;::::0;38549:28:::1;::::0;;;:10:::1;:28;::::0;;;;:35;::::1;;:55;::::0;::::1;;;;;;;;;;;;;;;38541:92;;;::::0;::::1;::::0;;22161:2:1;38541:92:0::1;::::0;::::1;22143:21:1::0;22200:2;22180:18;;;22173:30;22239:26;22219:18;;;22212:54;22283:18;;38541:92:0::1;22133:174:1::0;38541:92:0::1;38740:23;38717:63;;;38830:16;;38848:15;;38813:51;;;;;;;;8828:19:1::0;;;8872:2;8863:12;;8856:28;8909:2;8900:12;;8818:100;38813:51:0::1;;::::0;;;;::::1;::::0;;;;;;;;38803:62;;38813:51:::1;38803:62:::0;;::::1;::::0;38717:160:::1;::::0;;;;;;;::::1;::::0;::::1;28756:25:1::0;28729:18;;38717:160:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;39011:23;38988:64;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;39067:15:0::1;:65:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;39150:43:::1;::::0;::::1;::::0;-1:-1:-1;;39150:43:0::1;38447:754:::0;:::o;33608:640::-;26769:15;;;;26755:10;:29;26747:54;;;;;;;26436:2:1;26747:54:0;;;26418:21:1;26475:2;26455:18;;;26448:30;26514:14;26494:18;;;26487:42;26546:18;;26747:54:0;26408:162:1;26747:54:0;5040:1:::1;5636:7;;:19;;5628:63;;;::::0;::::1;::::0;;25385:2:1;5628:63:0::1;::::0;::::1;25367:21:1::0;25424:2;25404:18;;;25397:30;25463:33;25443:18;;;25436:61;25514:18;;5628:63:0::1;25357:181:1::0;5628:63:0::1;5040:1;5769:7;:18:::0;33746:11:::2;33713:22;::::0;;;:10:::2;:22;::::0;;;;:29;::::2;;:44;::::0;::::2;;;;;;;;;;;;;;;33705:73;;;::::0;::::2;::::0;;21120:2:1;33705:73:0::2;::::0;::::2;21102:21:1::0;21159:2;21139:18;;;21132:30;21198:18;21178;;;21171:46;21234:18;;33705:73:0::2;21092:166:1::0;33705:73:0::2;33815:22;::::0;;;:10:::2;:22;::::0;;;;:30:::2;;::::0;33797:15:::2;:48;33789:77;;;::::0;::::2;::::0;;25040:2:1;33789:77:0::2;::::0;::::2;25022:21:1::0;25079:2;25059:18;;;25052:30;25118:18;25098;;;25091:46;25154:18;;33789:77:0::2;25012:166:1::0;33789:77:0::2;33927:15;::::0;33877:22:::2;::::0;;;:10:::2;:22;::::0;;;;;;;;:47:::2;;:65:::0;;;34026:15:::2;::::0;34076:45;;;;::::2;8828:19:1::0;;;8863:12;;;8856:28;;;;34026:15:0::2;;::::0;:31:::2;::::0;8900:12:1;;34076:45:0::2;::::0;;;;::::2;::::0;;;;;;;;34066:56;;34076:45:::2;34066:56:::0;;::::2;::::0;34026:98:::2;::::0;;;;;;;::::2;::::0;::::2;28756:25:1::0;28729:18;;34026:98:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;;34137:22:0::2;::::0;;;:10:::2;:22;::::0;;;;;;;;:44;;;::::2;34169:12;34137:44;::::0;;34224:15:::2;::::0;34199:41;;28756:25:1;;;34137:22:0;;-1:-1:-1;34199:41:0::2;::::0;28729:18:1;34199:41:0::2;;;;;;;-1:-1:-1::0;4996:1:0::1;5948:7;:22:::0;33608:640::o;40243:2347::-;26769:15;;;;26755:10;:29;26747:54;;;;;;;26436:2:1;26747:54:0;;;26418:21:1;26475:2;26455:18;;;26448:30;26514:14;26494:18;;;26487:42;26546:18;;26747:54:0;26408:162:1;26747:54:0;40515:16:::1;::::0;:21;;40514:84:::1;;-1:-1:-1::0;40581:16:0::1;40553;::::0;40542:28:::1;::::0;;;:10:::1;:28;::::0;;;;:35;::::1;;:55;::::0;::::1;;;;;;;;;;;;;;;40514:84;40492:159;;;::::0;::::1;::::0;;14416:2:1;40492:159:0::1;::::0;::::1;14398:21:1::0;14455:2;14435:18;;;14428:30;14494:27;14474:18;;;14467:55;14539:18;;40492:159:0::1;14388:175:1::0;40492:159:0::1;24923:19;40688:26;40699:15;40688:8:::0;:26:::1;:::i;:::-;40687:49;40686:106;;;;-1:-1:-1::0;25005:18:0::1;40743:26;40754:15;40743:8:::0;:26:::1;:::i;:::-;40742:49;40686:106;40664:187;;;::::0;::::1;::::0;;20760:2:1;40664:187:0::1;::::0;::::1;20742:21:1::0;20799:2;20779:18;;;20772:30;20838:33;20818:18;;;20811:61;20889:18;;40664:187:0::1;20732:181:1::0;40664:187:0::1;40909:20;;40887:18;:42;;40886:92;;;;;40957:20;;40935:18;:42;;40886:92;40864:159;;;::::0;::::1;::::0;;21815:2:1;40864:159:0::1;::::0;::::1;21797:21:1::0;21854:2;21834:18;;;21827:30;21893:19;21873:18;;;21866:47;21930:18;;40864:159:0::1;21787:167:1::0;40864:159:0::1;24868:3;41044:16;:40;;41036:77;;;::::0;::::1;::::0;;22514:2:1;41036:77:0::1;::::0;::::1;22496:21:1::0;22553:2;22533:18;;;22526:30;22592:26;22572:18;;;22565:54;22636:18;;41036:77:0::1;22486:174:1::0;41036:77:0::1;25083:4;41132:12;:32;;41124:66;;;::::0;::::1;::::0;;13310:2:1;41124:66:0::1;::::0;::::1;13292:21:1::0;13349:2;13329:18;;;13322:30;13388:23;13368:18;;;13361:51;13429:18;;41124:66:0::1;13282:171:1::0;41124:66:0::1;41426:20:::0;;::::1;;41386::::0;;::::1;;41346::::0;;::::1;;41306::::0;;::::1;;41226:60;41426:20;41266::::0;::::1;;41226::::0;::::1;:60;:::i;:::-;:100;;;;:::i;:::-;:140;;;;:::i;:::-;:180;;;;:::i;:::-;:220;;;;:::i;:::-;41451:5;41225:231;41203:305;;;::::0;::::1;::::0;;17271:2:1;41203:305:0::1;::::0;::::1;17253:21:1::0;17310:2;17290:18;;;17283:30;17349:26;17329:18;;;17322:54;17393:18;;41203:305:0::1;17243:174:1::0;41203:305:0::1;41521:16;:18:::0;;;:16:::1;:18;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;41583:726:0::1;::::0;;::::1;::::0;::::1;::::0;;;;41614:11:::1;41583:726;;;;41651:15;41583:726;;;;41690:8;41583:726;;;;41732:18;41583:726;;;;41782:16;41583:726;;;;41831:17;41583:726;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;-1:-1:-1;41583:726:0;;;-1:-1:-1;;41583:726:0::1;::::0;;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42132:15:::1;::::0;41583:726;;;;;;;;;;;;;42241:27:::1;::::0;41583:726;;;;;;;;;;;41563:16:::1;::::0;41552:28;;:10:::1;:28:::0;;;:757;;;;:28;;:757;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;41552: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;41552: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;41552:757:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;;:::i;:::-;-1:-1:-1::0;41552: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;;42353:16:::1;::::0;42470:15:::1;::::0;42500:27:::1;::::0;42327:211:::1;::::0;;42384:15:::1;29304:25:1::0;;29360:2;29345:18;;29338:34;;;29388:18;;;29381:34;;;29446:2;29431:18;;29424:34;;;;29489:3;29474:19;;29467:35;42327:211:0::1;::::0;29291:3:1;29276:19;42327:211:0::1;;;;;;;-1:-1:-1::0;;42581:1:0::1;42551:27;:31:::0;-1:-1:-1;;;40243:2347:0:o;34535:3549::-;26769:15;;;;26755:10;:29;26747:54;;;;;;;26436:2:1;26747:54:0;;;26418:21:1;26475:2;26455:18;;;26448:30;26514:14;26494:18;;;26487:42;26546:18;;26747:54:0;26408:162:1;26747:54:0;5040:1:::1;5636:7;;:19;;5628:63;;;::::0;::::1;::::0;;25385:2:1;5628:63:0::1;::::0;::::1;25367:21:1::0;25424:2;25404:18;;;25397:30;25463:33;25443:18;;;25436:61;25514:18;;5628:63:0::1;25357:181:1::0;5628:63:0::1;5040:1;5769:7;:18:::0;;;34728:22;;;:10:::2;:22;::::0;;;;:29;::::2;;:45;::::0;::::2;;;;;;;;;;;;;;;34720:75;;;::::0;::::2;::::0;;25745:2:1;34720:75:0::2;::::0;::::2;25727:21:1::0;25784:2;25764:18;;;25757:30;25823:19;25803:18;;;25796:47;25860:18;;34720:75:0::2;25717:167:1::0;34720:75:0::2;34828:15;;;;;;;;;;;:35;;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34814:10;:51;34806:81;;;::::0;::::2;::::0;;23934:2:1;34806:81:0::2;::::0;::::2;23916:21:1::0;23973:2;23953:18;;;23946:30;24012:19;23992:18;;;23985:47;24049:18;;34806:81:0::2;23906:167:1::0;34806:81:0::2;35019:15;::::0;:34:::2;::::0;;;;;;;34998:18:::2;::::0;35019:15:::2;;::::0;:32:::2;::::0;:34:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;:15;:34;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35141:40;35361:22:::0;;;:10:::2;:22;::::0;;;;:34:::2;;::::0;34998:55;;-1:-1:-1;35141:40:0;;;35411:5:::2;::::0;35353:42:::2;::::0;35411:5;35353:42:::2;:::i;:::-;35304:22;::::0;;;:10:::2;:22;::::0;;;;:44:::2;;::::0;35303:93:::2;::::0;;::::2;:::i;:::-;35287:129;;;;:::i;:::-;35254:162:::0;-1:-1:-1;35488:34:0::2;::::0;35622:1785:::2;35645:1;35641;:5;;;35622:1785;;;35668:8;35679:5;35683:1:::0;35679::::2;:5;:::i;:::-;35668:16:::0;-1:-1:-1;35699:31:0::2;35786:5;35668:16:::0;35790:1:::2;35786:5;:::i;:::-;35773:19;::::0;35780:2:::2;35773:19;:::i;:::-;35758:35;::::0;:11;:35:::2;:::i;:::-;35733:21;::::0;;::::2;;::::0;;;:18:::2;:21;::::0;;;;;:61:::2;::::0;;:21:::2;:61;:::i;:::-;35879:38;::::0;;;:26:::2;:38;::::0;;;;;;;:64:::2;::::0;::::2;::::0;;;;;;;;35699:95;;-1:-1:-1;35879:116:0::2;::::0;35963:32;;35879:116:::2;:::i;:::-;35811:22;::::0;;;:10:::2;:22;::::0;;;;:45:::2;;:48;::::0;::::2;;::::0;::::2;;;;;;;;;;;;;;:184:::0;36115:38:::2;::::0;;;:26:::2;:38;::::0;;;;;;;:64:::2;::::0;::::2;::::0;;;;;;;;:99:::2;::::0;36182:32;;36115:99:::2;:::i;:::-;36114:123:::0;36092:1304:::2;;36401:22;::::0;;;:10:::2;:22;::::0;;;;:39:::2;;:42;::::0;::::2;;::::0;::::2;;;;;;;;;;;;;;::::0;:47;36397:622:::2;;36644:38;::::0;;;:26:::2;:38;::::0;;;;;;;:64:::2;::::0;::::2;::::0;;;;;;;;36806:5:::2;::::0;36644:132:::2;::::0;36744:32;;36644:132:::2;:::i;:::-;36543:22;::::0;;;:10:::2;:22;::::0;;;;36588;;36543:39:::2;;:42;::::0;::::2;;::::0;::::2;;;;;;;;;;;;;;;:67;;;;:::i;:::-;36542:235;;;;:::i;:::-;36541:270;;;;:::i;:::-;36473:22;::::0;;;:10:::2;:22;::::0;;;;:37:::2;;:40;::::0;::::2;;::::0;::::2;;;;;;;;;;;;;;:338:::0;36935:38:::2;::::0;;;:26:::2;:38;::::0;;;;;;;:64:::2;::::0;::::2;::::0;;;;;;;;;-1:-1:-1;36397:622:0::2;36092:1304;;;37209:1;37166:22:::0;;;:10:::2;:22;::::0;;;;:37:::2;;:40;::::0;::::2;;::::0;::::2;;;;;;;;;;;;;;:44:::0;37283:22:::2;::::0;;;:10:::2;:22;::::0;;;;37375:5:::2;::::0;37328:22;;37283:39:::2;;:42;::::0;::::2;;::::0;::::2;;;;;;;;;;;;;;;:67;;;;:::i;:::-;37282:98;;;;:::i;:::-;37231:149;::::0;;::::2;:::i;:::-;;;36092:1304;35622:1785;;35648:3;;;;;:::i;:::-;;;;35622:1785;;;-1:-1:-1::0;37468:22:0::2;::::0;;;:10:::2;:22;::::0;;;;:34:::2;::::0;::::2;:48:::0;;::::2;::::0;::::2;::::0;;;::::2;;::::0;;37527;;;::::2;37559:16;37527:48;::::0;;37588:148;::::2;;;37623:27;:56:::0;37723:1:::2;37588:148;37779:22;::::0;;;:10:::2;:22;::::0;;;;:44:::2;;::::0;:69:::2;::::0;37826:22;;37779:69:::2;:::i;:::-;37748:101;::::0;;::::2;:::i;:::-;37931:15;::::0;37908:9:::2;::::0;37748:101;;-1:-1:-1;37908:67:0::2;::::0;37931:15:::2;37908:9:::0;;::::2;::::0;37931:15:::2;37748:101:::0;37908:22:::2;:67::i;:::-;38012:16;::::0;37993:83:::2;::::0;;29716:10:1;29704:23;;29686:42;;29759:2;29744:18;;29737:34;;;37993:83:0::2;::::0;29659:18:1;37993:83:0::2;;;;;;;-1:-1:-1::0;;4996:1:0::1;5948:7;:22:::0;-1:-1:-1;;;;34535:3549:0:o;45358:458::-;45530:7;24868:3;45558:16;:40;;45550:84;;;;;;;27122:2:1;45550:84:0;;;27104:21:1;27161:2;27141:18;;;27134:30;27200:33;27180:18;;;27173:61;27251:18;;45550:84:0;27094:181:1;45550:84:0;45653:19;45645:61;;;;;;;23576:2:1;45645:61:0;;;23558:21:1;23615:2;23595:18;;;23588:30;23654:31;23634:18;;;23627:59;23703:18;;45645:61:0;23548:179:1;45645:61:0;45726:82;45761:16;45779:12;45793:14;45726:34;:82::i;31438:2042::-;26575:10;51905:18;51951:8;26554:57;;;;;;;14067:2:1;26554:57:0;;;14049:21:1;14106:2;14086:18;;;14079:30;14145:22;14125:18;;;14118:50;14185:18;;26554:57:0;14039:170:1;26554:57:0;26630:10;26644:9;26630:23;26622:62;;;;;;;18656:2:1;26622:62:0;;;18638:21:1;18695:2;18675:18;;;18668:30;18734:28;18714:18;;;18707:56;18780:18;;26622:62:0;18628:176:1;26622:62:0;5040:1:::1;5636:7;;:19;;5628:63;;;::::0;::::1;::::0;;25385:2:1;5628:63:0::1;::::0;::::1;25367:21:1::0;25424:2;25404:18;;;25397:30;25463:33;25443:18;;;25436:61;25514:18;;5628:63:0::1;25357:181:1::0;5628:63:0::1;5040:1;5769:7;:18:::0;31636:37;;::::2;31628:65;;;::::0;::::2;::::0;;15819:2:1;31628:65:0::2;::::0;::::2;15801:21:1::0;15858:2;15838:18;;;15831:30;15897:17;15877:18;;;15870:45;15932:18;;31628:65:0::2;15791:165:1::0;31628:65:0::2;31712:22:::0;31704:52:::2;;;::::0;::::2;::::0;;12964:2:1;31704:52:0::2;::::0;::::2;12946:21:1::0;13003:2;12983:18;;;12976:30;13042:19;13022:18;;;13015:47;13079:18;;31704:52:0::2;12936:167:1::0;31704:52:0::2;31796:29;::::0;31775:50;::::2;;31767:79;;;::::0;::::2;::::0;;26091:2:1;31767:79:0::2;::::0;::::2;26073:21:1::0;26130:2;26110:18;;;26103:30;26169:18;26149;;;26142:46;26205:18;;31767:79:0::2;26063:166:1::0;31767:79:0::2;31898:16;31865:22;::::0;;;:10:::2;:22;::::0;;;;:29;::::2;;:49;::::0;::::2;;;;;;;;;;;;;;;31857:83;;;::::0;::::2;::::0;;16570:2:1;31857:83:0::2;::::0;::::2;16552:21:1::0;16609:2;16589:18;;;16582:30;16648:23;16628:18;;;16621:51;16689:18;;31857:83:0::2;16542:171:1::0;31857:83:0::2;32004:30;::::0;32047:1217:::2;32067:21:::0;;::::2;32047:1217;;;32133:1;32118:9;;32128:1;32118:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:16;;;32110:49;;;::::0;::::2;::::0;;14770:2:1;32110:49:0::2;::::0;::::2;14752:21:1::0;14809:2;14789:18;;;14782:30;14848:22;14828:18;;;14821:50;14888:18;;32110:49:0::2;14742:170:1::0;32110:49:0::2;32203:20;32226:10;;32237:1;32226:13;;;;;;;;;;;;;;;;;;;;;32203:36;;32314:12;32264:10;:22;32275:10;32264:22;;;;;;;;;;;:47;;;:62;32256:92;;;::::0;::::2;::::0;;15473:2:1;32256:92:0::2;::::0;::::2;15455:21:1::0;15512:2;15492:18;;;15485:30;15551:19;15531:18;;;15524:47;15588:18;;32256:92:0::2;15445:167:1::0;32256:92:0::2;32371:22;::::0;;;:10:::2;:22;::::0;;;;:36:::2;;::::0;:52;-1:-1:-1;32371:52:0::2;32363:81;;;::::0;::::2;::::0;;26777:2:1;32363:81:0::2;::::0;::::2;26759:21:1::0;26816:2;26796:18;;;26789:30;26855:18;26835;;;26828:46;26891:18;;32363:81:0::2;26749:166:1::0;32363:81:0::2;32481:22;::::0;;;:8:::2;:22;::::0;;;;:28;;;::::2;;;32467:10;:42;32459:68;;;::::0;::::2;::::0;;17972:2:1;32459:68:0::2;::::0;::::2;17954:21:1::0;18011:2;17991:18;;;17984:30;18050:15;18030:18;;;18023:43;18083:18;;32459:68:0::2;17944:163:1::0;32459:68:0::2;32645:1;32606:22:::0;;;:8:::2;:22;::::0;;;;:41;;;::::2;::::0;;32692:68:::2;32721:10:::0;32615:12;32747:9;;32757:1;32747:12;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32692:28;:68::i;:::-;32664:96:::0;-1:-1:-1;32844:22:0;32836:60:::2;;;::::0;::::2;::::0;;15119:2:1;32836:60:0::2;::::0;::::2;15101:21:1::0;15158:2;15138:18;;;15131:30;15197:27;15177:18;;;15170:55;15242:18;;32836:60:0::2;15091:175:1::0;32836:60:0::2;32917:9;;32927:1;32917:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:17;;32933:1;32917:17;32913:231;;32985:72;33014:10;33026:12;33040:9;;33050:1;33040:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:16;::::0;33055:1:::2;33040:16;:::i;32985:72::-;:77:::0;32955:173:::2;;;::::0;::::2;::::0;;23225:2:1;32955:173:0::2;::::0;::::2;23207:21:1::0;23264:2;23244:18;;;23237:30;23303:24;23283:18;;;23276:52;23345:18;;32955:173:0::2;23197:172:1::0;32955:173:0::2;33209:43;33235:17:::0;33209:43;::::2;:::i;:::-;;;32047:1217;;32090:3;;;;;:::i;:::-;;;;32047:1217;;;-1:-1:-1::0;33317:9:0::2;::::0;:58:::2;::::0;:9:::2;;33340:10;33352:22:::0;33317::::2;:58::i;:::-;33393:79;::::0;;28966:25:1;;;29022:2;29007:18;;29000:34;;;33442:10:0;;33406::::2;::::0;33393:79:::2;::::0;28939:18:1;33393:79:0::2;;;;;;;-1:-1:-1::0;;4996:1:0::1;5948:7;:22:::0;-1:-1:-1;;;;31438:2042:0:o;44441:670::-;2165:6;;2312:23;2165:6;735:10;2312:23;2304:68;;;;;;;19011:2:1;2304:68:0;;;18993:21:1;;;19030:18;;;19023:30;19089:34;19069:18;;;19062:62;19141:18;;2304:68:0;18983:182:1;2304:68:0;44643:30:::1;::::0;::::1;44635:65;;;::::0;::::1;::::0;;16920:2:1;44635:65:0::1;::::0;::::1;16902:21:1::0;16959:2;16939:18;;;16932:30;16998:24;16978:18;;;16971:52;17040:18;;44635:65:0::1;16892:172:1::0;44635:65:0::1;44719:30;::::0;::::1;44711:65;;;::::0;::::1;::::0;;16920:2:1;44711:65:0::1;::::0;::::1;16902:21:1::0;16959:2;16939:18;;;16932:30;16998:24;16978:18;;;16971:52;17040:18;;44711:65:0::1;16892:172:1::0;44711:65:0::1;44795:30;::::0;::::1;44787:65;;;::::0;::::1;::::0;;16920:2:1;44787:65:0::1;::::0;::::1;16902:21:1::0;16959:2;16939:18;;;16932:30;16998:24;16978:18;;;16971:52;17040:18;;44787:65:0::1;16892:172:1::0;44787:65:0::1;44865:15;:34:::0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;44910:15:::1;:34:::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;44955:15:::1;:34:::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;45007:96:::1;::::0;;9417:34:1;;;9482:2;9467:18;;9460:43;;;;9519:18;;;9512:43;45007:96:0::1;::::0;9344:2:1;9329:18;45007:96:0::1;;;;;;;44441:670:::0;;;:::o;43457:360::-;2165:6;;2312:23;2165:6;735:10;2312:23;2304:68;;;;;;;19011:2:1;2304:68:0;;;18993:21:1;;;19030:18;;;19023:30;19089:34;19069:18;;;19062:62;19141:18;;2304:68:0;18983:182:1;2304:68:0;43644:21:::1;43619;:46;;43611:86;;;::::0;::::1;::::0;;20064:2:1;43611:86:0::1;::::0;::::1;20046:21:1::0;20103:2;20083:18;;;20076:30;20142:29;20122:18;;;20115:57;20189:18;;43611:86:0::1;20036:177:1::0;43611:86:0::1;43710:20;:44:::0;;;;43765:20:::1;:44:::0;43457:360::o;3046:244::-;2165:6;;2312:23;2165:6;735:10;2312:23;2304:68;;;;;;;19011:2:1;2304:68:0;;;18993:21:1;;;19030:18;;;19023:30;19089:34;19069:18;;;19062:62;19141:18;;2304:68:0;18983:182:1;2304:68:0;3135:22:::1;::::0;::::1;3127:73;;;::::0;::::1;::::0;;13660:2:1;3127:73:0::1;::::0;::::1;13642:21:1::0;13699:2;13679:18;;;13672:30;13738:34;13718:18;;;13711:62;13809:8;13789:18;;;13782:36;13835:19;;3127:73:0::1;13632:228:1::0;3127:73:0::1;3237:6;::::0;3216:38:::1;::::0;::::1;::::0;;::::1;::::0;3237:6:::1;::::0;3216:38:::1;::::0;3237:6:::1;::::0;3216:38:::1;3265:6;:17:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;3046:244::o;50069:1032::-;50220:7;50312:22;;;:10;:22;;;;;;;;:34;;;50455:19;;;:8;:19;;;;;:26;50312:34;;;;;50455:26;50220:7;50691:12;:8;50312:34;50691:12;:::i;:::-;50678:26;;50685:2;50678:26;:::i;:::-;50655:50;;:19;:50;:::i;:::-;50610:28;;;;;;;;:18;:28;;;;;;:96;;;:28;:96;:::i;:::-;50576:130;-1:-1:-1;50719:28:0;50809:12;:8;50820:1;50809:12;:::i;:::-;50796:26;;50803:2;50796:26;:::i;:::-;50782:41;;:10;:41;:::i;:::-;50750:28;;;;;;;;:18;:28;;;;;;:74;;;:28;:74;:::i;:::-;50719:105;;50949:21;50921:49;;:24;:49;;;50917:177;;;50994:22;;;;:10;:22;;;;;:37;;:47;;;;;;;;;;;;;;;;;;;;50987:54;;;;;;;;50917:177;51081:1;51074:8;;;;;;;;17694:211;17838:58;;10173:42:1;10161:55;;17838:58:0;;;10143:74:1;10233:18;;;10226:34;;;17811:86:0;;17831:5;;17861:23;;10116:18:1;;17838:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17811:19;:86::i;:::-;17694:211;;;:::o;17913:248::-;18084:68;;9778:42:1;9847:15;;;18084:68:0;;;9829:34:1;9899:15;;9879:18;;;9872:43;9931:18;;;9924:34;;;18057:96:0;;18077:5;;18107:27;;9741:18:1;;18084:68:0;9723:241:1;18057:96:0;17913:248;;;;:::o;51398:300::-;51571:7;51674:16;51655:14;51632:20;51674:16;51651:1;51632:20;:::i;:::-;:37;;;;:::i;:::-;51599:29;51614:14;51599:12;:29;:::i;:::-;:71;;;;:::i;:::-;51598:92;;;;:::i;20321:774::-;20745:23;20771:69;20799:4;20771:69;;;;;;;;;;;;;;;;;20779:5;20771:27;;;;:69;;;;;:::i;:::-;20855:17;;20745:95;;-1:-1:-1;20855:21:0;20851:237;;21010:10;20999:30;;;;;;;;;;;;:::i;:::-;20991:85;;;;;;;24280:2:1;20991:85:0;;;24262:21:1;24319:2;24299:18;;;24292:30;24358:34;24338:18;;;24331:62;24429:12;24409:18;;;24402:40;24459:19;;20991:85:0;24252:232:1;12520:229:0;12657:12;12689:52;12711:6;12719:4;12725:1;12728:12;12657;51905:18;;13927:60;;;;;;;22867:2:1;13927:60:0;;;22849:21:1;22906:2;22886:18;;;22879:30;22945:31;22925:18;;;22918:59;22994:18;;13927:60:0;22839:179:1;13927:60:0;14061:12;14075:23;14102:6;:11;;14121:5;14128:4;14102:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14060:73;;;;14151:52;14169:7;14178:10;14190:12;14151:17;:52::i;:::-;14144:59;13640:571;-1:-1:-1;;;;;;;13640:571:0:o;16289:777::-;16439:12;16468:7;16464:595;;;-1:-1:-1;16499:10:0;16492:17;;16464:595;16613:17;;:21;16609:439;;16876:10;16870:17;16937:15;16924:10;16920:2;16916:19;16909:44;16824:148;17019:12;17012:20;;;;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:196:1;82:20;;142:42;131:54;;121:65;;111:2;;200:1;197;190:12;111:2;63:147;;;:::o;215:395::-;278:8;288:6;342:3;335:4;327:6;323:17;319:27;309:2;;367:8;357;350:26;309:2;-1:-1:-1;397:20:1;;440:18;429:30;;426:2;;;479:8;469;462:26;426:2;523:4;515:6;511:17;499:29;;583:3;576:4;566:6;563:1;559:14;551:6;547:27;543:38;540:47;537:2;;;600:1;597;590:12;615:196;674:6;727:2;715:9;706:7;702:23;698:32;695:2;;;748:6;740;733:22;695:2;776:29;795:9;776:29;:::i;816:344::-;893:6;901;909;962:2;950:9;941:7;937:23;933:32;930:2;;;983:6;975;968:22;930:2;1011:29;1030:9;1011:29;:::i;:::-;1001:39;;1059:38;1093:2;1082:9;1078:18;1059:38;:::i;:::-;1049:48;;1116:38;1150:2;1139:9;1135:18;1116:38;:::i;:::-;1106:48;;920:240;;;;;:::o;1165:264::-;1233:6;1241;1294:2;1282:9;1273:7;1269:23;1265:32;1262:2;;;1315:6;1307;1300:22;1262:2;1343:29;1362:9;1343:29;:::i;:::-;1333:39;1419:2;1404:18;;;;1391:32;;-1:-1:-1;;;1252:177:1:o;1434:401::-;1520:6;1528;1536;1544;1597:3;1585:9;1576:7;1572:23;1568:33;1565:2;;;1619:6;1611;1604:22;1565:2;1647:29;1666:9;1647:29;:::i;:::-;1637:39;1723:2;1708:18;;1695:32;;-1:-1:-1;1774:2:1;1759:18;;1746:32;;1825:2;1810:18;1797:32;;-1:-1:-1;1555:280:1;-1:-1:-1;;;1555:280:1:o;1840:457::-;1926:6;1934;1987:2;1975:9;1966:7;1962:23;1958:32;1955:2;;;2008:6;2000;1993:22;1955:2;2053:9;2040:23;2086:18;2078:6;2075:30;2072:2;;;2123:6;2115;2108:22;2072:2;2167:70;2229:7;2220:6;2209:9;2205:22;2167:70;:::i;:::-;2256:8;;2141:96;;-1:-1:-1;1945:352:1;-1:-1:-1;;;;1945:352:1:o;2302:255::-;2369:6;2422:2;2410:9;2401:7;2397:23;2393:32;2390:2;;;2443:6;2435;2428:22;2390:2;2480:9;2474:16;2499:28;2521:5;2499:28;:::i;2562:190::-;2621:6;2674:2;2662:9;2653:7;2649:23;2645:32;2642:2;;;2695:6;2687;2680:22;2642:2;-1:-1:-1;2723:23:1;;2632:120;-1:-1:-1;2632:120:1:o;2757:194::-;2827:6;2880:2;2868:9;2859:7;2855:23;2851:32;2848:2;;;2901:6;2893;2886:22;2848:2;-1:-1:-1;2929:16:1;;2838:113;-1:-1:-1;2838:113:1:o;2956:870::-;3086:6;3094;3102;3110;3118;3171:2;3159:9;3150:7;3146:23;3142:32;3139:2;;;3192:6;3184;3177:22;3139:2;3233:9;3220:23;3210:33;;3294:2;3283:9;3279:18;3266:32;3317:18;3358:2;3350:6;3347:14;3344:2;;;3379:6;3371;3364:22;3344:2;3423:70;3485:7;3476:6;3465:9;3461:22;3423:70;:::i;:::-;3512:8;;-1:-1:-1;3397:96:1;-1:-1:-1;3600:2:1;3585:18;;3572:32;;-1:-1:-1;3616:16:1;;;3613:2;;;3650:6;3642;3635:22;3613:2;;3694:72;3758:7;3747:8;3736:9;3732:24;3694:72;:::i;:::-;3129:697;;;;-1:-1:-1;3129:697:1;;-1:-1:-1;3785:8:1;;3668:98;3129:697;-1:-1:-1;;;3129:697:1:o;3831:524::-;3925:6;3933;3941;3994:2;3982:9;3973:7;3969:23;3965:32;3962:2;;;4015:6;4007;4000:22;3962:2;4056:9;4043:23;4033:33;;4117:2;4106:9;4102:18;4089:32;4144:18;4136:6;4133:30;4130:2;;;4181:6;4173;4166:22;4130:2;4225:70;4287:7;4278:6;4267:9;4263:22;4225:70;:::i;:::-;3952:403;;4314:8;;-1:-1:-1;4199:96:1;;-1:-1:-1;;;;3952:403:1:o;4360:319::-;4425:6;4433;4486:2;4474:9;4465:7;4461:23;4457:32;4454:2;;;4507:6;4499;4492:22;4454:2;4548:9;4535:23;4525:33;;4608:2;4597:9;4593:18;4580:32;4621:28;4643:5;4621:28;:::i;:::-;4668:5;4658:15;;;4444:235;;;;;:::o;4684:258::-;4752:6;4760;4813:2;4801:9;4792:7;4788:23;4784:32;4781:2;;;4834:6;4826;4819:22;4781:2;-1:-1:-1;;4862:23:1;;;4932:2;4917:18;;;4904:32;;-1:-1:-1;4771:171:1:o;4947:326::-;5024:6;5032;5040;5093:2;5081:9;5072:7;5068:23;5064:32;5061:2;;;5114:6;5106;5099:22;5061:2;-1:-1:-1;;5142:23:1;;;5212:2;5197:18;;5184:32;;-1:-1:-1;5263:2:1;5248:18;;;5235:32;;5051:222;-1:-1:-1;5051:222:1:o;5278:550::-;5398:6;5406;5414;5422;5430;5483:3;5471:9;5462:7;5458:23;5454:33;5451:2;;;5505:6;5497;5490:22;5451:2;5546:9;5533:23;5523:33;;5603:2;5592:9;5588:18;5575:32;5565:42;;5654:2;5643:9;5639:18;5626:32;5616:42;;5692:3;5681:9;5677:19;5715:7;5711:2;5708:15;5705:2;;;5741:6;5733;5726:22;5705:2;5441:387;;;;-1:-1:-1;5441:387:1;;5784:2;5769:18;;5806:16;;5441:387;-1:-1:-1;;5441:387:1:o;5833:391::-;5909:6;5917;5925;5978:2;5966:9;5957:7;5953:23;5949:32;5946:2;;;5999:6;5991;5984:22;5946:2;6040:9;6027:23;6017:33;;6097:2;6086:9;6082:18;6069:32;6059:42;;6151:2;6140:9;6136:18;6123:32;6164:30;6188:5;6164:30;:::i;:::-;6213:5;6203:15;;;5936:288;;;;;:::o;6229:255::-;6287:6;6340:2;6328:9;6319:7;6315:23;6311:32;6308:2;;;6361:6;6353;6346:22;6308:2;6405:9;6392:23;6424:30;6448:5;6424:30;:::i;6489:259::-;6558:6;6611:2;6599:9;6590:7;6586:23;6582:32;6579:2;;;6632:6;6624;6617:22;6579:2;6669:9;6663:16;6688:30;6712:5;6688:30;:::i;6753:450::-;6803:3;6841:5;6835:12;6868:6;6863:3;6856:19;6894:4;6923:2;6918:3;6914:12;6907:19;;6960:2;6953:5;6949:14;6981:3;6993:185;7007:6;7004:1;7001:13;6993:185;;;7082:13;;7075:21;7068:29;7056:42;;7118:12;;;;7153:15;;;;7029:1;7022:9;6993:185;;;-1:-1:-1;7194:3:1;;6811:392;-1:-1:-1;;;;;6811:392:1:o;7208:326::-;7301:5;7324:1;7334:194;7348:4;7345:1;7342:11;7334:194;;;7407:13;;7395:26;;7444:4;7468:12;;;;7503:15;;;;7368:1;7361:9;7334:194;;7539:453;7591:3;7629:5;7623:12;7656:6;7651:3;7644:19;7682:4;7711:2;7706:3;7702:12;7695:19;;7748:2;7741:5;7737:14;7769:3;7781:186;7795:6;7792:1;7789:13;7781:186;;;7860:13;;7875:10;7856:30;7844:43;;7907:12;;;;7942:15;;;;7817:1;7810:9;7781:186;;7997:291;8075:1;8068:5;8065:12;8055:2;;8111:77;8108:1;8101:88;8212:4;8209:1;8202:15;8240:4;8237:1;8230:15;8055:2;8264:18;;8045:243::o;8392:274::-;8521:3;8559:6;8553:13;8575:53;8621:6;8616:3;8609:4;8601:6;8597:17;8575:53;:::i;:::-;8644:16;;;;;8529:137;-1:-1:-1;;8529:137:1:o;10271:1075::-;10637:3;10650:22;;;10721:13;;10622:19;;;10743:22;;;10589:4;;10819;;10796:3;10781:19;;;10846:15;;;10589:4;10892:169;10906:6;10903:1;10900:13;10892:169;;;10967:13;;10955:26;;11001:12;;;;11036:15;;;;10928:1;10921:9;10892:169;;;10896:3;;;11106:9;11101:3;11097:19;11092:2;11081:9;11077:18;11070:47;11140:40;11176:3;11168:6;11140:40;:::i;:::-;11126:54;;;11228:9;11220:6;11216:22;11211:2;11200:9;11196:18;11189:50;11256:41;11290:6;11282;11256:41;:::i;:::-;11248:49;;;11333:6;11328:2;11317:9;11313:18;11306:34;10598:748;;;;;;;:::o;11351:453::-;11600:2;11589:9;11582:21;11563:4;11626:55;11677:2;11666:9;11662:18;11654:6;11626:55;:::i;:::-;11729:9;11721:6;11717:22;11712:2;11701:9;11697:18;11690:50;11757:41;11791:6;11783;11757:41;:::i;:::-;11749:49;11572:232;-1:-1:-1;;;;;11572:232:1:o;12315:442::-;12464:2;12453:9;12446:21;12427:4;12496:6;12490:13;12539:6;12534:2;12523:9;12519:18;12512:34;12555:66;12614:6;12609:2;12598:9;12594:18;12589:2;12581:6;12577:15;12555:66;:::i;:::-;12673:2;12661:15;12678:66;12657:88;12642:104;;;;12748:2;12638:113;;12436:321;-1:-1:-1;;12436:321:1:o;27280:1325::-;27420:4;27462:3;27451:9;27447:19;27439:27;;27475:48;27513:9;27504:6;27498:13;27475:48;:::i;:::-;27579:4;27571:6;27567:17;27561:24;27554:4;27543:9;27539:20;27532:54;27642:4;27634:6;27630:17;27624:24;27617:4;27606:9;27602:20;27595:54;27705:4;27697:6;27693:17;27687:24;27680:4;27669:9;27665:20;27658:54;27768:4;27760:6;27756:17;27750:24;27743:4;27732:9;27728:20;27721:54;27822:4;27814:6;27810:17;27804:24;27837:60;27891:4;27880:9;27876:20;27862:12;27837:60;:::i;:::-;;27934:4;27926:6;27922:17;27916:24;27959:6;28001:2;27996;27985:9;27981:18;27974:30;28053:4;28045:6;28041:17;28035:24;28013:46;;28078:6;28093:60;28149:2;28138:9;28134:18;28118:14;28093:60;:::i;:::-;28202:6;28194;28190:19;28184:26;28162:48;;28219:64;28275:6;28264:9;28260:22;28244:14;28219:64;:::i;:::-;28341:6;28329:19;;28323:26;28314:6;28299:22;;28292:58;28408:6;28396:19;;28390:26;28381:6;28366:22;;28359:58;28463:15;;;28457:22;28448:6;28433:22;;28426:54;28517:15;;28511:22;8369:10;8358:22;;28591:6;28576:22;;8346:35;28511:22;-1:-1:-1;28542:57:1;27429:1176;;;;:::o;29782:128::-;29822:3;29853:1;29849:6;29846:1;29843:13;29840:2;;;29859:18;;:::i;:::-;-1:-1:-1;29895:9:1;;29830:80::o;29915:228::-;29954:3;29982:10;30019:2;30016:1;30012:10;30049:2;30046:1;30042:10;30080:3;30076:2;30072:12;30067:3;30064:21;30061:2;;;30088:18;;:::i;:::-;30124:13;;29962:181;-1:-1:-1;;;;29962:181:1:o;30148:120::-;30188:1;30214;30204:2;;30219:18;;:::i;:::-;-1:-1:-1;30253:9:1;;30194:74::o;30273:449::-;30392:1;30435:5;30358:10;30392:1;30449:267;30470:7;30460:8;30457:21;30449:267;;;30526:4;30521:3;30517:14;30511:4;30508:24;30505:2;;;30535:18;;:::i;:::-;30585:7;30575:8;30571:22;30568:2;;;30605:16;;;;30568:2;30684:22;;;;30644:15;;;;30449:267;;;30453:3;;30337:385;;;;;:::o;30727:176::-;30785:5;30815:10;30843:54;30893:2;30883:8;30879:17;30874:2;30868:4;30864:13;30843:54;:::i;:::-;30834:63;30795:108;-1:-1:-1;;;;30795:108:1:o;30908:930::-;30957:5;30987:8;30977:2;;-1:-1:-1;31028:1:1;31042:5;;30977:2;31076:4;31066:2;;-1:-1:-1;31113:1:1;31127:5;;31066:2;31158:4;31176:1;31171:59;;;;31244:1;31239:190;;;;31151:278;;31171:59;31201:1;31192:10;;31215:5;;;31239:190;31276:3;31266:8;31263:17;31260:2;;;31283:18;;:::i;:::-;31339:1;31329:8;31325:16;31316:25;;31367:10;31360:5;31357:21;31354:2;;;31381:18;;:::i;:::-;31414:5;;;31151:278;;31513:2;31503:8;31500:16;31494:3;31488:4;31485:13;31481:36;31475:2;31465:8;31462:16;31457:2;31451:4;31448:12;31444:35;31441:77;31438:2;;;-1:-1:-1;31550:19:1;;;31595:10;31585:21;;31582:2;;;31609:18;;:::i;:::-;31642:5;;31438:2;31689:34;31714:8;31708:4;31689:34;:::i;:::-;31763:6;31751:10;31747:23;31738:7;31735:36;31732:2;;;31774:18;;:::i;:::-;31812:20;;-1:-1:-1;30967:871:1;;;;;:::o;31843:228::-;31883:7;32009:1;31941:66;31937:74;31934:1;31931:81;31926:1;31919:9;31912:17;31908:105;31905:2;;;32016:18;;:::i;:::-;-1:-1:-1;32056:9:1;;31895:176::o;32076:125::-;32116:4;32144:1;32141;32138:8;32135:2;;;32149:18;;:::i;:::-;-1:-1:-1;32186:9:1;;32125:76::o;32206:221::-;32245:4;32274:10;32334;;;;32304;;32356:12;;;32353:2;;;32371:18;;:::i;:::-;32408:13;;32254:173;-1:-1:-1;;;32254:173:1:o;32432:258::-;32504:1;32514:113;32528:6;32525:1;32522:13;32514:113;;;32604:11;;;32598:18;32585:11;;;32578:39;32550:2;32543:10;32514:113;;;32645:6;32642:1;32639:13;32636:2;;;-1:-1:-1;;32680:1:1;32662:16;;32655:27;32485:205::o;32695:195::-;32734:3;32765:66;32758:5;32755:77;32752:2;;;32835:18;;:::i;:::-;-1:-1:-1;32882:1:1;32871:13;;32742:148::o;32895:201::-;32933:3;32961:10;33006:2;32999:5;32995:14;33033:2;33024:7;33021:15;33018:2;;;33039:18;;:::i;:::-;33088:1;33075:15;;32941:155;-1:-1:-1;;;32941:155:1:o;33101:183::-;33132:1;33158:10;33195:2;33192:1;33188:10;33217:3;33207:2;;33224:18;;:::i;:::-;33262:10;;33258:20;;;;;33138:146;-1:-1:-1;;33138:146:1:o;33289:184::-;33341:77;33338:1;33331:88;33438:4;33435:1;33428:15;33462:4;33459:1;33452:15;33478:184;33530:77;33527:1;33520:88;33627:4;33624:1;33617:15;33651:4;33648:1;33641:15;33667:118;33753:5;33746:13;33739:21;33732:5;33729:32;33719:2;;33775:1;33772;33765:12;33719:2;33709:76;:::o;33790:121::-;33875:10;33868:5;33864:22;33857:5;33854:33;33844:2;;33901:1;33898;33891:12
Swarm Source
ipfs://a51ec081c37362eda1bfcfd498a83c2dddba3e6bfb9d0ae936499ab9b17054a3
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.
Address QR Code
My Address - Private Name Tag or Note
My Name Tag:
Private Note:
Please DO NOT store any passwords or private keys here.
The compiled contract might be susceptible to FullInlinerNonExpressionSplitArgumentEvaluationOrder (low-severity), MissingSideEffectsOnSelectorAccess (low-severity), AbiReencodingHeadOverflowWithStaticArrayCleanup (medium-severity), DirtyBytesArrayToStorage (low-severity), DataLocationChangeInInternalOverride (very low-severity), NestedCalldataArrayAbiReencodingSizeValidation (very low-severity), SignedImmutables (very low-severity) Solidity Compiler Bugs.
Connect a Wallet
Connect a Wallet
Connect a Wallet
Before You Copy
Transaction Private Note
This website uses cookies to improve your experience. By continuing to use this website, you agree to its Terms and Privacy Policy.