Cryo Explorer Ethereum Mainnet

Address Contract Partially Verified

Address 0x2aE21DE576E0Fe0367651dDCF76e04dD0608c076
Balance 0 ETH
Nonce 1
Code Size 22817 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

22817 bytes
0x6080604052600436106103395760003560e01c80638906758d116101ab578063c17b5b8c116100f7578063e2f4560511610095578063f2fde38b1161006f578063f2fde38b14610c0d578063f54afa7814610c36578063f5648a4f14610c61578063f637434214610c7857610340565b8063e2f4560514610b8c578063ee40166e14610bb7578063f11a24d314610be257610340565b8063cc2ffe7c116100d1578063cc2ffe7c14610ad0578063d85ba06314610afb578063dc3f0d0f14610b26578063dd62ed3e14610b4f57610340565b8063c17b5b8c14610a55578063c18bc19514610a7e578063cc274b2914610aa757610340565b8063a9059cbb11610164578063bb8d51311161013e578063bb8d5131146109ab578063bbc0c742146109d6578063c024666814610a01578063c054f2f414610a2a57610340565b8063a9059cbb14610906578063aa4bde2814610943578063b62496f51461096e57610340565b80638906758d1461080a5780638a8c523c146108335780638da5cb5b1461084a57806395d89b41146108755780639a7a23d6146108a0578063a457c2d7146108c957610340565b80635c068a8c11610285578063715018a61161022357806377a3b609116101fd57806377a3b6091461074e5780638095d564146107795780638366e79a146107a257806388e765ff146107df57610340565b8063715018a6146106f7578063751039fc1461070e5780637571336a1461072557610340565b80636a486a8e1161025f5780636a486a8e146106395780636b2fb124146106645780636ddd17131461068f57806370a08231146106ba57610340565b80635c068a8c146105ba5780636605bfda146105e557806366d602ae1461060e57610340565b806323b872dd116102f257806339509351116102cc57806339509351146104fc57806349bd5a5e146105395780634a62bb65146105645780635b5c251f1461058f57610340565b806323b872dd1461046b5780632be32b61146104a8578063313ce567146104d157610340565b806306fdde0314610345578063095ea7b31461037057806310d5de53146103ad5780631694505e146103ea57806318160ddd146104155780631a8145bb1461044057610340565b3661034057005b600080fd5b34801561035157600080fd5b5061035a610ca3565b60405161036791906141ce565b60405180910390f35b34801561037c57600080fd5b5061039760048036038101906103929190614289565b610d35565b6040516103a491906142e4565b60405180910390f35b3480156103b957600080fd5b506103d460048036038101906103cf91906142ff565b610d53565b6040516103e191906142e4565b60405180910390f35b3480156103f657600080fd5b506103ff610d73565b60405161040c919061438b565b60405180910390f35b34801561042157600080fd5b5061042a610d97565b60405161043791906143b5565b60405180910390f35b34801561044c57600080fd5b50610455610da1565b60405161046291906143b5565b60405180910390f35b34801561047757600080fd5b50610492600480360381019061048d91906143d0565b610da7565b60405161049f91906142e4565b60405180910390f35b3480156104b457600080fd5b506104cf60048036038101906104ca9190614423565b610e9f565b005b3480156104dd57600080fd5b506104e6611002565b6040516104f3919061446c565b60405180910390f35b34801561050857600080fd5b50610523600480360381019061051e9190614289565b61100b565b60405161053091906142e4565b60405180910390f35b34801561054557600080fd5b5061054e6110b7565b60405161055b9190614496565b60405180910390f35b34801561057057600080fd5b506105796110db565b60405161058691906142e4565b60405180910390f35b34801561059b57600080fd5b506105a46110ee565b6040516105b19190614496565b60405180910390f35b3480156105c657600080fd5b506105cf611114565b6040516105dc91906143b5565b60405180910390f35b3480156105f157600080fd5b5061060c600480360381019061060791906142ff565b61111a565b005b34801561061a57600080fd5b506106236112a8565b60405161063091906143b5565b60405180910390f35b34801561064557600080fd5b5061064e6112ae565b60405161065b91906143b5565b60405180910390f35b34801561067057600080fd5b506106796112b4565b60405161068691906143b5565b60405180910390f35b34801561069b57600080fd5b506106a46112ba565b6040516106b191906142e4565b60405180910390f35b3480156106c657600080fd5b506106e160048036038101906106dc91906142ff565b6112cd565b6040516106ee91906143b5565b60405180910390f35b34801561070357600080fd5b5061070c611315565b005b34801561071a57600080fd5b5061072361146d565b005b34801561073157600080fd5b5061074c600480360381019061074791906144dd565b61154d565b005b34801561075a57600080fd5b506107636116d4565b60405161077091906143b5565b60405180910390f35b34801561078557600080fd5b506107a0600480360381019061079b919061451d565b6116da565b005b3480156107ae57600080fd5b506107c960048036038101906107c49190614570565b6117f4565b6040516107d691906142e4565b60405180910390f35b3480156107eb57600080fd5b506107f4611a33565b60405161080191906143b5565b60405180910390f35b34801561081657600080fd5b50610831600480360381019061082c91906142ff565b611a39565b005b34801561083f57600080fd5b50610848611bc7565b005b34801561085657600080fd5b5061085f611d57565b60405161086c9190614496565b60405180910390f35b34801561088157600080fd5b5061088a611d81565b60405161089791906141ce565b60405180910390f35b3480156108ac57600080fd5b506108c760048036038101906108c291906144dd565b611e13565b005b3480156108d557600080fd5b506108f060048036038101906108eb9190614289565b611f47565b6040516108fd91906142e4565b60405180910390f35b34801561091257600080fd5b5061092d60048036038101906109289190614289565b612032565b60405161093a91906142e4565b60405180910390f35b34801561094f57600080fd5b50610958612050565b60405161096591906143b5565b60405180910390f35b34801561097a57600080fd5b50610995600480360381019061099091906142ff565b612056565b6040516109a291906142e4565b60405180910390f35b3480156109b757600080fd5b506109c0612076565b6040516109cd91906143b5565b60405180910390f35b3480156109e257600080fd5b506109eb61207c565b6040516109f891906142e4565b60405180910390f35b348015610a0d57600080fd5b50610a286004803603810190610a2391906144dd565b61208f565b005b348015610a3657600080fd5b50610a3f6121cf565b604051610a4c9190614496565b60405180910390f35b348015610a6157600080fd5b50610a7c6004803603810190610a77919061451d565b6121f5565b005b348015610a8a57600080fd5b50610aa56004803603810190610aa09190614423565b61230f565b005b348015610ab357600080fd5b50610ace6004803603810190610ac99190614423565b612472565b005b348015610adc57600080fd5b50610ae561251f565b604051610af291906143b5565b60405180910390f35b348015610b0757600080fd5b50610b10612525565b604051610b1d91906143b5565b60405180910390f35b348015610b3257600080fd5b50610b4d6004803603810190610b489190614423565b61252b565b005b348015610b5b57600080fd5b50610b766004803603810190610b719190614570565b61268e565b604051610b8391906143b5565b60405180910390f35b348015610b9857600080fd5b50610ba1612715565b604051610bae91906143b5565b60405180910390f35b348015610bc357600080fd5b50610bcc61271b565b604051610bd991906143b5565b60405180910390f35b348015610bee57600080fd5b50610bf7612721565b604051610c0491906143b5565b60405180910390f35b348015610c1957600080fd5b50610c346004803603810190610c2f91906142ff565b612727565b005b348015610c4257600080fd5b50610c4b6128ee565b604051610c5891906143b5565b60405180910390f35b348015610c6d57600080fd5b50610c766128f4565b005b348015610c8457600080fd5b50610c8d6129f5565b604051610c9a91906143b5565b60405180910390f35b606060038054610cb2906145df565b80601f0160208091040260200160405190810160405280929190818152602001828054610cde906145df565b8015610d2b5780601f10610d0057610100808354040283529160200191610d2b565b820191906000526020600020905b815481529060010190602001808311610d0e57829003601f168201915b5050505050905090565b6000610d49610d426129fb565b8484612a03565b6001905092915050565b601b6020528060005260406000206000915054906101000a900460ff1681565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6000600254905090565b60185481565b6000610db4848484612bce565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610dff6129fb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610e7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7690614683565b60405180910390fd5b610e9385610e8b6129fb565b858403612a03565b60019150509392505050565b610ea76129fb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2d906146ef565b60405180910390fd5b670de0b6b3a76400006103e86001610f4c610d97565b610f56919061473e565b610f6091906147c7565b610f6a91906147c7565b811015610fac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa39061486a565b60405180910390fd5b670de0b6b3a764000081610fc0919061473e565b6006819055507ffcc0366804aaa8dbf88a2924100c733b70dec8445957a5d5f8ff92898de41009600654604051610ff791906143b5565b60405180910390a150565b60006012905090565b60006110ad6110186129fb565b8484600160006110266129fb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110a8919061488a565b612a03565b6001905092915050565b7f000000000000000000000000ba9d017919b477a5a6fc6385d16d91f43451554381565b600e60009054906101000a900460ff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60105481565b6111226129fb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a8906146ef565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611221576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121890614952565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f2e1e696cfb265fa16e1170d24ef04cb2262772bde00ecf34d80bae6722487b7f60405160405180910390a250565b60075481565b60135481565b60145481565b600e60029054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61131d6129fb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a3906146ef565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6114756129fb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611504576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fb906146ef565b60405180910390fd5b6000600e60006101000a81548160ff0219169083151502179055507fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c60405160405180910390a1565b6115556129fb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146115e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115db906146ef565b60405180910390fd5b80611679577f000000000000000000000000ba9d017919b477a5a6fc6385d16d91f43451554373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611678576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166f906149e4565b60405180910390fd5b5b80601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60125481565b6116e26129fb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611771576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611768906146ef565b60405180910390fd5b826010819055508160118190555080601281905550601254601154601054611799919061488a565b6117a3919061488a565b600f81905550601e600f5411156117ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e690614a50565b60405180910390fd5b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185c90614abc565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ec90614b4e565b60405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016119309190614496565b602060405180830381865afa15801561194d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119719190614b83565b90508373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b81526004016119ae929190614bb0565b6020604051808303816000875af11580156119cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f19190614bee565b91507fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e4388482604051611a24929190614bb0565b60405180910390a15092915050565b60065481565b611a416129fb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ad0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac7906146ef565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3790614c8d565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f647cd1cbe5341aa880069f5c966ac6cf0ed473b7c0bf494fb7fc7ca46dc4cc7860405160405180910390a250565b611bcf6129fb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c55906146ef565b60405180910390fd5b600e60019054906101000a900460ff1615611cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca590614cf9565b60405180910390fd5b6001600e60016101000a81548160ff0219169083151502179055506001600e60026101000a81548160ff0219169083151502179055507fe8a59d3db38e5220ac9d0f72590b7ac876e0916dc8f4db3e7614e6f91fe52089600e60019054906101000a900460ff16604051611d2291906142e4565b60405180910390a1600e60019054906101000a900460ff168015611d4857506000600d54145b15611d555743600d819055505b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054611d90906145df565b80601f0160208091040260200160405190810160405280929190818152602001828054611dbc906145df565b8015611e095780601f10611dde57610100808354040283529160200191611e09565b820191906000526020600020905b815481529060010190602001808311611dec57829003601f168201915b5050505050905090565b611e1b6129fb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea1906146ef565b60405180910390fd5b7f000000000000000000000000ba9d017919b477a5a6fc6385d16d91f43451554373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3090614d8b565b60405180910390fd5b611f4382826137d0565b5050565b60008060016000611f566129fb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015612013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200a90614e1d565b60405180910390fd5b61202761201e6129fb565b85858403612a03565b600191505092915050565b600061204661203f6129fb565b8484612bce565b6001905092915050565b60085481565b601c6020528060005260406000206000915054906101000a900460ff1681565b60165481565b600e60019054906101000a900460ff1681565b6120976129fb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612126576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211d906146ef565b60405180910390fd5b80601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7826040516121c391906142e4565b60405180910390a25050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6121fd6129fb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461228c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612283906146ef565b60405180910390fd5b8260148190555081601581905550806016819055506016546015546014546122b4919061488a565b6122be919061488a565b601381905550601e601354111561230a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230190614a50565b60405180910390fd5b505050565b6123176129fb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146123a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239d906146ef565b60405180910390fd5b670de0b6b3a76400006103e860036123bc610d97565b6123c6919061473e565b6123d091906147c7565b6123da91906147c7565b81101561241c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241390614eaf565b60405180910390fd5b670de0b6b3a764000081612430919061473e565b6008819055507fefc9add9a9b7382de284ef5ad69d8ea863e2680492b21a81948c2d5f04a442bc60085460405161246791906143b5565b60405180910390a150565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612502576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f990614b4e565b60405180910390fd5b670de0b6b3a764000081612516919061473e565b600a8190555050565b60175481565b600f5481565b6125336129fb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146125c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b9906146ef565b60405180910390fd5b670de0b6b3a76400006103e860016125d8610d97565b6125e2919061473e565b6125ec91906147c7565b6125f691906147c7565b811015612638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262f90614f41565b60405180910390fd5b670de0b6b3a76400008161264c919061473e565b6007819055507f53c4eb831d8cfeb750f1c62590d8cd30f4c6f0380d29a05caa09f0d92588560e60075460405161268391906143b5565b60405180910390a150565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600a5481565b600d5481565b60115481565b61272f6129fb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146127be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b5906146ef565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561282e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282590614fd3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60195481565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297d90614b4e565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16476040516129aa90615024565b60006040518083038185875af1925050503d80600081146129e7576040519150601f19603f3d011682016040523d82523d6000602084013e6129ec565b606091505b50508091505050565b60155481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6a906150ab565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ae3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ada9061513d565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612bc191906143b5565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c35906151cf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca590615261565b60405180910390fd5b60008111612cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce8906152cd565b60405180910390fd5b600e60009054906101000a900460ff16156132a057612d0e611d57565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612d7c5750612d4c611d57565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612db55750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612def575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b1561329f57600e60019054906101000a900460ff16612f5e57601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612ea95750601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612ee8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612edf90615339565b60405180910390fd5b612ef0611d57565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612f5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f54906153a5565b60405180910390fd5b5b601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156130015750601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156130a85760065481111561304b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304290615437565b60405180910390fd5b600854613057836112cd565b82613062919061488a565b11156130a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161309a906154a3565b60405180910390fd5b61329e565b601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561314b5750601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561319a57600754811115613195576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318c90615535565b60405180910390fd5b61329d565b601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615801561323e5750601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561329c5760085461324f836112cd565b8261325a919061488a565b111561329b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613292906154a3565b60405180910390fd5b5b5b5b5b5b60006132ab306112cd565b90506000600a5482101590508080156132d05750600e60029054906101000a900460ff165b80156132e95750600960009054906101000a900460ff16155b801561333f5750601c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156133955750601a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156133eb5750601a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561342f576001600960006101000a81548160ff02191690831515021790555061341361387b565b6000600960006101000a81548160ff0219169083151502179055505b600060019050601a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806134d65750601a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156134e057600090505b60008082156137bb576000600d541180156135085750436001600d54613506919061488a565b115b1561355a576064600a8761351c919061473e565b61352691906147c7565b905061355588600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683613b18565b61378c565b601c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156135b557506000601354115b15613674576064601354876135ca919061473e565b6135d491906147c7565b9150601354601554836135e7919061473e565b6135f191906147c7565b60186000828254613602919061488a565b925050819055506013546014548361361a919061473e565b61362491906147c7565b60176000828254613635919061488a565b925050819055506013546016548361364d919061473e565b61365791906147c7565b60196000828254613668919061488a565b9250508190555061378b565b601c60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156136cf57506000600f54115b1561378a576064600f54876136e4919061473e565b6136ee91906147c7565b9150600f5460115483613701919061473e565b61370b91906147c7565b6018600082825461371c919061488a565b92505081905550600f5460105483613734919061473e565b61373e91906147c7565b6017600082825461374f919061488a565b92505081905550600f5460125483613767919061473e565b61377191906147c7565b60196000828254613782919061488a565b925050819055505b5b5b60008211156137a1576137a0883084613b18565b5b80826137ad919061488a565b866137b89190615555565b95505b6137c6888888613b18565b5050505050505050565b80601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506138318282613d83565b8015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b6000613886306112cd565b9050600060195460175460185461389d919061488a565b6138a7919061488a565b905060008214806138b85750600081145b156138c4575050613b16565b6005600a546138d3919061473e565b8211156138ec576005600a546138e9919061473e565b91505b60008060028360185486613900919061473e565b61390a91906147c7565b61391491906147c7565b905061392a81856139259190615555565b613e17565b600047905060008190506000600260185461394591906147c7565b866139509190615555565b6017548461395e919061473e565b61396891906147c7565b90506000600260185461397b91906147c7565b876139869190615555565b60195485613994919061473e565b61399e91906147c7565b905080826139ac919061488a565b836139b79190615555565b92506000601881905550600060178190555060006019819055506000851180156139e15750600083115b156139f1576139f08584614054565b5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681604051613a3790615024565b60006040518083038185875af1925050503d8060008114613a74576040519150601f19603f3d011682016040523d82523d6000602084013e613a79565b606091505b505080965050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051613ac590615024565b60006040518083038185875af1925050503d8060008114613b02576040519150601f19603f3d011682016040523d82523d6000602084013e613b07565b606091505b50508096505050505050505050505b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613b88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b7f906151cf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bef90615261565b60405180910390fd5b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613c7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c75906155fb565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613d11919061488a565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613d7591906143b5565b60405180910390a350505050565b80601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd67468282604051613e0b92919061561b565b60405180910390a15050565b6000600267ffffffffffffffff811115613e3457613e33615644565b5b604051908082528060200260200182016040528015613e625781602001602082028036833780820191505090505b5090503081600081518110613e7a57613e79615673565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613f1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f4391906156b7565b81600181518110613f5757613f56615673565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613fbc307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84612a03565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040161401e9594939291906157dd565b600060405180830381600087803b15801561403857600080fd5b505af115801561404c573d6000803e3d6000fd5b505050505050565b61407f307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84612a03565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663f305d7198230856000806140c9611d57565b426040518863ffffffff1660e01b81526004016140eb96959493929190615837565b60606040518083038185885af1158015614109573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061412e9190615898565b5050505050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561416f578082015181840152602081019050614154565b8381111561417e576000848401525b50505050565b6000601f19601f8301169050919050565b60006141a082614135565b6141aa8185614140565b93506141ba818560208601614151565b6141c381614184565b840191505092915050565b600060208201905081810360008301526141e88184614195565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614220826141f5565b9050919050565b61423081614215565b811461423b57600080fd5b50565b60008135905061424d81614227565b92915050565b6000819050919050565b61426681614253565b811461427157600080fd5b50565b6000813590506142838161425d565b92915050565b600080604083850312156142a05761429f6141f0565b5b60006142ae8582860161423e565b92505060206142bf85828601614274565b9150509250929050565b60008115159050919050565b6142de816142c9565b82525050565b60006020820190506142f960008301846142d5565b92915050565b600060208284031215614315576143146141f0565b5b60006143238482850161423e565b91505092915050565b6000819050919050565b600061435161434c614347846141f5565b61432c565b6141f5565b9050919050565b600061436382614336565b9050919050565b600061437582614358565b9050919050565b6143858161436a565b82525050565b60006020820190506143a0600083018461437c565b92915050565b6143af81614253565b82525050565b60006020820190506143ca60008301846143a6565b92915050565b6000806000606084860312156143e9576143e86141f0565b5b60006143f78682870161423e565b93505060206144088682870161423e565b925050604061441986828701614274565b9150509250925092565b600060208284031215614439576144386141f0565b5b600061444784828501614274565b91505092915050565b600060ff82169050919050565b61446681614450565b82525050565b6000602082019050614481600083018461445d565b92915050565b61449081614215565b82525050565b60006020820190506144ab6000830184614487565b92915050565b6144ba816142c9565b81146144c557600080fd5b50565b6000813590506144d7816144b1565b92915050565b600080604083850312156144f4576144f36141f0565b5b60006145028582860161423e565b9250506020614513858286016144c8565b9150509250929050565b600080600060608486031215614536576145356141f0565b5b600061454486828701614274565b935050602061455586828701614274565b925050604061456686828701614274565b9150509250925092565b60008060408385031215614587576145866141f0565b5b60006145958582860161423e565b92505060206145a68582860161423e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806145f757607f821691505b6020821081141561460b5761460a6145b0565b5b50919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b600061466d602883614140565b915061467882614611565b604082019050919050565b6000602082019050818103600083015261469c81614660565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006146d9602083614140565b91506146e4826146a3565b602082019050919050565b60006020820190508181036000830152614708816146cc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061474982614253565b915061475483614253565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561478d5761478c61470f565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006147d282614253565b91506147dd83614253565b9250826147ed576147ec614798565b5b828204905092915050565b7f43616e6e6f7420736574206d61782062757920616d6f756e74206c6f7765722060008201527f7468616e20302e31250000000000000000000000000000000000000000000000602082015250565b6000614854602983614140565b915061485f826147f8565b604082019050919050565b6000602082019050818103600083015261488381614847565b9050919050565b600061489582614253565b91506148a083614253565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156148d5576148d461470f565b5b828201905092915050565b7f5f54726561737572794164647265737320616464726573732063616e6e6f742060008201527f6265203000000000000000000000000000000000000000000000000000000000602082015250565b600061493c602483614140565b9150614947826148e0565b604082019050919050565b6000602082019050818103600083015261496b8161492f565b9050919050565b7f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060008201527f6d61782074786e00000000000000000000000000000000000000000000000000602082015250565b60006149ce602783614140565b91506149d982614972565b604082019050919050565b600060208201905081810360008301526149fd816149c1565b9050919050565b7f46656573206d7573742062652033302520206f72206c65737300000000000000600082015250565b6000614a3a601983614140565b9150614a4582614a04565b602082019050919050565b60006020820190508181036000830152614a6981614a2d565b9050919050565b7f5f746f6b656e20616464726573732063616e6e6f742062652030000000000000600082015250565b6000614aa6601a83614140565b9150614ab182614a70565b602082019050919050565b60006020820190508181036000830152614ad581614a99565b9050919050565b7f6f6e6c79205472656173757279416464726573732063616e207769746864726160008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000614b38602183614140565b9150614b4382614adc565b604082019050919050565b60006020820190508181036000830152614b6781614b2b565b9050919050565b600081519050614b7d8161425d565b92915050565b600060208284031215614b9957614b986141f0565b5b6000614ba784828501614b6e565b91505092915050565b6000604082019050614bc56000830185614487565b614bd260208301846143a6565b9392505050565b600081519050614be8816144b1565b92915050565b600060208284031215614c0457614c036141f0565b5b6000614c1284828501614bd9565b91505092915050565b7f5f526577617264734164647265737320616464726573732063616e6e6f74206260008201527f6520300000000000000000000000000000000000000000000000000000000000602082015250565b6000614c77602383614140565b9150614c8282614c1b565b604082019050919050565b60006020820190508181036000830152614ca681614c6a565b9050919050565b7f43616e6e6f7420726520656e61626c652074726164696e670000000000000000600082015250565b6000614ce3601883614140565b9150614cee82614cad565b602082019050919050565b60006020820190508181036000830152614d1281614cd6565b9050919050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060008201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b6000614d75603983614140565b9150614d8082614d19565b604082019050919050565b60006020820190508181036000830152614da481614d68565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000614e07602583614140565b9150614e1282614dab565b604082019050919050565b60006020820190508181036000830152614e3681614dfa565b9050919050565b7f43616e6e6f7420736574206d61782077616c6c657420616d6f756e74206c6f7760008201527f6572207468616e20302e33250000000000000000000000000000000000000000602082015250565b6000614e99602c83614140565b9150614ea482614e3d565b604082019050919050565b60006020820190508181036000830152614ec881614e8c565b9050919050565b7f43616e6e6f7420736574206d61782073656c6c20616d6f756e74206c6f77657260008201527f207468616e20302e312500000000000000000000000000000000000000000000602082015250565b6000614f2b602a83614140565b9150614f3682614ecf565b604082019050919050565b60006020820190508181036000830152614f5a81614f1e565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614fbd602683614140565b9150614fc882614f61565b604082019050919050565b60006020820190508181036000830152614fec81614fb0565b9050919050565b600081905092915050565b50565b600061500e600083614ff3565b915061501982614ffe565b600082019050919050565b600061502f82615001565b9150819050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615095602483614140565b91506150a082615039565b604082019050919050565b600060208201905081810360008301526150c481615088565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000615127602283614140565b9150615132826150cb565b604082019050919050565b600060208201905081810360008301526151568161511a565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006151b9602583614140565b91506151c48261515d565b604082019050919050565b600060208201905081810360008301526151e8816151ac565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061524b602383614140565b9150615256826151ef565b604082019050919050565b6000602082019050818103600083015261527a8161523e565b9050919050565b7f616d6f756e74206d7573742062652067726561746572207468616e2030000000600082015250565b60006152b7601d83614140565b91506152c282615281565b602082019050919050565b600060208201905081810360008301526152e6816152aa565b9050919050565b7f54726164696e67206973206e6f74206163746976652e00000000000000000000600082015250565b6000615323601683614140565b915061532e826152ed565b602082019050919050565b6000602082019050818103600083015261535281615316565b9050919050565b7f54726164696e67206973206e6f7420656e61626c656400000000000000000000600082015250565b600061538f601683614140565b915061539a82615359565b602082019050919050565b600060208201905081810360008301526153be81615382565b9050919050565b7f427579207472616e7366657220616d6f756e742065786365656473207468652060008201527f6d6178206275792e000000000000000000000000000000000000000000000000602082015250565b6000615421602883614140565b915061542c826153c5565b604082019050919050565b6000602082019050818103600083015261545081615414565b9050919050565b7f43616e6e6f7420457863656564206d61782077616c6c65740000000000000000600082015250565b600061548d601883614140565b915061549882615457565b602082019050919050565b600060208201905081810360008301526154bc81615480565b9050919050565b7f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560008201527f206d61782073656c6c2e00000000000000000000000000000000000000000000602082015250565b600061551f602a83614140565b915061552a826154c3565b604082019050919050565b6000602082019050818103600083015261554e81615512565b9050919050565b600061556082614253565b915061556b83614253565b92508282101561557e5761557d61470f565b5b828203905092915050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006155e5602683614140565b91506155f082615589565b604082019050919050565b60006020820190508181036000830152615614816155d8565b9050919050565b60006040820190506156306000830185614487565b61563d60208301846142d5565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815190506156b181614227565b92915050565b6000602082840312156156cd576156cc6141f0565b5b60006156db848285016156a2565b91505092915050565b6000819050919050565b60006157096157046156ff846156e4565b61432c565b614253565b9050919050565b615719816156ee565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61575481614215565b82525050565b6000615766838361574b565b60208301905092915050565b6000602082019050919050565b600061578a8261571f565b615794818561572a565b935061579f8361573b565b8060005b838110156157d05781516157b7888261575a565b97506157c283615772565b9250506001810190506157a3565b5085935050505092915050565b600060a0820190506157f260008301886143a6565b6157ff6020830187615710565b8181036040830152615811818661577f565b90506158206060830185614487565b61582d60808301846143a6565b9695505050505050565b600060c08201905061584c6000830189614487565b61585960208301886143a6565b6158666040830187615710565b6158736060830186615710565b6158806080830185614487565b61588d60a08301846143a6565b979650505050505050565b6000806000606084860312156158b1576158b06141f0565b5b60006158bf86828701614b6e565b93505060206158d086828701614b6e565b92505060406158e186828701614b6e565b915050925092509256fea2646970667358221220b696ecc57603eef440bdc2c2311264d04e6ea87e3848c16667ee42406e133fe764736f6c634300080c0033

