Token Dai Stablecoin

 

Overview [ERC-20]

Price
$1.00 @ 0.000334 Eth (-0.13%)
Fully Diluted Market Cap
Max Total Supply:
24,918,089.442922374634812304 DAI

Holders:
126,893 ( -0.026%)
Balance
360,044.260962445985164254 DAI

Value
$359,244.24 ( ~120.3438 Eth) [1.4449%]
0x95d9d28606ee55de7667f0f176ebfc3215cfd9c0
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

OVERVIEW

Multi-Collateral Dai, brings a lot of new and exciting features, such as support for new CDP collateral types and Dai Savings Rate.

Market

Volume (24H):$107,758,499.00
Market Capitalization:$4,931,501,843.00
Circulating Supply:4,946,527,754.00 DAI
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume
1
Uniswap V3 (Ethereum)
0X6B175474E89094C44DA98B954EEDEAC495271D0F-0XA0B86991C6218B36C1D19D4A2E9EB0CE3606EB48$1.0020
0.0003356 Eth
$5,903,686.0000
5,891,942.882 0X6B175474E89094C44DA98B954EEDEAC495271D0F
19.2382%
2
Uniswap V2 (Ethereum)
0X9F8F72AA9304C8B593D555F12EF6589CC3A579A2-0X6B175474E89094C44DA98B954EEDEAC495271D0F$1.0010
0.0003353 Eth
$3,508,253.0000
1,721.587 0X9F8F72AA9304C8B593D555F12EF6589CC3A579A2
0.0056%
3
HTX
DAI-USDT$0.9951
0.0003334 Eth
$3,033,850.0000
3,042,753.836 DAI
9.9351%
4
BitMart
ETH-DAI$0.9998
0.0003349 Eth
$2,843,489.0000
953.202 ETH
0.0031%
5
Uniswap V3 (Polygon)
0X2791BCA1F2DE4661ED88A30C99A7A9449AA84174-0X8F3CF7AD23CD3CADBD9735AFF958023239C6A063$0.9988
0.0003352 Eth
$1,470,844.0000
1,471,918.514 0X2791BCA1F2DE4661ED88A30C99A7A9449AA84174
4.8061%
6
Binance
USDT-DAI$0.9998
0.0003349 Eth
$1,407,173.0000
1,407,710.000 USDT
4.5964%
7
Camelot V3
0XAF88D065E77C8CC2239327C5EDB3A432268E5831-0XDA10009CBD5D07DD0CECC66161FC93D7C9000DA1$1.0010
0.0003353 Eth
$1,227,337.0000
1,225,692.741 0XAF88D065E77C8CC2239327C5EDB3A432268E5831
4.0021%
8
Quickswap (v3)
0X2791BCA1F2DE4661ED88A30C99A7A9449AA84174-0X8F3CF7AD23CD3CADBD9735AFF958023239C6A063$0.9994
0.0003352 Eth
$1,197,047.0000
1,197,053.449 0X2791BCA1F2DE4661ED88A30C99A7A9449AA84174
3.9086%
9
Uniswap V3 (Polygon)
0X8F3CF7AD23CD3CADBD9735AFF958023239C6A063-0XC2132D05D31C914A87C6611C10748AEB04B58E8F$0.9989
0.0003352 Eth
$1,174,939.0000
1,176,415.093 0X8F3CF7AD23CD3CADBD9735AFF958023239C6A063
3.8412%
10
BitMart
DAI-USDT$1.0000
0.0003351 Eth
$1,095,659.0000
1,095,442.120 DAI
3.5768%
11
Bitget
DAI-USDT$0.9993
0.0003348 Eth
$932,107.0000
932,508.000 DAI
3.0448%
12
OKX
DAI-USDT$0.9998
0.0003350 Eth
$821,807.0000
821,647.866 DAI
2.6828%
13
Uniswap V3 (Ethereum)
0X6B175474E89094C44DA98B954EEDEAC495271D0F-0XDAC17F958D2EE523A2206206994597C13D831EC7$1.0020
0.0003356 Eth
$808,919.0000
807,314.226 0X6B175474E89094C44DA98B954EEDEAC495271D0F
2.6360%
14
Bitrue
DAI-USDT$1.0000
0.0003351 Eth
$771,083.0000
770,847.700 DAI
2.5170%
15
BitMart
BTC-DAI$0.9998
0.0003349 Eth
$768,560.0000
14.925 BTC
0.0000%
16
Coinbase Exchange
DAI-USD$0.9998
0.0003349 Eth
$700,285.0000
700,425.378 DAI
2.2870%
17
DigiFinex
DAI-USDT$0.9955
0.0003335 Eth
$690,954.0000
694,073.040 DAI
2.2663%
18
XT.COM
BTC-DAI$0.9998
0.0003350 Eth
$659,461.0000
12.926 BTC
0.0000%
19
LBank
DAI-USDT$0.9998
0.0003350 Eth
$653,777.0000
653,915.560 DAI
2.1351%
20
Binance
ETH-DAI$0.9998
0.0003349 Eth
$637,996.0000
216.182 ETH
0.0007%
21
Binance
BTC-DAI$0.9998
0.0003350 Eth
$594,271.0000
11.650 BTC
0.0000%
22
Uniswap V3 (Polygon)
0X3C499C542CEF5E3811E1192CE70D8CC03D5C3359-0X8F3CF7AD23CD3CADBD9735AFF958023239C6A063$0.9997
0.0003353 Eth
$541,880.0000
541,922.819 0X3C499C542CEF5E3811E1192CE70D8CC03D5C3359
1.7695%
23
XT.COM
DAI-USDT$0.9990
0.0003347 Eth
$540,442.0000
540,398.150 DAI
1.7645%
24
Bybit
DAI-USDT$0.9990
0.0003352 Eth
$505,844.0000
506,222.570 DAI
1.6529%
25
Kraken
DAI-EUR$0.9997
0.0003348 Eth
$478,805.0000
478,971.108 DAI
1.5639%
26
Tapbit
DAI-USDT$0.9998
0.0003351 Eth
$474,596.0000
474,537.000 DAI
1.5494%
27
Pancakeswap V3 (BSC)
0X1AF3F329E8BE154074D8769D1FFA4EE058B1DBC3-0X55D398326F99059FF775485246999027B3197955$0.9998
0.0003349 Eth
$415,855.0000
415,585.384 0X1AF3F329E8BE154074D8769D1FFA4EE058B1DBC3
1.3570%
28
Balancer V2 (Arbitrum)
0XDA10009CBD5D07DD0CECC66161FC93D7C9000DA1-0XFD086BC7CD5C481DCC9C85EBE478A1C0B69FCBB9$0.9998
0.0003349 Eth
$380,597.0000
380,662.469 0XDA10009CBD5D07DD0CECC66161FC93D7C9000DA1
1.2429%
29
Kraken
DAI-USD$0.9971
0.0003340 Eth
$352,368.0000
353,396.218 DAI
1.1539%
30
Kraken
DAI-USDT$0.9990
0.0003346 Eth
$332,299.0000
332,639.711 DAI
1.0861%
31
Uniswap V3 (Arbitrum One)
0XDA10009CBD5D07DD0CECC66161FC93D7C9000DA1-0XFD086BC7CD5C481DCC9C85EBE478A1C0B69FCBB9$0.9987
0.0003351 Eth
$330,720.0000
331,145.043 0XDA10009CBD5D07DD0CECC66161FC93D7C9000DA1
1.0812%
32
Uniswap V3 (Ethereum)
0X02F92800F57BCD74066F5709F1DAA1A4302DF875-0X6B175474E89094C44DA98B954EEDEAC495271D0F$1.0020
0.0003356 Eth
$310,791.0000
57,795.997 0X02F92800F57BCD74066F5709F1DAA1A4302DF875
0.1887%
33
XT.COM
ETH-DAI$0.9998
0.0003350 Eth
$296,990.0000
100.667 ETH
0.0003%
34
Trader Joe V2.1 (Arbitrum)
0XDA10009CBD5D07DD0CECC66161FC93D7C9000DA1-0XFF970A61A04B1CA14834A43F5DE4533EBDDB5CC8$0.9993
0.0003347 Eth
$263,931.0000
264,089.976 0XDA10009CBD5D07DD0CECC66161FC93D7C9000DA1
0.8623%
35
Uniswap V3 (Optimism)
0X94B008AA00579C1307B0EF2C499AD98A8CE58E58-0XDA10009CBD5D07DD0CECC66161FC93D7C9000DA1$0.9957
0.0003341 Eth
$243,159.0000
244,224.371 0X94B008AA00579C1307B0EF2C499AD98A8CE58E58
0.7974%
36
Uniswap V3 (Optimism)
0X7F5C764CBC14F9669B88837CA1490CCA17C31607-0XDA10009CBD5D07DD0CECC66161FC93D7C9000DA1$0.9957
0.0003341 Eth
$239,497.0000
240,471.673 0X7F5C764CBC14F9669B88837CA1490CCA17C31607
0.7852%
37
CoinW
DAI-USDT$0.9970
0.0003339 Eth
$226,464.0000
227,155.428 DAI
0.7417%
38
Hotcoin Global
DAI-USDT$0.9994
0.0003350 Eth
$214,395.0000
214,516.810 DAI
0.7004%
39
MEXC
DAI-USDT$0.9990
0.0003347 Eth
$210,008.0000
210,218.670 DAI
0.6864%
40
Curve (Optimism)
0XDA10009CBD5D07DD0CECC66161FC93D7C9000DA1-0X94B008AA00579C1307B0EF2C499AD98A8CE58E58$0.9994
0.0003352 Eth
$199,457.0000
199,531.989 0XDA10009CBD5D07DD0CECC66161FC93D7C9000DA1
0.6515%
41
BitMart
DAI-USDC$1.0000
0.0003350 Eth
$168,807.0000
168,805.200 DAI
0.5512%
42
WhiteBIT
DAI-USDT$0.9954
0.0003335 Eth
$164,522.0000
165,282.670 DAI
0.5397%
43
Uniswap V3 (Ethereum)
0X6B175474E89094C44DA98B954EEDEAC495271D0F-0X9F8F72AA9304C8B593D555F12EF6589CC3A579A2$1.0010
0.0003352 Eth
$156,199.0000
156,866.130 0X6B175474E89094C44DA98B954EEDEAC495271D0F
0.5122%
44
Curve (Optimism)
0XDA10009CBD5D07DD0CECC66161FC93D7C9000DA1-0X7F5C764CBC14F9669B88837CA1490CCA17C31607$0.9995
0.0003352 Eth
$148,877.0000
148,960.815 0XDA10009CBD5D07DD0CECC66161FC93D7C9000DA1
0.4864%
45
Tokpie
DAI-USDC$1.0030
0.0003362 Eth
$139,093.0000
138,648.100 DAI
0.4527%
46
KuCoin
USDT-DAI$0.9998
0.0003349 Eth
$92,222.0000
92,221.876 USDT
0.3011%
47
Trader Joe V2.1 (Avalanche)
0XD586E7F844CEA2F87F50152665BCBC2C279D8D70-0XB97EF9EF8734C71904D8002F8B6BC66DD9C48A6E$0.9994
0.0003347 Eth
$90,949.0000
91,000.364 0XD586E7F844CEA2F87F50152665BCBC2C279D8D70
0.2971%
48
Uniswap V3 (Arbitrum One)
0XDA10009CBD5D07DD0CECC66161FC93D7C9000DA1-0XFF970A61A04B1CA14834A43F5DE4533EBDDB5CC8$0.9991
0.0003353 Eth
$80,738.0000
80,856.570 0XDA10009CBD5D07DD0CECC66161FC93D7C9000DA1
0.2640%
49
Bitget
DAI-USDC$1.0010
0.0003354 Eth
$65,728.0000
65,676.000 DAI
0.2144%
50
Uniswap V3 (Optimism)
0X8C6F28F2F1A3C87F0F938B96D27520D9751EC8D9-0XDA10009CBD5D07DD0CECC66161FC93D7C9000DA1$0.9957
0.0003341 Eth
$64,723.0000
65,310.812 0X8C6F28F2F1A3C87F0F938B96D27520D9751EC8D9
0.2133%
51
Binance
BNB-DAI$0.9998
0.0003349 Eth
$62,925.0000
166.070 BNB
0.0005%
52
Pancakeswap V3 (Ethereum)
0X6B175474E89094C44DA98B954EEDEAC495271D0F-0XA0B86991C6218B36C1D19D4A2E9EB0CE3606EB48$0.9993
0.0003348 Eth
$62,142.0000
62,185.963 0X6B175474E89094C44DA98B954EEDEAC495271D0F
0.2030%
53
Kraken
BTC-DAI$0.9998
0.0003349 Eth
$60,012.0000
1.164 BTC
0.0000%
54
KuCoin
ETH-DAI$0.9998
0.0003349 Eth
$57,673.0000
19.334 ETH
0.0001%
55
Aerodrome (Base)
0X50C5725949A6F0C72E6C4A641F24049A917DB0CB-0X833589FCD6EDB6E08F4C7C32D4F71B54BDA02913$0.9991
0.0003349 Eth
$49,749.0000
49,762.052 0X50C5725949A6F0C72E6C4A641F24049A917DB0CB
0.1625%
56
Emirex
USDT-DAI$0.9998
0.0003349 Eth
$42,446.0000
42,463.420 USDT
0.1387%
57
Crypto.com Exchange
DAI-USDT$0.9979
0.0003343 Eth
$41,144.0000
41,231.400 DAI
0.1346%
58
FameEX
DAI-USDT$0.9998
0.0003353 Eth
$41,026.0000
41,098.606 DAI
0.1342%
59
Uniswap V3 (Ethereum)
0X6B175474E89094C44DA98B954EEDEAC495271D0F-0X853D955ACEF822DB058EB8505911ED77F175B99E$1.0020
0.0003356 Eth
$36,305.0000
36,221.831 0X6B175474E89094C44DA98B954EEDEAC495271D0F
0.1183%
60
Uniswap V3 (Polygon)
0X2791BCA1F2DE4661ED88A30C99A7A9449AA84174-0X8F3CF7AD23CD3CADBD9735AFF958023239C6A063$0.9988
0.0003352 Eth
$34,804.0000
34,814.848 0X2791BCA1F2DE4661ED88A30C99A7A9449AA84174
0.1137%
61
CoinEx
DAI-USDT$0.9984
0.0003346 Eth
$31,729.0000
31,765.968 DAI
0.1037%
62
Aerodrome (Base)
0X50C5725949A6F0C72E6C4A641F24049A917DB0CB-0XD9AAEC86B65D86F6A7B5B1B0C42FFA531710B6CA$1.0010
0.0003353 Eth
$30,179.0000
30,179.889 0X50C5725949A6F0C72E6C4A641F24049A917DB0CB
0.0985%
63
EXMO
DAI-USDT$0.9988
0.0003345 Eth
$29,232.0000
29,268.555 DAI
0.0956%
64
Phemex
DAI-USDT$0.9960
0.0003341 Eth
$27,254.0000
27,363.240 DAI
0.0893%
65
Uniswap V3 (Ethereum)
0X2260FAC5E5542A773AA44FBCFEDF7C193BC2C599-0X6B175474E89094C44DA98B954EEDEAC495271D0F$0.9970
0.0003339 Eth
$23,795.0000
0.468 0X2260FAC5E5542A773AA44FBCFEDF7C193BC2C599
0.0000%
66
Quickswap (v3)
0X8F3CF7AD23CD3CADBD9735AFF958023239C6A063-0XC2132D05D31C914A87C6611C10748AEB04B58E8F$0.9988
0.0003350 Eth
$23,056.0000
23,082.411 0X8F3CF7AD23CD3CADBD9735AFF958023239C6A063
0.0754%
67
Kraken
ETH-DAI$0.9998
0.0003349 Eth
$21,649.0000
7.238 ETH
0.0000%
68
Bitcointry Exchange
USDT-DAI$0.9998
0.0003352 Eth
$15,667.4400
15,673.906 USDT
0.0512%
69
Bitso
BTC-DAI$0.9987
0.0003349 Eth
$12,672.2200
0.247 BTC
0.0000%
70
Gate.io
DAI-USDT$0.9961
0.0003337 Eth
$12,431.1800
12,507.172 DAI
0.0408%
71
Bitso
DAI-MXN$0.9974
0.0003344 Eth
$12,273.3400
12,305.116 DAI
0.0402%
72
Bitvavo
DAI-EUR$1.0020
0.0003363 Eth
$12,057.5800
12,032.165 DAI
0.0393%
73
OKCoin Japan
DAI-JPY$1.0030
0.0003365 Eth
$10,183.4300
10,163.895 DAI
0.0332%
74
Velodrome Finance v2
0X7F5C764CBC14F9669B88837CA1490CCA17C31607-0XDA10009CBD5D07DD0CECC66161FC93D7C9000DA1$0.9981
0.0003343 Eth
$10,080.5800
10,099.496 0X7F5C764CBC14F9669B88837CA1490CCA17C31607
0.0330%
75
ApeSwap (Polygon)
0X0D500B1D8E8EF31E21C99D1DB9A6444D3ADF1270-0X8F3CF7AD23CD3CADBD9735AFF958023239C6A063$1.0020
0.0003363 Eth
$10,018.3000
10,015.286 0X0D500B1D8E8EF31E21C99D1DB9A6444D3ADF1270
0.0327%
76
Balancer V2 (Polygon)
0X8F3CF7AD23CD3CADBD9735AFF958023239C6A063-USDC$0.9999
0.0003350 Eth
$9,944.7200
9,945.592 0X8F3CF7AD23CD3CADBD9735AFF958023239C6A063
0.0325%
77
Balancer V2 (Polygon)
0X2791BCA1F2DE4661ED88A30C99A7A9449AA84174-DAI$0.9998
0.0003349 Eth
$9,936.9500
9,939.391 0X2791BCA1F2DE4661ED88A30C99A7A9449AA84174
0.0325%
78
Sushiswap (Polygon POS)
0X7CEB23FD6BC0ADD59E62AC25578270CFF1B9F619-0X8F3CF7AD23CD3CADBD9735AFF958023239C6A063$0.9999
0.0003349 Eth
$9,825.5400
3.330 0X7CEB23FD6BC0ADD59E62AC25578270CFF1B9F619
0.0000%
79
KuCoin
BTC-DAI$0.9998
0.0003349 Eth
$9,639.6800
0.188 BTC
0.0000%
80
Uniswap V3 (Ethereum)
0X86ED939B500E121C0C5F493F399084DB596DAD20-0X6B175474E89094C44DA98B954EEDEAC495271D0F$1.0020
0.0003356 Eth
$8,912.5700
928,299.347 0X86ED939B500E121C0C5F493F399084DB596DAD20
3.0311%
81
ProBit Global
DAI-USDT$1.0000
0.0003350 Eth
$8,757.4600
8,756.528 DAI
0.0286%
82
Osmosis
IBC/0CD3A0285E1341859B5E86B6AB7682F023D03E97607CCC1DC95706411D866DF7-UOSMO$0.9981
0.0003343 Eth
$6,170.5800
6,182.479 IBC/0CD3A0285E1341859B5E86B6AB7682F023D03E97607CCC1DC95706411D866DF7
0.0202%
83
PancakeSwap (v2)
0X1AF3F329E8BE154074D8769D1FFA4EE058B1DBC3-BUSD$1.0000
0.0003349 Eth
$5,985.0400
6,009.100 0X1AF3F329E8BE154074D8769D1FFA4EE058B1DBC3
0.0196%
84
Uniswap V3 (Ethereum)
0X7DD9C5CBA05E151C895FDE1CF355C9A1D5DA6429-0X6B175474E89094C44DA98B954EEDEAC495271D0F$1.0020
0.0003356 Eth
$5,779.4200
17,584.020 0X7DD9C5CBA05E151C895FDE1CF355C9A1D5DA6429
0.0574%
85
Bybit
ETH-DAI$0.9999
0.0003355 Eth
$5,614.5600
1.905 ETH
0.0000%
86
PearlFi V1.5
0X40379A439D4F6795B6FC9AA5687DB461677A2DBA-0X8F3CF7AD23CD3CADBD9735AFF958023239C6A063$1.0000
0.0003353 Eth
$4,777.0200
6,779.255 0X40379A439D4F6795B6FC9AA5687DB461677A2DBA
0.0221%
87
Bybit
BTC-DAI$0.9999
0.0003355 Eth
$4,703.6600
0.092 BTC
0.0000%
88
Uniswap V3 (Polygon)
0X8A16D4BF8A0A716017E8D2262C4AC32927797A2F-0X8F3CF7AD23CD3CADBD9735AFF958023239C6A063$0.9986
0.0003351 Eth
$4,415.2400
293.671 0X8A16D4BF8A0A716017E8D2262C4AC32927797A2F
0.0010%
89
Quickswap
0XE5417AF564E4BFDA1C483642DB72007871397896-0X8F3CF7AD23CD3CADBD9735AFF958023239C6A063$0.9975
0.0003341 Eth
$3,769.4900
595.798 0XE5417AF564E4BFDA1C483642DB72007871397896
0.0019%
90
Bancor (V2)
DAI-BNT$0.9913
0.0003321 Eth
$3,758.6200
3,791.764 DAI
0.0124%
91
Osmosis
IBC/0CD3A0285E1341859B5E86B6AB7682F023D03E97607CCC1DC95706411D866DF7-UOSMO$0.9997
0.0003350 Eth
$3,314.3400
3,315.348 IBC/0CD3A0285E1341859B5E86B6AB7682F023D03E97607CCC1DC95706411D866DF7
0.0108%
92
SpookySwap
0X21BE370D5312F44CB42CE377BC9B8A0CEF1A4C83-0X8D11EC38A3EB5E956B052F67DA8BDC9BEF8ABF3E$0.0423
0.0000142 Eth
$3,146.1500
7,731.763 0X21BE370D5312F44CB42CE377BC9B8A0CEF1A4C83
0.0252%
93
Uniswap V3 (Polygon)
0XE5417AF564E4BFDA1C483642DB72007871397896-0X8F3CF7AD23CD3CADBD9735AFF958023239C6A063$0.9988
0.0003352 Eth
$2,628.3800
415.949 0XE5417AF564E4BFDA1C483642DB72007871397896
0.0014%
94
Bitazza
DAI-THB$1.0030
0.0003366 Eth
$2,026.4000
2,020.007 DAI
0.0066%
95
Bitazza
DAI-USDT$1.0010
0.0003360 Eth
$2,021.0800
2,020.007 DAI
0.0066%
96
Uniswap V3 (Arbitrum One)
0X18C11FD286C5EC11C3B683CAA813B77F5163A122-0XDA10009CBD5D07DD0CECC66161FC93D7C9000DA1$0.9920
0.0003329 Eth
$1,892.3400
301.004 0X18C11FD286C5EC11C3B683CAA813B77F5163A122
0.0010%
97
Quickswap
0X7CEB23FD6BC0ADD59E62AC25578270CFF1B9F619-0X8F3CF7AD23CD3CADBD9735AFF958023239C6A063$1.0000
0.0003350 Eth
$1,220.1300
0.413 0X7CEB23FD6BC0ADD59E62AC25578270CFF1B9F619
0.0000%
98
Balancer V1
0XC02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2-DAI$0.9998
0.0003350 Eth
$541.8000
0.183 0XC02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2
0.0000%
99
Polycat Finance
0X1BFD67037B42CF73ACF2047067BD4F2C47D9BFD6-0X8F3CF7AD23CD3CADBD9735AFF958023239C6A063$0.9998
0.0003355 Eth
$494.2600
0.010 0X1BFD67037B42CF73ACF2047067BD4F2C47D9BFD6
0.0000%
100
Bitstamp
DAI-USD$0.9949
0.0003333 Eth
$0.0030
0.003 DAI
0.0000%
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Dai