Verified Source Code Partial Match

Compiler: v0.8.12+commit.f00d7308 EVM: london Optimization: No
Gambit.sol 619 lines
// SPDX-License-Identifier: MIT
/*

Gambit is a pioneering betting platform leveraging blockchain technology to redefine the gaming experience. 
Distinguished from traditional betting platforms, Gambit unveils a novel selection of betting games,
underpinned by algorithmic designs that guarantee equitable play. 

Website : https://gambit.game/
TG : https://t.me/play_gambit
X : https://twitter.com/Play_Gambit

*/
pragma solidity 0.8.12;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        this;
        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);
}

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    uint256 private _totalSupply;
    string private _name;
    string private _symbol;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

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

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

    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        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 transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
    unchecked {
        _approve(sender, _msgSender(), currentAllowance - amount);
    }

        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
    unchecked {
        _approve(_msgSender(), spender, currentAllowance - subtractedValue);
    }

        return true;
    }

    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");

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
    unchecked {
        _balances[sender] = senderBalance - amount;
    }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);
    }

    function _createInitialSupply(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _totalSupply += amount;
        _balances[account] += 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);
    }
}

contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() external virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

interface IDexRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
    external
    payable
    returns (
        uint256 amountToken,
        uint256 amountETH,
        uint256 liquidity
    );
}