Compiler Version
v0.7.6-allow_kall

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license
/**
 *Submitted for verification at optimistic.etherscan.io on 2021-07-15
*/

// SPDX-License-Identifier: AGPL-3.0-or-later

// Copyright (C) 2017, 2018, 2019 dbrock, rain, mrchico
// Copyright (C) 2021 Dai Foundation

// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program.  If not, see <https://www.gnu.org/licenses/>.

pragma solidity 0.7.6;

// Improved Dai token

contract Dai {

  // --- Auth ---
  mapping (address => uint256) public wards;
  function rely(address usr) external auth {
    wards[usr] = 1;
    emit Rely(usr);
  }
  function deny(address usr) external auth {
    wards[usr] = 0;
    emit Deny(usr);
  }
  modifier auth {
    require(wards[msg.sender] == 1, "Dai/not-authorized");
    _;
  }

  // --- ERC20 Data ---
  string  public constant name     = "Dai Stablecoin";
  string  public constant symbol   = "DAI";
  string  public constant version  = "2";
  uint8   public constant decimals = 18;
  uint256 public totalSupply;

  mapping (address => uint256)                      public balanceOf;
  mapping (address => mapping (address => uint256)) public allowance;
  mapping (address => uint256)                      public nonces;

  event Approval(address indexed owner, address indexed spender, uint256 value);
  event Transfer(address indexed from, address indexed to, uint256 value);
  event Rely(address indexed usr);
  event Deny(address indexed usr);

  // --- Math ---
  function _add(uint256 x, uint256 y) internal pure returns (uint256 z) {
    require((z = x + y) >= x);
  }
  function _sub(uint256 x, uint256 y) internal pure returns (uint256 z) {
    require((z = x - y) <= x);
  }

  // --- EIP712 niceties ---
  uint256 public immutable deploymentChainId;
  bytes32 private immutable _DOMAIN_SEPARATOR;
  bytes32 public constant PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");

  constructor() public {
    wards[msg.sender] = 1;
    emit Rely(msg.sender);

    uint256 chainId;
    assembly {chainId := chainid()}
    deploymentChainId = chainId;
    _DOMAIN_SEPARATOR = _calculateDomainSeparator(chainId);
  }

  function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {
    return keccak256(
      abi.encode(
        keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
        keccak256(bytes(name)),
        keccak256(bytes(version)),
        chainId,
        address(this)
      )
    );
  }
  function DOMAIN_SEPARATOR() external view returns (bytes32) {
    uint256 chainId;
    assembly {chainId := chainid()}
    return chainId == deploymentChainId ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);
  }

  // --- ERC20 Mutations ---
  function transfer(address to, uint256 value) external returns (bool) {
    require(to != address(0) && to != address(this), "Dai/invalid-address");
    uint256 balance = balanceOf[msg.sender];
    require(balance >= value, "Dai/insufficient-balance");

    balanceOf[msg.sender] = balance - value;
    balanceOf[to] += value;

    emit Transfer(msg.sender, to, value);

    return true;
  }
  function transferFrom(address from, address to, uint256 value) external returns (bool) {
    require(to != address(0) && to != address(this), "Dai/invalid-address");
    uint256 balance = balanceOf[from];
    require(balance >= value, "Dai/insufficient-balance");

    if (from != msg.sender) {
      uint256 allowed = allowance[from][msg.sender];
      if (allowed != type(uint256).max) {
        require(allowed >= value, "Dai/insufficient-allowance");

        allowance[from][msg.sender] = allowed - value;
      }
    }

    balanceOf[from] = balance - value;
    balanceOf[to] += value;

    emit Transfer(from, to, value);

    return true;
  }
  function approve(address spender, uint256 value) external returns (bool) {
    allowance[msg.sender][spender] = value;

    emit Approval(msg.sender, spender, value);

    return true;
  }
  function increaseAllowance(address spender, uint256 addedValue) external returns (bool) {
    uint256 newValue = _add(allowance[msg.sender][spender], addedValue);
    allowance[msg.sender][spender] = newValue;

    emit Approval(msg.sender, spender, newValue);

    return true;
  }
  function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool) {
    uint256 allowed = allowance[msg.sender][spender];
    require(allowed >= subtractedValue, "Dai/insufficient-allowance");
    allowed = allowed - subtractedValue;
    allowance[msg.sender][spender] = allowed;

    emit Approval(msg.sender, spender, allowed);

    return true;
  }

  // --- Mint/Burn ---
  function mint(address to, uint256 value) external auth {
    require(to != address(0) && to != address(this), "Dai/invalid-address");
    balanceOf[to] = balanceOf[to] + value; // note: we don't need an overflow check here b/c balanceOf[to] <= totalSupply and there is an overflow check below
    totalSupply   = _add(totalSupply, value);

    emit Transfer(address(0), to, value);
  }
  function burn(address from, uint256 value) external {
    uint256 balance = balanceOf[from];
    require(balance >= value, "Dai/insufficient-balance");

    if (from != msg.sender && wards[msg.sender] != 1) {
      uint256 allowed = allowance[from][msg.sender];
      if (allowed != type(uint256).max) {
        require(allowed >= value, "Dai/insufficient-allowance");

        allowance[from][msg.sender] = allowed - value;
      }
    }

    balanceOf[from] = balance - value; // note: we don't need overflow checks b/c require(balance >= value) and balance <= totalSupply
    totalSupply     = totalSupply - value;

    emit Transfer(from, address(0), value);
  }

  // --- Approve by signature ---
  function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external {
    require(block.timestamp <= deadline, "Dai/permit-expired");

    uint256 chainId;
    assembly {chainId := chainid()}

    bytes32 digest =
      keccak256(abi.encodePacked(
          "\x19\x01",
          chainId == deploymentChainId ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId),
          keccak256(abi.encode(
            PERMIT_TYPEHASH,
            owner,
            spender,
            value,
            nonces[owner]++,
            deadline
          ))
      ));

    require(owner != address(0) && owner == ecrecover(digest, v, r, s), "Dai/invalid-permit");

    allowance[owner][spender] = value;
    emit Approval(owner, spender, value);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"usr","type":"address"}],"name":"Deny","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"usr","type":"address"}],"name":"Rely","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"usr","type":"address"}],"name":"deny","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deploymentChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"usr","type":"address"}],"name":"rely","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"wards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60c06040523480156200001c5760008062000019620001de565b50505b5060016000805a6200002d6200024b565b6001600160a01b03166001600160a01b03168152602001908152602001600020819062000059620002a7565b5050505a620000676200024b565b6001600160a01b03167fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a6060405160405180910390a260005a620000a9620002f6565b60808190529050620000bb81620000c5565b60a052506200033d565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60405160408082019052600e81526d2230b49029ba30b13632b1b7b4b760911b6020820152805190602001206040516040808201905260018152601960f91b602082015280519060200120845a63996d79a5598160e01b8152602081600483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b8051925060005b60408110156200018c5760008282015260200162000173565b5050506040516020810195909552604080860194909452606085019290925260808401526001600160a01b031660a083015260c090910190516020818303038152906040528051906020012092915050565b632a2a7adb598160e01b8152600481016020815285602082015260005b8681101562000218578086015182820160400152602001620001fb565b506020828760640184336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b505050565b6373509064598160e01b8152602081600483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b8051935060005b6040811015620002a25760008282015260200162000289565b505050565b6322bd64c0598160e01b8152836004820152846024820152600081604483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b60008152602062000289565b6390580256598160e01b8152602081600483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b8051600082529350602062000289565b60805160a051611bf462000370600039806109ae5280611513525080610979528061145152806114de5250611bf46000f3fe6080604052348015610019576000806100166118fd565b50505b506004361061014b5760003560e01c806370a08231116100c1578063a457c2d711610085578063a457c2d714610415578063a9059cbb1461044a578063bf353dbb1461047f578063cd0d0096146104ae578063d505accf146104b6578063dd62ed3e146105105761014b565b806370a082311461034b5780637ecebe001461037a57806395d89b41146103a95780639c52a7f1146103b15780639dc29fac146103e05761014b565b8063313ce56711610113578063313ce567146102825780633644e515146102a057806339509351146102a857806340c10f19146102dd57806354fd4d501461031457806365fae35e1461031c5761014b565b806306fdde0314610159578063095ea7b3146101d857806318160ddd1461022157806323b872dd1461023b57806330adf81f1461027a575b6000806101566118fd565b50505b610161610547565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561019d578082015183820152602001610185565b50505050905090810190601f1680156101ca5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61020d600480360360408110156101f7576000806101f46118fd565b50505b506001600160a01b03813516906020013561056f565b604051901515815260200160405180910390f35b61022961061e565b60405190815260200160405180910390f35b61020d6004803603606081101561025a576000806102576118fd565b50505b506001600160a01b0381358116916020810135909116906040013561062b565b610229610940565b61028a610964565b60405160ff909116815260200160405180910390f35b610229610969565b61020d600480360360408110156102c7576000806102c46118fd565b50505b506001600160a01b0381351690602001356109d4565b610312600480360360408110156102fc576000806102f96118fd565b50505b506001600160a01b038135169060200135610add565b005b610161610ccf565b6103126004803603602081101561033b576000806103386118fd565b50505b50356001600160a01b0316610cea565b6102296004803603602081101561036a576000806103676118fd565b50505b50356001600160a01b0316610dd0565b61022960048036036020811015610399576000806103966118fd565b50505b50356001600160a01b0316610de8565b610161610e00565b610312600480360360208110156103d0576000806103cd6118fd565b50505b50356001600160a01b0316610e1d565b610312600480360360408110156103ff576000806103fc6118fd565b50505b506001600160a01b038135169060200135610f00565b61020d60048036036040811015610434576000806104316118fd565b50505b506001600160a01b03813516906020013561115a565b61020d60048036036040811015610469576000806104666118fd565b50505b506001600160a01b038135169060200135611218565b6102296004803603602081101561049e5760008061049b6118fd565b50505b50356001600160a01b0316611437565b61022961144f565b610312600480360360e08110156104d5576000806104d26118fd565b50505b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135611473565b6102296004803603604081101561052f5760008061052c6118fd565b50505b506001600160a01b03813581169160200135166117a2565b60405160408082019052600e81526d2230b49029ba30b13632b1b7b4b760911b602082015281565b600081600360005a61057f611968565b6001600160a01b03166001600160a01b031681526020019081526020016000206001600160a01b03851660009081526020919091526040902081906105c26119c2565b505050826001600160a01b03165a6105d8611968565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405190815260200160405180910390a35060015b92915050565b6001610628611a10565b81565b60006001600160a01b038316158015906106af57505a63996d79a5598160e01b8152602081600483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b8051925060005b60408110156106965760008282015260200161067f565b5050506001600160a01b0316836001600160a01b031614155b6106fe5760405162461bcd60e51b81526020600482015260136024820152724461692f696e76616c69642d6164647265737360681b6044820152606401604051809103906106fb6118fd565b50505b6001600160a01b038416600090815260026020526040812061071e611a10565b9050828110156107785760405162461bcd60e51b81526020600482015260186024820152774461692f696e73756666696369656e742d62616c616e636560401b6044820152606401604051809103906107756118fd565b50505b5a610781611968565b6001600160a01b0316856001600160a01b0316146108a0576001600160a01b038516600090815260036020526040812060005a6107bc611968565b6001600160a01b03166001600160a01b031681526020019081526020016000206107e4611a10565b9050600019811461089e57838110156108495760405162461bcd60e51b815260206004820152601a6024820152794461692f696e73756666696369656e742d616c6c6f77616e636560301b6044820152606401604051809103906108466118fd565b50505b6001600160a01b03861660009081526003602052848203906040902060005a610870611968565b6001600160a01b03166001600160a01b03168152602001908152602001600020819061089a6119c2565b5050505b505b6001600160a01b03851660009081526002602052838203906040902081906108c66119c2565b5050506001600160a01b03841660009081526002602052839060409020600082826108ef611a10565b0192505081906108fd6119c2565b505050836001600160a01b0316856001600160a01b0316600080516020611bd48339815191528560405190815260200160405180910390a3506001949350505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b601281565b6000805a610975611a5c565b90507f000000000000000000000000000000000000000000000000000000000000000081146109ac576109a7816117c8565b6109ce565b7f00000000000000000000000000000000000000000000000000000000000000005b91505090565b600080610a2e600360005a6109e7611968565b6001600160a01b03166001600160a01b031681526020019081526020016000206001600160a01b038616600090815260209190915260409020610a28611a10565b846118df565b905080600360005a610a3e611968565b6001600160a01b03166001600160a01b031681526020019081526020016000206001600160a01b0386166000908152602091909152604090208190610a816119c2565b505050836001600160a01b03165a610a97611968565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405190815260200160405180910390a35060019392505050565b6000805a610ae9611968565b6001600160a01b03166001600160a01b03168152602001908152602001600020610b11611a10565b600114610b625760405162461bcd60e51b815260206004820152601260248201527111185a4bdb9bdd0b585d5d1a1bdc9a5e995960721b604482015260640160405180910390610b5f6118fd565b50505b6001600160a01b03821615801590610be457505a63996d79a5598160e01b8152602081600483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b8051925060005b6040811015610bcb57600082820152602001610bb4565b5050506001600160a01b0316826001600160a01b031614155b610c335760405162461bcd60e51b81526020600482015260136024820152724461692f696e76616c69642d6164647265737360681b604482015260640160405180910390610c306118fd565b50505b6001600160a01b03821660009081526002602052819060409020610c55611a10565b6001600160a01b03841660009081526002602052910190604090208190610c7a6119c2565b505050610c906001610c8a611a10565b826118df565b806001610c9b6119c2565b5050506001600160a01b0382166000600080516020611bd48339815191528360405190815260200160405180910390a35050565b6040516040808201905260018152601960f91b602082015281565b6000805a610cf6611968565b6001600160a01b03166001600160a01b03168152602001908152602001600020610d1e611a10565b600114610d6f5760405162461bcd60e51b815260206004820152601260248201527111185a4bdb9bdd0b585d5d1a1bdc9a5e995960721b604482015260640160405180910390610d6c6118fd565b50505b6001600160a01b03811660009081526020819052600190604090208190610d946119c2565b505050806001600160a01b03167fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a6060405160405180910390a250565b60026020528060005260406000209050610628611a10565b60046020528060005260406000209050610628611a10565b60405160408082019052600381526244414960e81b602082015281565b6000805a610e29611968565b6001600160a01b03166001600160a01b03168152602001908152602001600020610e51611a10565b600114610ea25760405162461bcd60e51b815260206004820152601260248201527111185a4bdb9bdd0b585d5d1a1bdc9a5e995960721b604482015260640160405180910390610e9f6118fd565b50505b6001600160a01b03811660009081526020819052604081208190610ec46119c2565b505050806001600160a01b03167f184450df2e323acec0ed3b5c7531b81f9b4cdef7914dfd4c0a4317416bb5251b60405160405180910390a250565b6001600160a01b0382166000908152600260205260408120610f20611a10565b905081811015610f7a5760405162461bcd60e51b81526020600482015260186024820152774461692f696e73756666696369656e742d62616c616e636560401b604482015260640160405180910390610f776118fd565b50505b5a610f83611968565b6001600160a01b0316836001600160a01b031614158015610fd857506000805a610fab611968565b6001600160a01b03166001600160a01b03168152602001908152602001600020610fd3611a10565b600114155b156110e4576001600160a01b038316600090815260036020526040812060005a611000611968565b6001600160a01b03166001600160a01b03168152602001908152602001600020611028611a10565b905060001981146110e2578281101561108d5760405162461bcd60e51b815260206004820152601a6024820152794461692f696e73756666696369656e742d616c6c6f77616e636560301b60448201526064016040518091039061108a6118fd565b50505b6001600160a01b03841660009081526003602052838203906040902060005a6110b4611968565b6001600160a01b03166001600160a01b0316815260200190815260200160002081906110de6119c2565b5050505b505b6001600160a01b038316600090815260026020528282039060409020819061110a6119c2565b505050816001611118611a10565b038060016111246119c2565b5060009150506001600160a01b038416600080516020611bd48339815191528460405190815260200160405180910390a3505050565b600080600360005a61116a611968565b6001600160a01b03166001600160a01b031681526020019081526020016000206001600160a01b0385166000908152602091909152604090206111ab611a10565b9050828110156112075760405162461bcd60e51b815260206004820152601a6024820152794461692f696e73756666696369656e742d616c6c6f77616e636560301b6044820152606401604051809103906112046118fd565b50505b82900380600360005a610a3e611968565b60006001600160a01b0383161580159061129c57505a63996d79a5598160e01b8152602081600483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b8051925060005b60408110156112835760008282015260200161126c565b5050506001600160a01b0316836001600160a01b031614155b6112eb5760405162461bcd60e51b81526020600482015260136024820152724461692f696e76616c69642d6164647265737360681b6044820152606401604051809103906112e86118fd565b50505b6000600260005a6112fa611968565b6001600160a01b03166001600160a01b03168152602001908152602001600020611322611a10565b90508281101561137c5760405162461bcd60e51b81526020600482015260186024820152774461692f696e73756666696369656e742d62616c616e636560401b6044820152606401604051809103906113796118fd565b50505b828103600260005a61138c611968565b6001600160a01b03166001600160a01b0316815260200190815260200160002081906113b66119c2565b5050506001600160a01b03841660009081526002602052839060409020600082826113df611a10565b0192505081906113ed6119c2565b505050836001600160a01b03165a611403611968565b6001600160a01b0316600080516020611bd48339815191528560405190815260200160405180910390a35060019392505050565b60006020528060005260406000209050610628611a10565b7f000000000000000000000000000000000000000000000000000000000000000081565b835a61147d611aa2565b11156114cd5760405162461bcd60e51b815260206004820152601260248201527111185a4bdc195c9b5a5d0b595e1c1a5c995960721b6044820152606401604051809103906114ca6118fd565b50505b60005a6114d8611a5c565b905060007f000000000000000000000000000000000000000000000000000000000000000082146115115761150c826117c8565b611533565b7f00000000000000000000000000000000000000000000000000000000000000005b6001600160a01b038a16600090815260046020527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9908b908b908b906040902060008161157e611a10565b9160018301915061158d6119c2565b50508b60405160200180878152602001866001600160a01b03168152602001856001600160a01b0316815260200184815260200183815260200182815260200196505050505050506040516020818303038152906040528051906020012060405161190160f01b6020820152602281019290925260428201526062016040516020818303038152906040528051906020012090506001600160a01b038916158015906116c2575060018186868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855a611684611ae8565b50505050501580156116a3573d6000803e3d60006116a06118fd565b50505b505050602060405103516001600160a01b0316896001600160a01b0316145b6117105760405162461bcd60e51b815260206004820152601260248201527111185a4bda5b9d985b1a590b5c195c9b5a5d60721b60448201526064016040518091039061170d6118fd565b50505b6001600160a01b038916600090815260036020528790604090206001600160a01b038a16600090815260209190915260409020819061174d6119c2565b505050876001600160a01b0316896001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258960405190815260200160405180910390a3505050505050505050565b600360205281600052604060002060205280600052604060002091506106289050611a10565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60405160408082019052600e81526d2230b49029ba30b13632b1b7b4b760911b6020820152805190602001206040516040808201905260018152601960f91b602082015280519060200120845a63996d79a5598160e01b8152602081600483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b8051925060005b604081101561188d57600082820152602001611876565b5050506040516020810195909552604080860194909452606085019290925260808401526001600160a01b031660a083015260c090910190516020818303038152906040528051906020012092915050565b80820182811015610618576000806118f56118fd565b505092915050565b632a2a7adb598160e01b8152600481016020815285602082015260005b8681101561193557808601518282016040015260200161191a565b506020828760640184336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b505050565b6373509064598160e01b8152602081600483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b8051935060005b60408110156119bd576000828201526020016119a6565b505050565b6322bd64c0598160e01b8152836004820152846024820152600081604483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b6000815260206119a6565b6303daa959598160e01b8152836004820152602081602483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b805160008252935060206119a6565b6390580256598160e01b8152602081600483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b805160008252935060206119a6565b63bdbf8c36598160e01b8152602081600483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b805160008252935060206119a6565b638540661f598160e01b8152611b19565b8080831115610618575090919050565b8080831015610618575090919050565b836004820152846024820152606060448201528660648201526084810160005b88811015611b51578088015182820152602001611b39565b506060828960a40184336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b815160408301513d6000853e8b8b82606087013350600060045af15059611ba68d3d611b09565b8c01611bb28187611af9565b5b82811015611bc75760008152602001611bb3565b50929c5050505050505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101425760003560e01c806370a08231116100b8578063a457c2d71161007c578063a457c2d7146103b0578063a9059cbb146103dc578063bf353dbb14610408578063cd0d00961461042e578063d505accf14610436578063dd62ed3e1461048757610142565b806370a082311461030a5780637ecebe001461033057806395d89b41146103565780639c52a7f11461035e5780639dc29fac1461038457610142565b8063313ce5671161010a578063313ce5671461025c5780633644e5151461027a578063395093511461028257806340c10f19146102ae57806354fd4d50146102dc57806365fae35e146102e457610142565b806306fdde0314610147578063095ea7b3146101c457806318160ddd1461020457806323b872dd1461021e57806330adf81f14610254575b600080fd5b61014f6104b5565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610189578181015183820152602001610171565b50505050905090810190601f1680156101b65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101f0600480360360408110156101da57600080fd5b506001600160a01b0381351690602001356104df565b604080519115158252519081900360200190f35b61020c610534565b60408051918252519081900360200190f35b6101f06004803603606081101561023457600080fd5b506001600160a01b0381358116916020810135909116906040013561053a565b61020c610725565b610264610749565b6040805160ff9092168252519081900360200190f35b61020c61074e565b6101f06004803603604081101561029857600080fd5b506001600160a01b0381351690602001356107ae565b6102da600480360360408110156102c457600080fd5b506001600160a01b038135169060200135610835565b005b61014f610957565b6102da600480360360208110156102fa57600080fd5b50356001600160a01b0316610974565b61020c6004803603602081101561032057600080fd5b50356001600160a01b0316610a12565b61020c6004803603602081101561034657600080fd5b50356001600160a01b0316610a24565b61014f610a36565b6102da6004803603602081101561037457600080fd5b50356001600160a01b0316610a55565b6102da6004803603604081101561039a57600080fd5b506001600160a01b038135169060200135610af2565b6101f0600480360360408110156103c657600080fd5b506001600160a01b038135169060200135610c84565b6101f0600480360360408110156103f257600080fd5b506001600160a01b038135169060200135610d55565b61020c6004803603602081101561041e57600080fd5b50356001600160a01b0316610e7a565b61020c610e8c565b6102da600480360360e081101561044c57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135610eb0565b61020c6004803603604081101561049d57600080fd5b506001600160a01b0381358116916020013516611134565b6040518060400160405280600e81526020016d2230b49029ba30b13632b1b7b4b760911b81525081565b3360008181526003602090815260408083206001600160a01b03871680855290835281842086905581518681529151939490939092600080516020611259833981519152928290030190a35060015b92915050565b60015481565b60006001600160a01b0383161580159061055d57506001600160a01b0383163014155b6105a4576040805162461bcd60e51b81526020600482015260136024820152724461692f696e76616c69642d6164647265737360681b604482015290519081900360640190fd5b6001600160a01b0384166000908152600260205260409020548281101561060d576040805162461bcd60e51b81526020600482015260186024820152774461692f696e73756666696369656e742d62616c616e636560401b604482015290519081900360640190fd5b6001600160a01b03851633146106c7576001600160a01b038516600090815260036020908152604080832033845290915290205460001981146106c5578381101561069c576040805162461bcd60e51b815260206004820152601a6024820152794461692f696e73756666696369656e742d616c6c6f77616e636560301b604482015290519081900360640190fd5b6001600160a01b0386166000908152600360209081526040808320338452909152902084820390555b505b6001600160a01b038086166000818152600260209081526040808320888703905593881680835291849020805488019055835187815293519193600080516020611239833981519152929081900390910190a3506001949350505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b601281565b6000467f000000000000000000000000000000000000000000000000000000000000000a81146107865761078181611151565b6107a8565b7fc7bbf40a5fb081e6759d5d0ce2447e84427793536887332b932877b94ce51bd65b91505090565b3360009081526003602090815260408083206001600160a01b038616845290915281205481906107de9084611228565b3360008181526003602090815260408083206001600160a01b038a16808552908352928190208590558051858152905194955091936000805160206112598339815191529281900390910190a35060019392505050565b3360009081526020819052604090205460011461088e576040805162461bcd60e51b815260206004820152601260248201527111185a4bdb9bdd0b585d5d1a1bdc9a5e995960721b604482015290519081900360640190fd5b6001600160a01b038216158015906108af57506001600160a01b0382163014155b6108f6576040805162461bcd60e51b81526020600482015260136024820152724461692f696e76616c69642d6164647265737360681b604482015290519081900360640190fd5b6001600160a01b03821660009081526002602052604090208054820190556001546109219082611228565b6001556040805182815290516001600160a01b038416916000916000805160206112398339815191529181900360200190a35050565b604051806040016040528060018152602001601960f91b81525081565b336000908152602081905260409020546001146109cd576040805162461bcd60e51b815260206004820152601260248201527111185a4bdb9bdd0b585d5d1a1bdc9a5e995960721b604482015290519081900360640190fd5b6001600160a01b03811660008181526020819052604080822060019055517fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a609190a250565b60026020526000908152604090205481565b60046020526000908152604090205481565b6040518060400160405280600381526020016244414960e81b81525081565b33600090815260208190526040902054600114610aae576040805162461bcd60e51b815260206004820152601260248201527111185a4bdb9bdd0b585d5d1a1bdc9a5e995960721b604482015290519081900360640190fd5b6001600160a01b038116600081815260208190526040808220829055517f184450df2e323acec0ed3b5c7531b81f9b4cdef7914dfd4c0a4317416bb5251b9190a250565b6001600160a01b03821660009081526002602052604090205481811015610b5b576040805162461bcd60e51b81526020600482015260186024820152774461692f696e73756666696369656e742d62616c616e636560401b604482015290519081900360640190fd5b6001600160a01b0383163314801590610b84575033600090815260208190526040902054600114155b15610c33576001600160a01b03831660009081526003602090815260408083203384529091529020546000198114610c315782811015610c08576040805162461bcd60e51b815260206004820152601a6024820152794461692f696e73756666696369656e742d616c6c6f77616e636560301b604482015290519081900360640190fd5b6001600160a01b0384166000908152600360209081526040808320338452909152902083820390555b505b6001600160a01b0383166000818152600260209081526040808320868603905560018054879003905580518681529051929392600080516020611239833981519152929181900390910190a3505050565b3360009081526003602090815260408083206001600160a01b038616845290915281205482811015610cfa576040805162461bcd60e51b815260206004820152601a6024820152794461692f696e73756666696369656e742d616c6c6f77616e636560301b604482015290519081900360640190fd5b3360008181526003602090815260408083206001600160a01b03891680855290835292819020948790039485905580518581529051929392600080516020611259833981519152929181900390910190a35060019392505050565b60006001600160a01b03831615801590610d7857506001600160a01b0383163014155b610dbf576040805162461bcd60e51b81526020600482015260136024820152724461692f696e76616c69642d6164647265737360681b604482015290519081900360640190fd5b3360009081526002602052604090205482811015610e1f576040805162461bcd60e51b81526020600482015260186024820152774461692f696e73756666696369656e742d62616c616e636560401b604482015290519081900360640190fd5b33600081815260026020908152604080832087860390556001600160a01b0388168084529281902080548801905580518781529051929392600080516020611239833981519152929181900390910190a35060019392505050565b60006020819052908152604090205481565b7f000000000000000000000000000000000000000000000000000000000000000a81565b83421115610efa576040805162461bcd60e51b815260206004820152601260248201527111185a4bdc195c9b5a5d0b595e1c1a5c995960721b604482015290519081900360640190fd5b4660007f000000000000000000000000000000000000000000000000000000000000000a8214610f3257610f2d82611151565b610f54565b7fc7bbf40a5fb081e6759d5d0ce2447e84427793536887332b932877b94ce51bd65b6001600160a01b03808b1660008181526004602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981840152808401859052948e166060860152608085018d905260a085015260c08085018c90528251808603909101815260e08501835280519082012061190160f01b6101008601526101028501959095526101228085019590955281518085039095018552610142909301905282519290910191909120915015801590611098575060018186868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611079573d6000803e3d6000fd5b505050602060405103516001600160a01b0316896001600160a01b0316145b6110de576040805162461bcd60e51b815260206004820152601260248201527111185a4bda5b9d985b1a590b5c195c9b5a5d60721b604482015290519081900360640190fd5b6001600160a01b03808a166000818152600360209081526040808320948d16808452948252918290208b905581518b815291516000805160206112598339815191529281900390910190a3505050505050505050565b600360209081526000928352604080842090915290825290205481565b604080518082018252600e81526d2230b49029ba30b13632b1b7b4b760911b6020918201528151808301835260018152601960f91b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527f0b1461ddc0c1d5ded79a1db0f74dae949050a7c0b28728c724b24958c27a328b818401527fad7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a5606082015260808101939093523060a0808501919091528251808503909101815260c0909301909152815191012090565b8082018281101561052e57600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a26469706673582212204174ca7efe9461957e50debebcf436a7f5badaf0bd4b64389fd2735d2369a5b264736f6c63430007060033