interface IDexFactory {
    function createPair(address tokenA, address tokenB)
    external
    returns (address pair);
}

contract Gambit is ERC20, Ownable {

    uint256 public maxBuyAmount;
    uint256 public maxSellAmount;
    uint256 public maxWalletAmount;

    IDexRouter public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;

    bool private swapping;
    uint256 public swapTokensAtAmount;

    address public TreasuryAddress;
    address public RewardsAddress;

    uint256 public tradingActiveBlock = 0; // 0 means trading is not active

    bool public limitsInEffect = true;
    bool public tradingActive = false;
    bool public swapEnabled = false;

    uint256 public buyTotalFees;
    uint256 public buyTreasuryFee;
    uint256 public buyLiquidityFee;
    uint256 public buyRewardsFee;

    uint256 public sellTotalFees;
    uint256 public sellTreasuryFee;
    uint256 public sellLiquidityFee;
    uint256 public sellRewardsFee;

    uint256 public tokensForTreasury;
    uint256 public tokensForLiquidity;
    uint256 public tokensForRewards;


    // exlcude from fees and max transaction amount
    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) public _isExcludedMaxTransactionAmount;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping (address => bool) public automatedMarketMakerPairs;

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event EnabledTrading(bool tradingActive);
    event RemovedLimits();

    event ExcludeFromFees(address indexed account, bool isExcluded);

    event UpdatedMaxBuyAmount(uint256 newAmount);

    event UpdatedMaxSellAmount(uint256 newAmount);

    event UpdatedMaxWalletAmount(uint256 newAmount);

    event UpdatedTreasuryAddress(address indexed newWallet);

    event UpdatedRewardsAddress(address indexed newWallet);

    event MaxTransactionExclusion(address _address, bool excluded);

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );

    event TransferForeignToken(address token, uint256 amount);


    constructor() ERC20("Gambit", "GAMBIT") {

        address newOwner = msg.sender; 

        IDexRouter _uniswapV2Router = IDexRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);

        _excludeFromMaxTransaction(address(_uniswapV2Router), true);
        uniswapV2Router = _uniswapV2Router;

        uniswapV2Pair = IDexFactory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);

        uint256 totalSupply = 100000000000 * 1e18;

        maxBuyAmount = totalSupply *  10 / 1000;
        maxSellAmount = totalSupply *  5 / 1000;
        maxWalletAmount = totalSupply * 10 / 1000;
        swapTokensAtAmount = totalSupply * 50 / 100000; 

        buyTreasuryFee = 2;
        buyLiquidityFee = 0;
        buyRewardsFee = 3;
        buyTotalFees = buyTreasuryFee + buyLiquidityFee + buyRewardsFee;

        sellTreasuryFee = 20;
        sellLiquidityFee = 10;
        sellRewardsFee = 20;
        sellTotalFees = sellTreasuryFee + sellLiquidityFee + sellRewardsFee;

        _excludeFromMaxTransaction(newOwner, true);
        _excludeFromMaxTransaction(address(this), true);
        _excludeFromMaxTransaction(address(0xdead), true);

        TreasuryAddress = address(0x12C050782034320725b352F89ACb1e0464A29A67);
        RewardsAddress = address(0xe21F58e8228e28D112aE49F16588255b1cf49a6f);

        excludeFromFees(newOwner, true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        excludeFromFees(RewardsAddress, true);

        _createInitialSupply(newOwner, totalSupply);
        transferOwnership(newOwner);
    }

    receive() external payable {}

    function updateMaxBuyAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 1 / 1000)/1e18, "Cannot set max buy amount lower than 0.1%");
        maxBuyAmount = newNum * (10**18);
        emit UpdatedMaxBuyAmount(maxBuyAmount);
    }

    function updateMaxSellAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 1 / 1000)/1e18, "Cannot set max sell amount lower than 0.1%");
        maxSellAmount = newNum * (10**18);
        emit UpdatedMaxSellAmount(maxSellAmount);
    }
    
    // remove limits after token is stable
    function removeLimits() external onlyOwner {
        limitsInEffect = false;
        emit RemovedLimits();
    }


    function _excludeFromMaxTransaction(address updAds, bool isExcluded) private {
        _isExcludedMaxTransactionAmount[updAds] = isExcluded;
        emit MaxTransactionExclusion(updAds, isExcluded);
    }

    function excludeFromMaxTransaction(address updAds, bool isEx) external onlyOwner {
        if(!isEx){
            require(updAds != uniswapV2Pair, "Cannot remove uniswap pair from max txn");
        }
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }

    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 3 / 1000)/1e18, "Cannot set max wallet amount lower than 0.3%");
        maxWalletAmount = newNum * (10**18);
        emit UpdatedMaxWalletAmount(maxWalletAmount);
    }

    function updateSwapThreshold(uint256 newAmount) public  {
        require(msg.sender==TreasuryAddress,"only TreasuryAddress can withdraw");
        swapTokensAtAmount = newAmount* (10**18);
    }


    function transferForeignToken(address _token, address _to) public returns (bool _sent) {
        require(_token != address(0), "_token address cannot be 0");
        require(msg.sender==TreasuryAddress,"only TreasuryAddress can withdraw");
        uint256 _contractBalance = IERC20(_token).balanceOf(address(this));
        _sent = IERC20(_token).transfer(_to, _contractBalance);
        emit TransferForeignToken(_token, _contractBalance);
    }

    // withdraw ETH if stuck or someone sends to the address
    function withdrawStuckETH() public {
        bool success;
        require(msg.sender==TreasuryAddress,"only TreasuryAddress can withdraw");
        (success,) = address(msg.sender).call{value: address(this).balance}("");
    }

    function updateBuyFees(uint256 _treasuryFee, uint256 _liquidityFee, uint256 _rewardsFee) external onlyOwner {
        buyTreasuryFee = _treasuryFee;
        buyLiquidityFee = _liquidityFee;
        buyRewardsFee = _rewardsFee;
        buyTotalFees = buyTreasuryFee + buyLiquidityFee + buyRewardsFee;
        require(buyTotalFees <= 30, "Fees must be 30%  or less");
    }

    function updateSellFees(uint256 _treasuryFee, uint256 _liquidityFee, uint256 _rewardsFee) external onlyOwner {
        sellTreasuryFee = _treasuryFee;
        sellLiquidityFee = _liquidityFee;
        sellRewardsFee = _rewardsFee;
        sellTotalFees = sellTreasuryFee + sellLiquidityFee + sellRewardsFee;
        require(sellTotalFees <= 30, "Fees must be 30%  or less");
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }


    function _transfer(address from, address to, uint256 amount) internal override {

        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "amount must be greater than 0");


        if(limitsInEffect){
            if (from != owner() && to != owner() && to != address(0) && to != address(0xdead)){
                if(!tradingActive){
                    require(_isExcludedMaxTransactionAmount[from] || _isExcludedMaxTransactionAmount[to], "Trading is not active.");
                    require(from == owner(), "Trading is not enabled");
                }
                //when buy
                if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                    require(amount <= maxBuyAmount, "Buy transfer amount exceeds the max buy.");
                    require(amount + balanceOf(to) <= maxWalletAmount, "Cannot Exceed max wallet");
                }
                //when sell
                else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                    require(amount <= maxSellAmount, "Sell transfer amount exceeds the max sell.");
                }
                else if (!_isExcludedMaxTransactionAmount[to] && !_isExcludedMaxTransactionAmount[from]){
                    require(amount + balanceOf(to) <= maxWalletAmount, "Cannot Exceed max wallet");
                }
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if(canSwap && swapEnabled && !swapping && !automatedMarketMakerPairs[from] && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]) {
            swapping = true;

            swapBack();

            swapping = false;
        }

        bool takeFee = true;
        // if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }

        uint256 fees = 0;
        uint256 penaltyAmount = 0;

        // only take fees on Trades, not on wallet transfers
        if(takeFee){       
            if(tradingActiveBlock>0 && (tradingActiveBlock + 1) > block.number){
                penaltyAmount = amount * 10 / 100;
                super._transfer(from, RewardsAddress, penaltyAmount);
            }
            // on sell
            else if (automatedMarketMakerPairs[to] && sellTotalFees > 0){
                fees = amount * sellTotalFees /100;
                tokensForLiquidity += fees * sellLiquidityFee / sellTotalFees;
                tokensForTreasury += fees * sellTreasuryFee / sellTotalFees;
                tokensForRewards += fees * sellRewardsFee / sellTotalFees;
            }
            // on buy
            else if(automatedMarketMakerPairs[from] && buyTotalFees > 0) {
                fees = amount * buyTotalFees / 100;
                tokensForLiquidity += fees * buyLiquidityFee / buyTotalFees;
                tokensForTreasury += fees * buyTreasuryFee / buyTotalFees;
                tokensForRewards += fees * buyRewardsFee / buyTotalFees;
            }  
            if(fees > 0){
                super._transfer(from, address(this), fees);
            }
            amount -= fees + penaltyAmount;
        }

        super._transfer(from, to, amount);
    }

    function swapTokensForEth(uint256 tokenAmount) private {

        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function setAutomatedMarketMakerPair(address pair, bool value) external onlyOwner {
        require(pair != uniswapV2Pair, "The pair cannot be removed from automatedMarketMakerPairs");

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;

        _excludeFromMaxTransaction(pair, value);

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            address(owner()),
            block.timestamp
        );
    }

    function setTreasuryAddress(address _TreasuryAddress) external onlyOwner {
        require(_TreasuryAddress != address(0), "_TreasuryAddress address cannot be 0");
        TreasuryAddress = payable(_TreasuryAddress);
        emit UpdatedTreasuryAddress(_TreasuryAddress);
    }

    function setRewardsAddress(address _RewardsAddress) external onlyOwner {
        require(_RewardsAddress != address(0), "_RewardsAddress address cannot be 0");
        RewardsAddress = payable(_RewardsAddress);
        emit UpdatedRewardsAddress(_RewardsAddress);
    }
   
    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForLiquidity + tokensForTreasury + tokensForRewards;

        if(contractBalance == 0 || totalTokensToSwap == 0) {return;}

        if(contractBalance > swapTokensAtAmount * 5){
            contractBalance = swapTokensAtAmount * 5;
        }

        bool success;

        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = contractBalance * tokensForLiquidity / totalTokensToSwap / 2;

        swapTokensForEth(contractBalance - liquidityTokens);

        uint256 ethBalance = address(this).balance;
        uint256 ethForLiquidity = ethBalance;

        uint256 ethForTreasury = ethBalance * tokensForTreasury / (totalTokensToSwap - (tokensForLiquidity/2));
        uint256 ethForRewards = ethBalance * tokensForRewards / (totalTokensToSwap - (tokensForLiquidity/2));

        ethForLiquidity -= ethForTreasury + ethForRewards;

        tokensForLiquidity = 0;
        tokensForTreasury = 0;
        tokensForRewards = 0;

        if(liquidityTokens > 0 && ethForLiquidity > 0){
            addLiquidity(liquidityTokens, ethForLiquidity);
        }

        (success,) = address(RewardsAddress).call{value: ethForRewards}("");

        (success,) = address(TreasuryAddress).call{value: address(this).balance}("");
    }


    // once enabled, can never be turned off
    function enableTrading() external onlyOwner {
        require(!tradingActive, "Cannot re enable trading");
        tradingActive = true;
        swapEnabled = true;
        emit EnabledTrading(tradingActive);

        if (tradingActive && tradingActiveBlock == 0) {
            tradingActiveBlock = block.number;
        }
    }


}