Deployed ByteCode Sourcemap

879:6368:0:-:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;1269:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4399:194;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;4399:194:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;1455:26;;;:::i;:::-;;;;;;;;;;;;;;;3724:671;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;3724:671:0;;;;;;;;;;;;;;;;;:::i;2302:137::-;;;:::i;1413:37::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;3059:224;;;:::i;4597:289::-;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;4597:289:0;;;;;;;;:::i;5307:391::-;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;5307:391:0;;;;;;;;:::i;:::-;;1370:38;;;:::i;964:89::-;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;964:89:0;-1:-1:-1;;;;;964:89:0;;:::i;1488:66::-;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;1488:66:0;-1:-1:-1;;;;;1488:66:0;;:::i;1630:63::-;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;1630:63:0;-1:-1:-1;;;;;1630:63:0;;:::i;1325:40::-;;;:::i;1057:89::-;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;1057:89:0;-1:-1:-1;;;;;1057:89:0;;:::i;5702:683::-;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;5702:683:0;;;;;;;;:::i;4890:387::-;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;4890:387:0;;;;;;;;:::i;3319:401::-;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;3319:401:0;;;;;;;;:::i;918:41::-;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;918:41:0;-1:-1:-1;;;;;918:41:0;;:::i;2207:42::-;;;:::i;6426:818::-;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;6426:818:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;1559:66::-;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;1559:66:0;;;;;;;;;;:::i;1269:51::-;;;;;;;;;;;;-1:-1:-1;;;1269:51:0;;;;;:::o;4399:194::-;4466:4;4512:5;4479:9;:21;4489:10;;;:::i;:::-;-1:-1:-1;;;;;4479:21:0;-1:-1:-1;;;;;4479:21:0;;;;;;;;;;;;-1:-1:-1;;;;;4479:30:0;;;;;;;;;;;;;;:38;;;;:::i;:::-;;;;4552:7;-1:-1:-1;;;;;4531:36:0;4540:10;;;:::i;:::-;-1:-1:-1;;;;;4531:36:0;;4561:5;4531:36;;;;;;;;;;;;;;-1:-1:-1;4583:4:0;4399:194;;;;;:::o;1455:26::-;;;;:::i;:::-;;:::o;3724:671::-;3805:4;-1:-1:-1;;;;;3826:16:0;;;;;;:39;;;3860:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3846:19:0;:2;-1:-1:-1;;;;;3846:19:0;;;3826:39;3818:71;;;;-1:-1:-1;;;3818:71:0;;;;;;;;;;;;-1:-1:-1;;;3818:71:0;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;3914:15:0;;3896;3914;;;:9;:15;;;3896;3914;;;:::i;:::-;3896:33;;3955:5;3944:7;:16;;3936:53;;;;-1:-1:-1;;;3936:53:0;;;;;;;;;;;;-1:-1:-1;;;3936:53:0;;;;;;;;;;;;;;:::i;:::-;;;;4010:10;;;:::i;:::-;-1:-1:-1;;;;;4002:18:0;:4;-1:-1:-1;;;;;4002:18:0;;3998:262;;-1:-1:-1;;;;;4049:15:0;;4031;4049;;;:9;:15;;;4031;4049;:27;4065:10;;;:::i;:::-;-1:-1:-1;;;;;4049:27:0;-1:-1:-1;;;;;4049:27:0;;;;;;;;;;;;;;:::i;:::-;4031:45;;-1:-1:-1;;4089:7:0;:28;4085:168;;4149:5;4138:7;:16;;4130:55;;;;-1:-1:-1;;;4130:55:0;;;;;;;;;;;;-1:-1:-1;;;4130:55:0;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;4198:15:0;;;;;;:9;:15;;4228;;;;4198;;;:27;4214:10;;;:::i;:::-;-1:-1:-1;;;;;4198:27:0;-1:-1:-1;;;;;4198:27:0;;;;;;;;;;;;:45;;;;:::i;:::-;;;;4085:168;3998:262;;-1:-1:-1;;;;;4268:15:0;;;;;;:9;:15;;4286;;;;4268;;;:33;;;;:::i;:::-;-1:-1:-1;;;;;;;;4308:13:0;;;;;;:9;:13;;4325:5;;4308:13;;;;:22;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;4359:2;-1:-1:-1;;;;;4344:25:0;4353:4;-1:-1:-1;;;;;4344:25:0;-1:-1:-1;;;;;;;;;;;4363:5:0;4344:25;;;;;;;;;;;;;;-1:-1:-1;4385:4:0;;3724:671;-1:-1:-1;;;;3724:671:0:o;2302:137::-;2344:95;2302:137;:::o;1413:37::-;1448:2;1413:37;:::o;3059:224::-;3110:7;3126:15;3169:9;;;:::i;:::-;3158:20;;3203:17;3192:7;:28;:85;;3243:34;3269:7;3243:25;:34::i;:::-;3192:85;;;3223:17;3192:85;3185:92;;;3059:224;:::o;4597:289::-;4679:4;4692:16;4711:48;4716:9;:21;4726:10;;;:::i;:::-;-1:-1:-1;;;;;4716:21:0;-1:-1:-1;;;;;4716:21:0;;;;;;;;;;;;-1:-1:-1;;;;;4716:30:0;;;;;;;;;;;;;;;;:::i;:::-;4748:10;4711:4;:48::i;:::-;4692:67;;4799:8;4766:9;:21;4776:10;;;:::i;:::-;-1:-1:-1;;;;;4766:21:0;-1:-1:-1;;;;;4766:21:0;;;;;;;;;;;;-1:-1:-1;;;;;4766:30:0;;;;;;;;;;;;;;:41;;;;:::i;:::-;;;;4842:7;-1:-1:-1;;;;;4821:39:0;4830:10;;;:::i;:::-;-1:-1:-1;;;;;4821:39:0;;4851:8;4821:39;;;;;;;;;;;;;;-1:-1:-1;4876:4:0;;4597:289;-1:-1:-1;;;4597:289:0:o;5307:391::-;1179:5;:17;1185:10;;;:::i;:::-;-1:-1:-1;;;;;1179:17:0;-1:-1:-1;;;;;1179:17:0;;;;;;;;;;;;;;:::i;:::-;1200:1;1179:22;1171:53;;;;-1:-1:-1;;;1171:53:0;;;;;;;;;;;;-1:-1:-1;;;1171:53:0;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;5377:16:0;::::1;::::0;;::::1;::::0;:39:::1;;;5411:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;::::1;;;;;;;;-1:-1:-1::0;;;;;5397:19:0::1;:2;-1:-1:-1::0;;;;;5397:19:0::1;;;5377:39;5369:71;;;;-1:-1:-1::0;;;5369:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;5369:71:0;;;;;;::::1;;;;;;;;:::i;:::-;;;;-1:-1:-1::0;;;;;5463:13:0;::::1;;::::0;;;:9:::1;:13;::::0;5479:5;;5463:13;;::::1;;;:::i;:::-;-1:-1:-1::0;;;;;5447:13:0;::::1;;::::0;;;:9:::1;:13;::::0;5463:21;::::1;::::0;5447:13;;::::1;:37;;;;:::i;:::-;;;;5623:24;5628:11;;;:::i;:::-;5641:5;5623:4;:24::i;:::-;5607:40:::0;:11:::1;:40;;:::i;:::-;-1:-1:-1::0;;;;;;;;5661:31:0;::::1;5678:1;-1:-1:-1::0;;;;;;;;;;;5686:5:0;5661:31:::1;;::::0;;;::::1;;;;;;;;;5307:391:::0;;:::o;1370:38::-;;;;;;;;;;;;-1:-1:-1;;;1370:38:0;;;;;:::o;964:89::-;1179:5;:17;1185:10;;;:::i;:::-;-1:-1:-1;;;;;1179:17:0;-1:-1:-1;;;;;1179:17:0;;;;;;;;;;;;;;:::i;:::-;1200:1;1179:22;1171:53;;;;-1:-1:-1;;;1171:53:0;;;;;;;;;;;;-1:-1:-1;;;1171:53:0;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;1012:10:0;::::1;:5;:10:::0;;;::::1;::::0;;;1025:1:::1;::::0;1012:10;;::::1;:14;;;;:::i;:::-;;;;1043:3;-1:-1:-1::0;;;;;1038:9:0::1;;;;;;;;;;;964:89:::0;:::o;1488:66::-;;;;;;;;;;;-1:-1:-1;1488:66:0;;:::i;1630:63::-;;;;;;;;;;;-1:-1:-1;1630:63:0;;:::i;1325:40::-;;;;;;;;;;;;-1:-1:-1;;;1325:40:0;;;;;:::o;1057:89::-;1179:5;:17;1185:10;;;:::i;:::-;-1:-1:-1;;;;;1179:17:0;-1:-1:-1;;;;;1179:17:0;;;;;;;;;;;;;;:::i;:::-;1200:1;1179:22;1171:53;;;;-1:-1:-1;;;1171:53:0;;;;;;;;;;;;-1:-1:-1;;;1171:53:0;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;1105:10:0;::::1;1118:1;1105:10:::0;;;::::1;::::0;;;;1118:1;1105:10:::1;:14;;;;:::i;:::-;;;;1136:3;-1:-1:-1::0;;;;;1131:9:0::1;;;;;;;;;;;1057:89:::0;:::o;5702:683::-;-1:-1:-1;;;;;5779:15:0;;5761;5779;;;:9;:15;;;5761;5779;;;:::i;:::-;5761:33;;5820:5;5809:7;:16;;5801:53;;;;-1:-1:-1;;;5801:53:0;;;;;;;;;;;;-1:-1:-1;;;5801:53:0;;;;;;;;;;;;;;:::i;:::-;;;;5875:10;;;:::i;:::-;-1:-1:-1;;;;;5867:18:0;:4;-1:-1:-1;;;;;5867:18:0;;;:44;;;;;5889:5;:17;5895:10;;;:::i;:::-;-1:-1:-1;;;;;5889:17:0;-1:-1:-1;;;;;5889:17:0;;;;;;;;;;;;;;:::i;:::-;5910:1;5889:22;;5867:44;5863:288;;;-1:-1:-1;;;;;5940:15:0;;5922;5940;;;:9;:15;;;5922;5940;:27;5956:10;;;:::i;:::-;-1:-1:-1;;;;;5940:27:0;-1:-1:-1;;;;;5940:27:0;;;;;;;;;;;;;;:::i;:::-;5922:45;;-1:-1:-1;;5980:7:0;:28;5976:168;;6040:5;6029:7;:16;;6021:55;;;;-1:-1:-1;;;6021:55:0;;;;;;;;;;;;-1:-1:-1;;;6021:55:0;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;6089:15:0;;;;;;:9;:15;;6119;;;;6089;;;:27;6105:10;;;:::i;:::-;-1:-1:-1;;;;;6089:27:0;-1:-1:-1;;;;;6089:27:0;;;;;;;;;;;;:45;;;;:::i;:::-;;;;5976:168;5863:288;;-1:-1:-1;;;;;6159:15:0;;;;;;:9;:15;;6177;;;;6159;;;:33;;;;:::i;:::-;;;;6327:5;6313:11;;;:::i;:::-;:19;;6295:11;:37;;:::i;:::-;-1:-1:-1;6369:1:0;;-1:-1:-1;;;;;;;6346:33:0;;-1:-1:-1;;;;;;;;;;;6373:5:0;6346:33;;;;;;;;;;;;;;5702:683;;;:::o;4890:387::-;4977:4;4990:15;5008:9;:21;5018:10;;;:::i;:::-;-1:-1:-1;;;;;5008:21:0;-1:-1:-1;;;;;5008:21:0;;;;;;;;;;;;-1:-1:-1;;;;;5008:30:0;;;;;;;;;;;;;;;;:::i;:::-;4990:48;;5064:15;5053:7;:26;;5045:65;;;;-1:-1:-1;;;5045:65:0;;;;;;;;;;;;-1:-1:-1;;;5045:65:0;;;;;;;;;;;;;;:::i;:::-;;;;5127:25;;;;5159:9;:21;5169:10;;;:::i;3319:401::-;3382:4;-1:-1:-1;;;;;3403:16:0;;;;;;:39;;;3437:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3423:19:0;:2;-1:-1:-1;;;;;3423:19:0;;;3403:39;3395:71;;;;-1:-1:-1;;;3395:71:0;;;;;;;;;;;;-1:-1:-1;;;3395:71:0;;;;;;;;;;;;;;:::i;:::-;;;;3473:15;3491:9;:21;3501:10;;;:::i;:::-;-1:-1:-1;;;;;3491:21:0;-1:-1:-1;;;;;3491:21:0;;;;;;;;;;;;;;:::i;:::-;3473:39;;3538:5;3527:7;:16;;3519:53;;;;-1:-1:-1;;;3519:53:0;;;;;;;;;;;;-1:-1:-1;;;3519:53:0;;;;;;;;;;;;;;:::i;:::-;;;;3615:5;3605:7;:15;3581:9;:21;3591:10;;;:::i;:::-;-1:-1:-1;;;;;3581:21:0;-1:-1:-1;;;;;3581:21:0;;;;;;;;;;;;:39;;;;:::i;:::-;-1:-1:-1;;;;;;;;3627:13:0;;;;;;:9;:13;;3644:5;;3627:13;;;;:22;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;3684:2;-1:-1:-1;;;;;3663:31:0;3672:10;;;:::i;:::-;-1:-1:-1;;;;;3663:31:0;-1:-1:-1;;;;;;;;;;;3688:5:0;3663:31;;;;;;;;;;;;;;-1:-1:-1;3710:4:0;;3319:401;-1:-1:-1;;;3319:401:0:o;918:41::-;;;;;;;;;;;-1:-1:-1;918:41:0;;:::i;2207:42::-;;;:::o;6426:818::-;6581:8;6562:15;;;:::i;:::-;:27;;6554:58;;;;-1:-1:-1;;;6554:58:0;;;;;;;;;;;;-1:-1:-1;;;6554:58:0;;;;;;;;;;;;;;:::i;:::-;;;;6621:15;6664:9;;;:::i;:::-;6653:20;;6682:14;6779:17;6768:7;:28;:85;;6819:34;6845:7;6819:25;:34::i;:::-;6768:85;;;6799:17;6768:85;-1:-1:-1;;;;;6993:13:0;;;;;;:6;:13;;2344:95;;6931:5;;6951:7;;6973:5;;6993:13;;;;:15;;;:::i;:::-;;;;;;-1:-1:-1;6993:15:0;;:::i;:::-;;;7023:8;6876:168;;;;;;;;;;;-1:-1:-1;;;;;6876:168:0;;;;;;-1:-1:-1;;;;;6876:168:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6866:179;;;;;;6716:338;;-1:-1:-1;;;6716:338:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6706:349;;;;;;6682:373;-1:-1:-1;;;;;;7072:19:0;;;;;;:58;;;7104:26;7114:6;7122:1;7125;7128;7104:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;7095:35:0;:5;-1:-1:-1;;;;;7095:35:0;;7072:58;7064:89;;;;-1:-1:-1;;;7064:89:0;;;;;;;;;;;;-1:-1:-1;;;7064:89:0;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;7162:16:0;;;;;;:9;:16;;7190:5;;7162:16;;;-1:-1:-1;;;;;7162:25:0;;;;;;;;;;;;;;:33;;;;:::i;:::-;;;;7223:7;-1:-1:-1;;;;;7207:31:0;7216:5;-1:-1:-1;;;;;7207:31:0;;7232:5;7207:31;;;;;;;;;;;;;;6426:818;;;;;;;;;:::o;1559:66::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;1559:66:0;;-1:-1:-1;1559:66:0;:::i;2691:364::-;2765:7;2827:95;2949:4;;;;;;;;;;;-1:-1:-1;;;2949:4:0;;;;;2933:22;;;;;2982:7;;;;;;;;;;;-1:-1:-1;;;2982:7:0;;;;;2966:25;;;;;3002:7;3028:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2806:236;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2806:236:0;;;;;;;;;;;;;;;;;;;;;2788:261;;;;;;2781:268;2691:364;-1:-1:-1;;2691:364:0:o;1951:108::-;2041:5;;;2036:16;;;;2028:25;;;;;;:::i;:::-;;;1951:108;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Loading