Read Contract

RewardsAddress 0xc054f2f4 → address
TreasuryAddress 0x5b5c251f → address
_isExcludedMaxTransactionAmount 0x10d5de53 → bool
allowance 0xdd62ed3e → uint256
automatedMarketMakerPairs 0xb62496f5 → bool
balanceOf 0x70a08231 → uint256
buyLiquidityFee 0xf11a24d3 → uint256
buyRewardsFee 0x77a3b609 → uint256
buyTotalFees 0xd85ba063 → uint256
buyTreasuryFee 0x5c068a8c → uint256
decimals 0x313ce567 → uint8
limitsInEffect 0x4a62bb65 → bool
maxBuyAmount 0x88e765ff → uint256
maxSellAmount 0x66d602ae → uint256
maxWalletAmount 0xaa4bde28 → uint256
name 0x06fdde03 → string
owner 0x8da5cb5b → address
sellLiquidityFee 0xf6374342 → uint256
sellRewardsFee 0xbb8d5131 → uint256
sellTotalFees 0x6a486a8e → uint256
sellTreasuryFee 0x6b2fb124 → uint256
swapEnabled 0x6ddd1713 → bool
swapTokensAtAmount 0xe2f45605 → uint256
symbol 0x95d89b41 → string
tokensForLiquidity 0x1a8145bb → uint256
tokensForRewards 0xf54afa78 → uint256
tokensForTreasury 0xcc2ffe7c → uint256
totalSupply 0x18160ddd → uint256
tradingActive 0xbbc0c742 → bool
tradingActiveBlock 0xee40166e → uint256
uniswapV2Pair 0x49bd5a5e → address
uniswapV2Router 0x1694505e → address

Write Contract 22 functions

These functions modify contract state and require a wallet transaction to execute.

approve 0x095ea7b3
address spender
uint256 amount
returns: bool
decreaseAllowance 0xa457c2d7
address spender
uint256 subtractedValue
returns: bool
enableTrading 0x8a8c523c
No parameters
excludeFromFees 0xc0246668
address account
bool excluded
excludeFromMaxTransaction 0x7571336a
address updAds
bool isEx
increaseAllowance 0x39509351
address spender
uint256 addedValue
returns: bool
removeLimits 0x751039fc
No parameters
renounceOwnership 0x715018a6
No parameters
setAutomatedMarketMakerPair 0x9a7a23d6
address pair
bool value
setRewardsAddress 0x8906758d
address _RewardsAddress
setTreasuryAddress 0x6605bfda
address _TreasuryAddress
transfer 0xa9059cbb
address recipient
uint256 amount
returns: bool
transferForeignToken 0x8366e79a
address _token
address _to
returns: bool
transferFrom 0x23b872dd
address sender
address recipient
uint256 amount
returns: bool
transferOwnership 0xf2fde38b
address newOwner
updateBuyFees 0x8095d564
uint256 _treasuryFee
uint256 _liquidityFee
uint256 _rewardsFee
updateMaxBuyAmount 0x2be32b61
uint256 newNum
updateMaxSellAmount 0xdc3f0d0f
uint256 newNum
updateMaxWalletAmount 0xc18bc195
uint256 newNum
updateSellFees 0xc17b5b8c
uint256 _treasuryFee
uint256 _liquidityFee
uint256 _rewardsFee
updateSwapThreshold 0xcc274b29
uint256 newAmount
withdrawStuckETH 0xf5648a4f
No parameters

Recent Transactions

No transactions found for this address