Contract 0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b 2

Contract Overview

Balance:
0 CRO

CRO Value:
$0.00

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xc4fc23920c874843ac5879bc5873288d296e2aa9944e9d1e79c48226c7eeb9b7Swap58038692022-11-30 18:20:451 hr 15 mins ago0xc1ea088b15cb54692d696d91362d10c5d82a6a58 IN  0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b0 CRO2.53533576541 4,866.558340888
0x46c60b060dd3984d192af96624c723110f7cb05e938dcedd80a0e7aa0e1dfd69Swap58032432022-11-30 17:21:412 hrs 14 mins ago0xc6302894cd030601d5e1f65c8f504c83d5361279 IN  0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b0 CRO2.411218503544 4,866.586681464
0x5272eaf4a20b99e0f35e16dfd159312d39a8f1ed2bb2afc33ec01d354b1cdb20Swap58026532022-11-30 16:25:523 hrs 10 mins ago0x028954b8890996cb25020dce4c3f3704af5808cf IN  0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b0 CRO1.3551822650160
0x3954cf39f874d0452b3420fe17da3e99c72892bcff18ce119616f25695d1d71cSwap58018032022-11-30 15:05:394 hrs 30 mins ago0x217fd95540e7f4ccc98d9b92b1496cf13e822922 IN  0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b0 CRO2.889818091583 4,866.652225638
0xa0e9bd9aa66e54815fe1a73ec42efb810e23a63f28e94e4be725a705d1ab5364Swap58014542022-11-30 14:32:385 hrs 3 mins ago0x96229bd2d8d33b33ddde4fc9503c9ad6e8509e40 IN  0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b0 CRO2.188676927637 4,866.668136379
0x2fb8d0fa487cc9758b32c2c7d10fe0124e139a2abddadae225b71e7a53c77cc9Swap58009352022-11-30 13:43:305 hrs 52 mins ago0xc1ea088b15cb54692d696d91362d10c5d82a6a58 IN  0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b0 CRO1.322538078613 4,866.69173335
0xa879ddc49ac6959a69bb9afacf0fce62b4287ed327143613325fa5571e179ff0Swap58004912022-11-30 13:01:306 hrs 34 mins ago0x2cfa11aa08b55bfd649232debba703f0622745d4 IN  0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b0 CRO2.17077725514 4,866.711628712
0x8ee1c9f53340557faf5ee3b2b00c5af0fa572194512db20147a47aa8274ebbadSwap57982582022-11-30 9:30:0710 hrs 6 mins ago0xe1a27375e1b47dac5c213f9f85dc4b1fba80d88d IN  0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b0 CRO2.4155767057970
0xcd013303240a36efabbce3a9e9c63ec85bda60ccf02e4856fd7922ce4132b7c1Swap57982402022-11-30 9:28:2610 hrs 7 mins ago0xc1ea088b15cb54692d696d91362d10c5d82a6a58 IN  0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b0 CRO1.877349341656 4,866.814454255
0x2fbcba4f0bf62c442495beda6ec4c9257d8da04d2c35537b83961a912679d30bSwap57981412022-11-30 9:19:0410 hrs 17 mins ago0x3849efe7fc4a290a8197fe64e6ad60e069c9db12 IN  0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b22,300 CRO2.61500750
0x6a0fa0ee63b9ceb330cccf0294595a59ee82e3eb2dff0e305441250982891627Swap57980112022-11-30 9:06:4310 hrs 29 mins ago0xfbacb875b5e1d22f8afd366815c647070bbc6f5c IN  0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b0 CRO1.947781290991 4,866.825141903
0x43d7166dbcb1b0d0f5c087c4f2cd1368747342ca9551b0718b92c8733c3481a8Swap57980002022-11-30 9:05:4110 hrs 30 mins ago0xe1a27375e1b47dac5c213f9f85dc4b1fba80d88d IN  0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b0 CRO3.7435714123790
0xc65068849cb767604d524005079e87c96178c75bf46b52f70cc581516eac5d75Swap57979742022-11-30 9:03:1410 hrs 33 mins ago0xe1a27375e1b47dac5c213f9f85dc4b1fba80d88d IN  0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b0 CRO2.5386439437740
0x5656d223bf527ba196befb2d0d9ed7021dbec4ac5ffe5d2e54a0c3c2180dd2beSwap57978752022-11-30 8:53:5210 hrs 42 mins ago0xfbacb875b5e1d22f8afd366815c647070bbc6f5c IN  0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b0 CRO2.468077311972 4,866.831476395
0x95652941c9b1b351a23c9c75945d65b4e65a9b49fa1562e1c641246e654af02fSwap57978722022-11-30 8:53:3610 hrs 42 mins ago0xfbacb875b5e1d22f8afd366815c647070bbc6f5c IN  0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b0 CRO2.468077382242 4,866.831614962
0x399740161fc758fa847d9fac8de7ee2bf5d8756ce610f10a9ebf56ac254b2d2aSwap57978692022-11-30 8:53:1910 hrs 43 mins ago0xc1ea088b15cb54692d696d91362d10c5d82a6a58 IN  0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b0 CRO1.32257612879 4,866.831750858
0xfd25d2febceaf23ba4954b625ac2dc4f32742fa0794580f9cda4b88ceb38d4e9Swap57978572022-11-30 8:52:1010 hrs 44 mins ago0xe1a27375e1b47dac5c213f9f85dc4b1fba80d88d IN  0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b0 CRO1.3533904954590
0x0a4ba43aec579463398b76aa08426dc37251202a936775b19bf37bda3f6d014bSwap57978102022-11-30 8:47:4310 hrs 48 mins ago0xc1ea088b15cb54692d696d91362d10c5d82a6a58 IN  0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b0 CRO1.72863147061 4,866.834477176
0xbeb7c1f68d83e5c2ff7ca1f7eb0166a7ae31131b67bf157718978eb70198965eSwap57978102022-11-30 8:47:4310 hrs 48 mins ago0xfbacb875b5e1d22f8afd366815c647070bbc6f5c IN  0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b0 CRO2.504234547065 4,866.834477176
0xa1daa0dac1c25f6a34832b524a8694692251f984e2101117bd8bc8046f39ab44Swap57978062022-11-30 8:47:2010 hrs 48 mins ago0xfbacb875b5e1d22f8afd366815c647070bbc6f5c IN  0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b0 CRO2.504176242361 4,866.834666296
0x4be621ba393efe9a33c8f84296c1d6cb811d5cdbb00209ca8e341f20fafddb55Swap57977612022-11-30 8:43:0510 hrs 53 mins ago0xc1ea088b15cb54692d696d91362d10c5d82a6a58 IN  0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b0 CRO1.87729955169 4,866.836780079
0xec33fdabe89ad0726b1ea1a4537fe243c443ae35a98c5b5a1fa45e1062ffffbdSwap57977162022-11-30 8:38:5010 hrs 57 mins ago0x3849efe7fc4a290a8197fe64e6ad60e069c9db12 IN  0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b0 CRO3.22586110
0x6cc9db974e8765e2cbe1b890c5c3955b7cb8ec8c6179c5008949787b96a6220aSwap57976862022-11-30 8:36:0011 hrs ago0xfbacb875b5e1d22f8afd366815c647070bbc6f5c IN  0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b0 CRO2.50188199373 4,866.840302394
0xfd2416b10a1b3873ae11049866e8f3ce3a54f6e0b2e0819008c589d5e645d4a9Swap57974742022-11-30 8:15:5811 hrs 20 mins ago0x96229bd2d8d33b33ddde4fc9503c9ad6e8509e40 IN  0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b0 CRO2.405450450041 4,866.850210098
0xf0bf78e64ed09065354c1db0820a9c2156ab22b8538b9c467846b6c80ca0ab01Swap57974632022-11-30 8:14:5611 hrs 21 mins ago0xe1a27375e1b47dac5c213f9f85dc4b1fba80d88d IN  0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b0 CRO2.4030609891650
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x2fbcba4f0bf62c442495beda6ec4c9257d8da04d2c35537b83961a912679d30b57981412022-11-30 9:19:0410 hrs 17 mins ago 0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b 0x99b89e5b261cd1f27f74e6aff7df4d7229b9f42c22,300 CRO
0x4b1540f73d5cae910faca68e9d95f2d060cb5f8cf13469a84d117d33f22bddf157967772022-11-30 7:10:0312 hrs 26 mins ago 0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b 0x99b89e5b261cd1f27f74e6aff7df4d7229b9f42c30 CRO
0x6bf99cec19f9718ee64ee26fa4fa967937a99425970f53cbbe469f06326811d857956132022-11-30 5:19:2514 hrs 16 mins ago 0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b 0x99b89e5b261cd1f27f74e6aff7df4d7229b9f42c678.145146009502198188 CRO
0x40886502cd5ae53845ad04970e55c43819c8cac3706e1a076ef80af7d04d0ee457935632022-11-30 2:03:4317 hrs 32 mins ago 0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b 0x99b89e5b261cd1f27f74e6aff7df4d7229b9f42c17,350 CRO
0x61aaea3b269b88d2f270a5cdfb969e3fe503e54f9af6b1397f2b93b67c66ece457929902022-11-30 1:08:5518 hrs 27 mins ago 0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b 0x99b89e5b261cd1f27f74e6aff7df4d7229b9f42c850 CRO
0xafe1a84cd373c4af5743ba54e34837c9f5bd5cf24acfd6373ebf9e171eff726b57795492022-11-29 3:46:131 day 15 hrs ago 0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b 0x99b89e5b261cd1f27f74e6aff7df4d7229b9f42c2 CRO
0x8cf90c7a11c5174d0b3010f301e06672fdce1b3cd3e8fc43e5fb35b7bb96a92d57774422022-11-29 0:25:181 day 19 hrs ago 0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b 0x99b89e5b261cd1f27f74e6aff7df4d7229b9f42c15 CRO
0xd4dc17cd2b6837d76e2e8fa580ddd24cd431fc31f222443180fab66439f48aec57772712022-11-29 0:08:591 day 19 hrs ago 0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b 0x99b89e5b261cd1f27f74e6aff7df4d7229b9f42c120 CRO
0x1453c15a96f1bccfc0824bb13f488e2aa9d4d7941bf98821ece8e6fa7c6543ee57767962022-11-28 23:23:431 day 20 hrs ago 0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b 0x99b89e5b261cd1f27f74e6aff7df4d7229b9f42c90 CRO
0x890dd070e5fa98cf4bb45839c3b8f12bc4b641caf5bc8cc36d2c5b9a7061da3557758462022-11-28 21:53:031 day 21 hrs ago 0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b 0x99b89e5b261cd1f27f74e6aff7df4d7229b9f42c500 CRO
0xd1560733c9d49d47de63650f2aaf47d381d78193c7ee89636ea77a92b11b65e757755812022-11-28 21:27:471 day 22 hrs ago 0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b 0x99b89e5b261cd1f27f74e6aff7df4d7229b9f42c50.330816266609455586 CRO
0x3311decc99343dc530524b2148f0849826decd76e3470080f4e4d92b20d19cfc57727242022-11-28 16:55:092 days 2 hrs ago 0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b 0x99b89e5b261cd1f27f74e6aff7df4d7229b9f42c50 CRO
0xeade38c04f6aabc5d1ee20663a2e407c5841c31f716062e3d11cd350006af2d557725922022-11-28 16:42:292 days 2 hrs ago 0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b 0x99b89e5b261cd1f27f74e6aff7df4d7229b9f42c450 CRO
0xffd8e8dfb63c05b2334a32afc8a548ed36e3d631cd370e710cd37cc1440c7e1957725712022-11-28 16:40:302 days 2 hrs ago 0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b 0x99b89e5b261cd1f27f74e6aff7df4d7229b9f42c700 CRO
0x4da77e1c179261dcd3fc6ca4d0606bd3632532265822dcc271fa64c0442966dc57705772022-11-28 13:30:042 days 6 hrs ago 0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b 0x99b89e5b261cd1f27f74e6aff7df4d7229b9f42c2 CRO
0xf918f3aef076455aaf7a648ba9d1edc9258f3f77eb51985d194f91ba5413674557683722022-11-28 9:59:322 days 9 hrs ago 0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b 0x99b89e5b261cd1f27f74e6aff7df4d7229b9f42c600.842509688667231972 CRO
0x3efc14380e23bf008bc9230b72da6f7c8d155f9dd175dd568158515769173aae57631182022-11-28 1:37:532 days 17 hrs ago 0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b 0x99b89e5b261cd1f27f74e6aff7df4d7229b9f42c10,000 CRO
0x3663b779d8a2db0b79e938477aa8492d7ce63bbdee96e6331c5f70e74026249e57567282022-11-27 15:27:053 days 4 hrs ago 0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b 0x99b89e5b261cd1f27f74e6aff7df4d7229b9f42c2 CRO
0xf5bc56056f194ccbc4a0e8ac93f199bb4854995c264b4d474a04acc9b1d7bbfa57517242022-11-27 7:30:033 days 12 hrs ago 0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b 0x99b89e5b261cd1f27f74e6aff7df4d7229b9f42c30 CRO
0x706104fa1bb7d75a9eadf7463f714f7378d5aafcdf5910c67d166412db38f7b057465232022-11-26 23:14:353 days 20 hrs ago 0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b 0x99b89e5b261cd1f27f74e6aff7df4d7229b9f42c7.5 CRO
0x4adbe44bdd17864ae162fa92ef95ea133b92cb3f4d22d4b96d8771a80a08b1d357299762022-11-25 21:07:234 days 22 hrs ago 0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b 0x99b89e5b261cd1f27f74e6aff7df4d7229b9f42c300 CRO
0xc906106112f321af3bed14f6e441f5a61d684e2e9c95316a00ded5b58679775457284832022-11-25 18:45:515 days 50 mins ago 0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b 0x99b89e5b261cd1f27f74e6aff7df4d7229b9f42c13 CRO
0xf5746ed01866f4801738429cf512b1cf52fb79e858f3782855525c2ab179b74f57279732022-11-25 17:57:215 days 1 hr ago 0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b 0x99b89e5b261cd1f27f74e6aff7df4d7229b9f42c800 CRO
0x2c0b4f2c7617ea51cbb8af260dd9cb5c027b4bb597749eb6978cd7127ce3659857279682022-11-25 17:56:525 days 1 hr ago 0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b 0x99b89e5b261cd1f27f74e6aff7df4d7229b9f42c1,200 CRO
0x40c91650430664c7e569b07221a111af112aec50a805b7b008a97ecc4b02ffd657224612022-11-25 9:14:305 days 10 hrs ago 0x4a5a7331da84d3834c030a9b8d4f3d687a3b788b 0x99b89e5b261cd1f27f74e6aff7df4d7229b9f42c10,000 CRO
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FireBirdRouter

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at cronoscan.com on 2022-05-06
*/

// SPDX-License-Identifier: MIT

pragma solidity >=0.7.6;
pragma abicoder v2;

interface IFireBirdFactory {
  event PairCreated(address indexed token0, address indexed token1, address pair, uint32 tokenWeight0, uint32 swapFee, uint256);

  function feeTo() external view returns (address);

  function formula() external view returns (address);

  function protocolFee() external view returns (uint256);

  function feeToSetter() external view returns (address);

  function getPair(
    address tokenA,
    address tokenB,
    uint32 tokenWeightA,
    uint32 swapFee
  ) external view returns (address pair);

  function allPairs(uint256) external view returns (address pair);

  function isPair(address) external view returns (bool);

  function allPairsLength() external view returns (uint256);

  function createPair(
    address tokenA,
    address tokenB,
    uint32 tokenWeightA,
    uint32 swapFee
  ) external returns (address pair);

  function getWeightsAndSwapFee(address pair)
    external
    view
    returns (
      uint32 tokenWeight0,
      uint32 tokenWeight1,
      uint32 swapFee
    );

  function setFeeTo(address) external;

  function setFeeToSetter(address) external;

  function setProtocolFee(uint256) external;
}

/*
    Bancor Formula interface
*/
interface IFireBirdFormula {
  function getFactoryReserveAndWeights(
    address factory,
    address pair,
    address tokenA,
    uint8 dexId
  )
    external
    view
    returns (
      address tokenB,
      uint256 reserveA,
      uint256 reserveB,
      uint32 tokenWeightA,
      uint32 tokenWeightB,
      uint32 swapFee
    );

  function getFactoryWeightsAndSwapFee(
    address factory,
    address pair,
    uint8 dexId
  )
    external
    view
    returns (
      uint32 tokenWeight0,
      uint32 tokenWeight1,
      uint32 swapFee
    );

  function getAmountIn(
    uint256 amountOut,
    uint256 reserveIn,
    uint256 reserveOut,
    uint32 tokenWeightIn,
    uint32 tokenWeightOut,
    uint32 swapFee
  ) external view returns (uint256 amountIn);

  function getAmountOut(
    uint256 amountIn,
    uint256 reserveIn,
    uint256 reserveOut,
    uint32 tokenWeightIn,
    uint32 tokenWeightOut,
    uint32 swapFee
  ) external view returns (uint256 amountOut);

  function getFactoryAmountsIn(
    address factory,
    address tokenIn,
    address tokenOut,
    uint256 amountOut,
    address[] calldata path,
    uint8[] calldata dexIds
  ) external view returns (uint256[] memory amounts);

  function getFactoryAmountsOut(
    address factory,
    address tokenIn,
    address tokenOut,
    uint256 amountIn,
    address[] calldata path,
    uint8[] calldata dexIds
  ) external view returns (uint256[] memory amounts);

  function ensureConstantValue(
    uint256 reserve0,
    uint256 reserve1,
    uint256 balance0Adjusted,
    uint256 balance1Adjusted,
    uint32 tokenWeight0
  ) external view returns (bool);

  function getReserves(
    address pair,
    address tokenA,
    address tokenB
  ) external view returns (uint256 reserveA, uint256 reserveB);

  function getOtherToken(address pair, address tokenA) external view returns (address tokenB);

  function quote(
    uint256 amountA,
    uint256 reserveA,
    uint256 reserveB
  ) external pure returns (uint256 amountB);

  function sortTokens(address tokenA, address tokenB) external pure returns (address token0, address token1);

  function mintLiquidityFee(
    uint256 totalLiquidity,
    uint112 reserve0,
    uint112 reserve1,
    uint32 tokenWeight0,
    uint32 tokenWeight1,
    uint112 collectedFee0,
    uint112 collectedFee1
  ) external view returns (uint256 amount);
}

interface IFireBirdPair {
  event Approval(address indexed owner, address indexed spender, uint256 value);
  event Transfer(address indexed from, address indexed to, uint256 value);

  function name() external view returns (string memory);

  function symbol() external view returns (string memory);

  function decimals() external pure returns (uint8);

  function totalSupply() external view returns (uint256);

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

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

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

  function transfer(address to, uint256 value) external returns (bool);

  function transferFrom(
    address from,
    address to,
    uint256 value
  ) external returns (bool);

  function DOMAIN_SEPARATOR() external view returns (bytes32);

  function PERMIT_TYPEHASH() external pure returns (bytes32);

  function nonces(address owner) external view returns (uint256);

  function permit(
    address owner,
    address spender,
    uint256 value,
    uint256 deadline,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external;

  event PaidProtocolFee(uint112 collectedFee0, uint112 collectedFee1);
  event Mint(address indexed sender, uint256 amount0, uint256 amount1);
  event Burn(address indexed sender, uint256 amount0, uint256 amount1, address indexed to);
  event Swap(address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to);
  event Sync(uint112 reserve0, uint112 reserve1);

  function MINIMUM_LIQUIDITY() external pure returns (uint256);

  function factory() external view returns (address);

  function token0() external view returns (address);

  function token1() external view returns (address);

  function getReserves()
    external
    view
    returns (
      uint112 reserve0,
      uint112 reserve1,
      uint32 blockTimestampLast
    );

  function getCollectedFees() external view returns (uint112 _collectedFee0, uint112 _collectedFee1);

  function getTokenWeights() external view returns (uint32 tokenWeight0, uint32 tokenWeight1);

  function getSwapFee() external view returns (uint32);

  function price0CumulativeLast() external view returns (uint256);

  function price1CumulativeLast() external view returns (uint256);

  function mint(address to) external returns (uint256 liquidity);

  function burn(address to) external returns (uint256 amount0, uint256 amount1);

  function swap(
    uint256 amount0Out,
    uint256 amount1Out,
    address to,
    bytes calldata data
  ) external;

  function skim(address to) external;

  function sync() external;

  function initialize(
    address,
    address,
    uint32,
    uint32
  ) external;
}

// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
  function safeApprove(
    address token,
    address to,
    uint256 value
  ) internal {
    // bytes4(keccak256(bytes('approve(address,uint256)')));
    (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
    require(success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper: APPROVE_FAILED");
  }

  function safeTransfer(
    address token,
    address to,
    uint256 value
  ) internal {
    // bytes4(keccak256(bytes('transfer(address,uint256)')));
    (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
    require(success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper: TRANSFER_FAILED");
  }

  function safeTransferFrom(
    address token,
    address from,
    address to,
    uint256 value
  ) internal {
    // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
    (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
    require(success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper: TRANSFER_FROM_FAILED");
  }

  function safeTransferETH(address to, uint256 value) internal {
    (bool success, ) = to.call{value: value}(new bytes(0));
    require(success, "TransferHelper: ETH_TRANSFER_FAILED");
  }
}

interface IERC20 {
  event Approval(address indexed owner, address indexed spender, uint256 value);
  event Transfer(address indexed from, address indexed to, uint256 value);

  function name() external view returns (string memory);

  function symbol() external view returns (string memory);

  function decimals() external view returns (uint8);

  function totalSupply() external view returns (uint256);

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

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

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

  function transfer(address to, uint256 value) external returns (bool);

  function transferFrom(
    address from,
    address to,
    uint256 value
  ) external returns (bool);
}

interface IFireBirdRouter {
  event Exchange(address pair, uint256 amountOut, address output);

  function factory() external view returns (address);

  function formula() external view returns (address);

  function WETH() external view returns (address);

  function swapFeeReward() external view returns (address);

  function addLiquidity(
    address pair,
    address tokenA,
    address tokenB,
    uint256 amountADesired,
    uint256 amountBDesired,
    uint256 amountAMin,
    uint256 amountBMin,
    address to,
    uint256 deadline
  )
    external
    returns (
      uint256 amountA,
      uint256 amountB,
      uint256 liquidity
    );

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

  function swapExactTokensForTokens(
    address tokenIn,
    address tokenOut,
    uint256 amountIn,
    uint256 amountOutMin,
    address[] calldata path,
    uint8[] calldata dexIds,
    address to,
    uint256 deadline
  ) external returns (uint256[] memory amounts);

  function swapTokensForExactTokens(
    address tokenIn,
    address tokenOut,
    uint256 amountOut,
    uint256 amountInMax,
    address[] calldata path,
    uint8[] calldata dexIds,
    address to,
    uint256 deadline
  ) external returns (uint256[] memory amounts);

  function swapExactETHForTokens(
    address tokenOut,
    uint256 amountOutMin,
    address[] calldata path,
    uint8[] calldata dexIds,
    address to,
    uint256 deadline
  ) external payable returns (uint256[] memory amounts);

  function swapTokensForExactETH(
    address tokenIn,
    uint256 amountOut,
    uint256 amountInMax,
    address[] calldata path,
    uint8[] calldata dexIds,
    address to,
    uint256 deadline
  ) external returns (uint256[] memory amounts);

  function swapExactTokensForETH(
    address tokenIn,
    uint256 amountIn,
    uint256 amountOutMin,
    address[] calldata path,
    uint8[] calldata dexIds,
    address to,
    uint256 deadline
  ) external returns (uint256[] memory amounts);

  function swapETHForExactTokens(
    address tokenOut,
    uint256 amountOut,
    address[] calldata path,
    uint8[] calldata dexIds,
    address to,
    uint256 deadline
  ) external payable returns (uint256[] memory amounts);

  function swapExactTokensForTokensSupportingFeeOnTransferTokens(
    address tokenIn,
    address tokenOut,
    uint256 amountIn,
    uint256 amountOutMin,
    address[] calldata path,
    uint8[] calldata dexIds,
    address to,
    uint256 deadline
  ) external;

  function swapExactETHForTokensSupportingFeeOnTransferTokens(
    address tokenOut,
    uint256 amountOutMin,
    address[] calldata path,
    uint8[] calldata dexIds,
    address to,
    uint256 deadline
  ) external payable;

  function swapExactTokensForETHSupportingFeeOnTransferTokens(
    address tokenIn,
    uint256 amountIn,
    uint256 amountOutMin,
    address[] calldata path,
    uint8[] calldata dexIds,
    address to,
    uint256 deadline
  ) external;

  function createPair(
    address tokenA,
    address tokenB,
    uint256 amountA,
    uint256 amountB,
    uint32 tokenWeightA,
    uint32 swapFee,
    address to
  ) external returns (uint256 liquidity);

  function createPairETH(
    address token,
    uint256 amountToken,
    uint32 tokenWeight,
    uint32 swapFee,
    address to
  ) external payable returns (uint256 liquidity);

  function removeLiquidity(
    address pair,
    address tokenA,
    address tokenB,
    uint256 liquidity,
    uint256 amountAMin,
    uint256 amountBMin,
    address to,
    uint256 deadline
  ) external returns (uint256 amountA, uint256 amountB);

  function removeLiquidityETH(
    address pair,
    address token,
    uint256 liquidity,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline
  ) external returns (uint256 amountToken, uint256 amountETH);

  function removeLiquidityWithPermit(
    address pair,
    address tokenA,
    address tokenB,
    uint256 liquidity,
    uint256 amountAMin,
    uint256 amountBMin,
    address to,
    uint256 deadline,
    bool approveMax,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external returns (uint256 amountA, uint256 amountB);

  function removeLiquidityETHWithPermit(
    address pair,
    address token,
    uint256 liquidity,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline,
    bool approveMax,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external returns (uint256 amountToken, uint256 amountETH);

  function removeLiquidityETHSupportingFeeOnTransferTokens(
    address pair,
    address token,
    uint256 liquidity,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline
  ) external returns (uint256 amountETH);

  function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
    address pair,
    address token,
    uint256 liquidity,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline,
    bool approveMax,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external returns (uint256 amountETH);
}

// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)
library SafeMath {
  function add(uint256 x, uint256 y) internal pure returns (uint256 z) {
    require((z = x + y) >= x, "ds-math-add-overflow");
  }

  function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {
    require((z = x - y) <= x, "ds-math-sub-underflow");
  }

  function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {
    require(y == 0 || (z = x * y) / y == x, "ds-math-mul-overflow");
  }

  function div(uint256 a, uint256 b) internal pure returns (uint256 c) {
    require(b > 0, "ds-math-division-by-zero");
    c = a / b;
  }
}

interface IWETH {
  function deposit() external payable;

  function transfer(address to, uint256 value) external returns (bool);

  function withdraw(uint256) external;

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

interface IAggregationExecutor {
  function callBytes(bytes calldata data, address srcSpender) external payable; // 0xd9c45357
}

interface ISwapFeeReward {
  function swap(
    address account,
    address input,
    address output,
    uint256 amount,
    address pair
  ) external returns (bool);

  function pairsListLength() external view returns (uint256);

  function pairsList(uint256 index)
    external
    view
    returns (
      address,
      uint256,
      bool
    );
}

interface IERC20Permit {
  function permit(
    address owner,
    address spender,
    uint256 amount,
    uint256 deadline,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external;
}

library RevertReasonParser {
  function parse(bytes memory data, string memory prefix) internal pure returns (string memory) {
    // https://solidity.readthedocs.io/en/latest/control-structures.html#revert
    // We assume that revert reason is abi-encoded as Error(string)

    // 68 = 4-byte selector 0x08c379a0 + 32 bytes offset + 32 bytes length
    if (data.length >= 68 && data[0] == "\x08" && data[1] == "\xc3" && data[2] == "\x79" && data[3] == "\xa0") {
      string memory reason;
      // solhint-disable no-inline-assembly
      assembly {
        // 68 = 32 bytes data length + 4-byte selector + 32 bytes offset
        reason := add(data, 68)
      }
      /*
                revert reason is padded up to 32 bytes with ABI encoder: Error(string)
                also sometimes there is extra 32 bytes of zeros padded in the end:
                https://github.com/ethereum/solidity/issues/10170
                because of that we can't check for equality and instead check
                that string length + extra 68 bytes is less than overall data length
            */
      require(data.length >= 68 + bytes(reason).length, "Invalid revert reason");
      return string(abi.encodePacked(prefix, "Error(", reason, ")"));
    }
    // 36 = 4-byte selector 0x4e487b71 + 32 bytes integer
    else if (data.length == 36 && data[0] == "\x4e" && data[1] == "\x48" && data[2] == "\x7b" && data[3] == "\x71") {
      uint256 code;
      // solhint-disable no-inline-assembly
      assembly {
        // 36 = 32 bytes data length + 4-byte selector
        code := mload(add(data, 36))
      }
      return string(abi.encodePacked(prefix, "Panic(", _toHex(code), ")"));
    }

    return string(abi.encodePacked(prefix, "Unknown(", _toHex(data), ")"));
  }

  function _toHex(uint256 value) private pure returns (string memory) {
    return _toHex(abi.encodePacked(value));
  }

  function _toHex(bytes memory data) private pure returns (string memory) {
    bytes16 alphabet = 0x30313233343536373839616263646566;
    bytes memory str = new bytes(2 + data.length * 2);
    str[0] = "0";
    str[1] = "x";
    for (uint256 i = 0; i < data.length; i++) {
      str[2 * i + 2] = alphabet[uint8(data[i] >> 4)];
      str[2 * i + 3] = alphabet[uint8(data[i] & 0x0f)];
    }
    return string(str);
  }
}

contract Permitable {
  event Error(string reason);

  function _permit(
    IERC20 token,
    uint256 amount,
    bytes calldata permit
  ) internal {
    if (permit.length == 32 * 7) {
      // solhint-disable-next-line avoid-low-level-calls
      (bool success, bytes memory result) = address(token).call(abi.encodePacked(IERC20Permit.permit.selector, permit));
      if (!success) {
        string memory reason = RevertReasonParser.parse(result, "Permit call failed: ");
        if (token.allowance(msg.sender, address(this)) < amount) {
          revert(reason);
        } else {
          emit Error(reason);
        }
      }
    }
  }
}

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
  function _msgSender() internal view virtual returns (address payable) {
    return msg.sender;
  }

  function _msgData() internal view virtual returns (bytes memory) {
    this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
    return msg.data;
  }
}

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
  address private _owner;

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

  /**
   * @dev Initializes the contract setting the deployer as the initial owner.
   */
  constructor() internal {
    address msgSender = _msgSender();
    _owner = msgSender;
    emit OwnershipTransferred(address(0), msgSender);
  }

  /**
   * @dev Returns the address of the current owner.
   */
  function owner() public view virtual returns (address) {
    return _owner;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(owner() == _msgSender(), "Ownable: caller is not the owner");
    _;
  }

  /**
   * @dev Leaves the contract without owner. It will not be possible to call
   * `onlyOwner` functions anymore. Can only be called by the current owner.
   *
   * NOTE: Renouncing ownership will leave the contract without an owner,
   * thereby removing any functionality that is only available to the owner.
   */
  function renounceOwnership() public virtual onlyOwner {
    emit OwnershipTransferred(_owner, address(0));
    _owner = address(0);
  }

  /**
   * @dev Transfers ownership of the contract to a new account (`newOwner`).
   * Can only be called by the current owner.
   */
  function transferOwnership(address newOwner) public virtual onlyOwner {
    require(newOwner != address(0), "Ownable: new owner is the zero address");
    emit OwnershipTransferred(_owner, newOwner);
    _owner = newOwner;
  }
}

contract FireBirdRouter is IFireBirdRouter, Ownable, Permitable {
  using SafeMath for uint256;
  address public immutable override factory;
  address public immutable override formula;
  address public immutable override WETH;
  address public override swapFeeReward;
  address private constant ETH_ADDRESS = address(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);

  uint256 private constant _PARTIAL_FILL = 0x01;
  uint256 private constant _REQUIRES_EXTRA_ETH = 0x02;
  uint256 private constant _SHOULD_CLAIM = 0x04;
  uint256 private constant _BURN_FROM_MSG_SENDER = 0x08;
  uint256 private constant _BURN_FROM_TX_ORIGIN = 0x10;

  struct SwapDescription {
    IERC20 srcToken;
    IERC20 dstToken;
    address srcReceiver;
    address dstReceiver;
    uint256 amount;
    uint256 minReturnAmount;
    uint256 flags;
    bytes permit;
  }

  event Swapped(address sender, IERC20 srcToken, IERC20 dstToken, address dstReceiver, uint256 spentAmount, uint256 returnAmount);

  modifier ensure(uint256 deadline) {
    require(deadline >= block.timestamp, "Router: EXPIRED");
    _;
  }

  constructor(
    address _factory,
    address _formula,
    address _WETH
  ) public {
    factory = _factory;
    formula = _formula;
    WETH = _WETH;
  }

  receive() external payable {
    assert(msg.sender == WETH);
    // only accept ETH via fallback from the WETH contract
  }

  function setSwapFeeReward(address _swapFeeReward) public onlyOwner {
    swapFeeReward = _swapFeeReward;
  }

  // **** ADD LIQUIDITY ****
  function _addLiquidity(
    address pair,
    address tokenA,
    address tokenB,
    uint256 amountADesired,
    uint256 amountBDesired,
    uint256 amountAMin,
    uint256 amountBMin
  ) internal virtual returns (uint256 amountA, uint256 amountB) {
    (uint256 reserveA, uint256 reserveB) = IFireBirdFormula(formula).getReserves(pair, tokenA, tokenB);
    if (reserveA == 0 && reserveB == 0) {
      (amountA, amountB) = (amountADesired, amountBDesired);
    } else {
      uint256 amountBOptimal = IFireBirdFormula(formula).quote(amountADesired, reserveA, reserveB);
      if (amountBOptimal <= amountBDesired) {
        require(amountBOptimal >= amountBMin, "Router: INSUFFICIENT_B_AMOUNT");
        (amountA, amountB) = (amountADesired, amountBOptimal);
      } else {
        uint256 amountAOptimal = IFireBirdFormula(formula).quote(amountBDesired, reserveB, reserveA);
        assert(amountAOptimal <= amountADesired);
        require(amountAOptimal >= amountAMin, "Router: INSUFFICIENT_A_AMOUNT");
        (amountA, amountB) = (amountAOptimal, amountBDesired);
      }
    }
  }

  function _addLiquidityToken(
    address pair,
    address tokenA,
    address tokenB,
    uint256 amountADesired,
    uint256 amountBDesired,
    uint256 amountAMin,
    uint256 amountBMin
  ) internal returns (uint256 amountA, uint256 amountB) {
    (amountA, amountB) = _addLiquidity(pair, tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
    TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
    TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
  }

  function createPair(
    address tokenA,
    address tokenB,
    uint256 amountA,
    uint256 amountB,
    uint32 tokenWeightA,
    uint32 swapFee,
    address to
  ) public virtual override returns (uint256 liquidity) {
    address pair = IFireBirdFactory(factory).createPair(tokenA, tokenB, tokenWeightA, swapFee);
    _addLiquidityToken(pair, tokenA, tokenB, amountA, amountB, 0, 0);
    liquidity = IFireBirdPair(pair).mint(to);
  }

  function addLiquidity(
    address pair,
    address tokenA,
    address tokenB,
    uint256 amountADesired,
    uint256 amountBDesired,
    uint256 amountAMin,
    uint256 amountBMin,
    address to,
    uint256 deadline
  )
    external
    virtual
    override
    ensure(deadline)
    returns (
      uint256 amountA,
      uint256 amountB,
      uint256 liquidity
    )
  {
    (amountA, amountB) = _addLiquidityToken(pair, tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
    liquidity = IFireBirdPair(pair).mint(to);
  }

  function _addLiquidityETH(
    address pair,
    address token,
    uint256 amountTokenDesired,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to
  )
    internal
    returns (
      uint256 amountToken,
      uint256 amountETH,
      uint256 liquidity
    )
  {
    (amountToken, amountETH) = _addLiquidity(pair, token, WETH, amountTokenDesired, msg.value, amountTokenMin, amountETHMin);
    TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
    transferETHTo(amountETH, pair);
    liquidity = IFireBirdPair(pair).mint(to);
    // refund dust eth, if any
    if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
  }

  function createPairETH(
    address token,
    uint256 amountToken,
    uint32 tokenWeight,
    uint32 swapFee,
    address to
  ) public payable virtual override returns (uint256 liquidity) {
    address pair = IFireBirdFactory(factory).createPair(token, WETH, tokenWeight, swapFee);
    (, , liquidity) = _addLiquidityETH(pair, token, amountToken, 0, 0, to);
  }

  function addLiquidityETH(
    address pair,
    address token,
    uint256 amountTokenDesired,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline
  )
    public
    payable
    virtual
    override
    ensure(deadline)
    returns (
      uint256 amountToken,
      uint256 amountETH,
      uint256 liquidity
    )
  {
    (amountToken, amountETH, liquidity) = _addLiquidityETH(pair, token, amountTokenDesired, amountTokenMin, amountETHMin, to);
  }

  // **** SWAP ****
  // requires the initial amount to have already been sent to the first pair
  function _swap(
    address tokenIn,
    uint256[] memory amounts,
    address[] memory path,
    address _to
  ) internal virtual {
    address input = tokenIn;
    for (uint256 i = 0; i < path.length; i++) {
      IFireBirdPair pairV2 = IFireBirdPair(path[i]);
      address token0 = pairV2.token0();
      uint256 amountOut = amounts[i + 1];
      (uint256 amount0Out, uint256 amount1Out, address output) = input == token0 ? (uint256(0), amountOut, pairV2.token1()) : (amountOut, uint256(0), token0);
      if (swapFeeReward != address(0)) {
        ISwapFeeReward(swapFeeReward).swap(msg.sender, input, output, amountOut, path[i]);
      }
      address to = i < path.length - 1 ? path[i + 1] : _to;
      pairV2.swap(amount0Out, amount1Out, to, new bytes(0));
      emit Exchange(address(pairV2), amountOut, output);
      input = output;
    }
  }

  function swapExactTokensForTokens(
    address tokenIn,
    address tokenOut,
    uint256 amountIn,
    uint256 amountOutMin,
    address[] memory path,
    uint8[] memory dexIds,
    address to,
    uint256 deadline
  ) public virtual override ensure(deadline) returns (uint256[] memory amounts) {
    amounts = _validateAmountOut(tokenIn, tokenOut, amountIn, amountOutMin, path, dexIds);

    TransferHelper.safeTransferFrom(tokenIn, msg.sender, path[0], amounts[0]);
    _swap(tokenIn, amounts, path, to);
  }

  function swapTokensForExactTokens(
    address tokenIn,
    address tokenOut,
    uint256 amountOut,
    uint256 amountInMax,
    address[] calldata path,
    uint8[] calldata dexIds,
    address to,
    uint256 deadline
  ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {
    amounts = _validateAmountIn(tokenIn, tokenOut, amountOut, amountInMax, path, dexIds);

    TransferHelper.safeTransferFrom(tokenIn, msg.sender, path[0], amounts[0]);
    _swap(tokenIn, amounts, path, to);
  }

  function swapExactETHForTokens(
    address tokenOut,
    uint256 amountOutMin,
    address[] calldata path,
    uint8[] calldata dexIds,
    address to,
    uint256 deadline
  ) external payable virtual override ensure(deadline) returns (uint256[] memory amounts) {
    amounts = _validateAmountOut(WETH, tokenOut, msg.value, amountOutMin, path, dexIds);

    transferETHTo(amounts[0], path[0]);
    _swap(WETH, amounts, path, to);
  }

  function swapTokensForExactETH(
    address tokenIn,
    uint256 amountOut,
    uint256 amountInMax,
    address[] calldata path,
    uint8[] calldata dexIds,
    address to,
    uint256 deadline
  ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {
    amounts = _validateAmountIn(tokenIn, WETH, amountOut, amountInMax, path, dexIds);

    TransferHelper.safeTransferFrom(tokenIn, msg.sender, path[0], amounts[0]);
    _swap(tokenIn, amounts, path, address(this));
    transferAll(ETH_ADDRESS, to, amounts[amounts.length - 1]);
  }

  function swapExactTokensForETH(
    address tokenIn,
    uint256 amountIn,
    uint256 amountOutMin,
    address[] calldata path,
    uint8[] calldata dexIds,
    address to,
    uint256 deadline
  ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {
    amounts = _validateAmountOut(tokenIn, WETH, amountIn, amountOutMin, path, dexIds);

    TransferHelper.safeTransferFrom(tokenIn, msg.sender, path[0], amounts[0]);
    _swap(tokenIn, amounts, path, address(this));
    transferAll(ETH_ADDRESS, to, amounts[amounts.length - 1]);
  }

  function swapETHForExactTokens(
    address tokenOut,
    uint256 amountOut,
    address[] calldata path,
    uint8[] calldata dexIds,
    address to,
    uint256 deadline
  ) external payable virtual override ensure(deadline) returns (uint256[] memory amounts) {
    amounts = _validateAmountIn(WETH, tokenOut, amountOut, msg.value, path, dexIds);

    transferETHTo(amounts[0], path[0]);
    _swap(WETH, amounts, path, to);
    // refund dust eth, if any
    if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);
  }

  // **** SWAP (supporting fee-on-transfer tokens) ****
  // requires the initial amount to have already been sent to the first pair
  function _swapSupportingFeeOnTransferTokens(
    address tokenIn,
    address[] memory path,
    uint8[] memory dexIds,
    address _to
  ) internal virtual {
    for (uint256 i; i < path.length; i++) {
      uint256 amountOutput;
      address currentOutput;
      {
        (address output, uint256 reserveInput, uint256 reserveOutput, uint32 tokenWeightInput, , uint32 swapFee) = IFireBirdFormula(formula).getFactoryReserveAndWeights(
          factory,
          path[i],
          tokenIn,
          dexIds[i]
        );
        uint256 amountInput = IERC20(tokenIn).balanceOf(path[i]).sub(reserveInput);
        amountOutput = IFireBirdFormula(formula).getAmountOut(amountInput, reserveInput, reserveOutput, tokenWeightInput, 100 - tokenWeightInput, swapFee);
        currentOutput = output;
      }

      IFireBirdPair pair = IFireBirdPair(path[i]);
      (uint256 amount0Out, uint256 amount1Out) = tokenIn == pair.token0() ? (uint256(0), amountOutput) : (amountOutput, uint256(0));
      if (swapFeeReward != address(0)) {
        ISwapFeeReward(swapFeeReward).swap(msg.sender, tokenIn, currentOutput, amountOutput, path[i]);
      }
      address to = i < path.length - 1 ? path[i + 1] : _to;
      pair.swap(amount0Out, amount1Out, to, new bytes(0));
      emit Exchange(path[i], amountOutput, currentOutput);
      tokenIn = currentOutput;
    }
  }

  function swapExactTokensForTokensSupportingFeeOnTransferTokens(
    address tokenIn,
    address tokenOut,
    uint256 amountIn,
    uint256 amountOutMin,
    address[] calldata path,
    uint8[] calldata dexIds,
    address to,
    uint256 deadline
  ) external virtual override ensure(deadline) {
    TransferHelper.safeTransferFrom(tokenIn, msg.sender, path[0], amountIn);
    uint256 balanceBefore = IERC20(tokenOut).balanceOf(to);
    _swapSupportingFeeOnTransferTokens(tokenIn, path, dexIds, to);
    require(IERC20(tokenOut).balanceOf(to).sub(balanceBefore) >= amountOutMin, "Router: INSUFFICIENT_OUTPUT_AMOUNT");
  }

  function swapExactETHForTokensSupportingFeeOnTransferTokens(
    address tokenOut,
    uint256 amountOutMin,
    address[] calldata path,
    uint8[] calldata dexIds,
    address to,
    uint256 deadline
  ) external payable virtual override ensure(deadline) {
    //            require(path[0] == WETH, 'Router: INVALID_PATH');
    uint256 amountIn = msg.value;
    transferETHTo(amountIn, path[0]);
    uint256 balanceBefore = IERC20(tokenOut).balanceOf(to);
    _swapSupportingFeeOnTransferTokens(WETH, path, dexIds, to);
    require(IERC20(tokenOut).balanceOf(to).sub(balanceBefore) >= amountOutMin, "Router: INSUFFICIENT_OUTPUT_AMOUNT");
  }

  function swapExactTokensForETHSupportingFeeOnTransferTokens(
    address tokenIn,
    uint256 amountIn,
    uint256 amountOutMin,
    address[] calldata path,
    uint8[] calldata dexIds,
    address to,
    uint256 deadline
  ) external virtual override ensure(deadline) {
    TransferHelper.safeTransferFrom(tokenIn, msg.sender, path[0], amountIn);
    _swapSupportingFeeOnTransferTokens(tokenIn, path, dexIds, address(this));
    uint256 amountOut = IERC20(WETH).balanceOf(address(this));
    require(amountOut >= amountOutMin, "Router: INSUFFICIENT_OUTPUT_AMOUNT");
    transferAll(ETH_ADDRESS, to, amountOut);
  }

  function swap(
    IAggregationExecutor caller,
    SwapDescription calldata desc,
    bytes calldata data
  ) external payable returns (uint256 returnAmount) {
    require(desc.minReturnAmount > 0, "Min return should not be 0");
    require(data.length > 0, "data should be not zero");

    uint256 flags = desc.flags;
    uint256 amount = desc.amount;
    IERC20 srcToken = desc.srcToken;
    IERC20 dstToken = desc.dstToken;

    if (flags & _REQUIRES_EXTRA_ETH != 0) {
      require(msg.value > (isETH(srcToken) ? amount : 0), "Invalid msg.value");
    } else {
      require(msg.value == (isETH(srcToken) ? amount : 0), "Invalid msg.value");
    }

    if (flags & _SHOULD_CLAIM != 0) {
      require(!isETH(srcToken), "Claim token is ETH");
      _permit(srcToken, amount, desc.permit);
      TransferHelper.safeTransferFrom(address(srcToken), msg.sender, desc.srcReceiver, amount);
    }

    address dstReceiver = (desc.dstReceiver == address(0)) ? msg.sender : desc.dstReceiver;
    uint256 initialSrcBalance = (flags & _PARTIAL_FILL != 0) ? getBalance(srcToken, msg.sender) : 0;
    uint256 initialDstBalance = getBalance(dstToken, dstReceiver);

    {
      // solhint-disable-next-line avoid-low-level-calls
      (bool success, bytes memory result) = address(caller).call{value: msg.value}(abi.encodeWithSelector(caller.callBytes.selector, data, msg.sender));
      if (!success) {
        revert(RevertReasonParser.parse(result, "callBytes failed: "));
      }
    }

    uint256 spentAmount = amount;
    returnAmount = getBalance(dstToken, dstReceiver).sub(initialDstBalance);

    if (flags & _PARTIAL_FILL != 0) {
      spentAmount = initialSrcBalance.add(amount).sub(getBalance(srcToken, msg.sender));
      require(returnAmount.mul(amount) >= desc.minReturnAmount.mul(spentAmount), "Return amount is not enough");
    } else {
      require(returnAmount >= desc.minReturnAmount, "Return amount is not enough");
    }

    emit Swapped(msg.sender, srcToken, dstToken, dstReceiver, spentAmount, returnAmount);
    emit Exchange(address(caller), returnAmount, isETH(dstToken) ? WETH : address(dstToken));
  }

  function getBalance(IERC20 token, address account) internal view returns (uint256) {
    if (isETH(token)) {
      return account.balance;
    } else {
      return token.balanceOf(account);
    }
  }

  function _validateAmountOut(
    address tokenIn,
    address tokenOut,
    uint256 amountIn,
    uint256 amountOutMin,
    address[] memory path,
    uint8[] memory dexIds
  ) internal view returns (uint256[] memory amounts) {
    amounts = IFireBirdFormula(formula).getFactoryAmountsOut(factory, tokenIn, tokenOut, amountIn, path, dexIds);
    require(amounts[amounts.length - 1] >= amountOutMin, "Router: INSUFFICIENT_OUTPUT_AMOUNT");
  }

  function _validateAmountIn(
    address tokenIn,
    address tokenOut,
    uint256 amountOut,
    uint256 amountInMax,
    address[] calldata path,
    uint8[] calldata dexIds
  ) internal view returns (uint256[] memory amounts) {
    amounts = IFireBirdFormula(formula).getFactoryAmountsIn(factory, tokenIn, tokenOut, amountOut, path, dexIds);
    require(amounts[0] <= amountInMax, "Router: EXCESSIVE_INPUT_AMOUNT");
  }

  function transferETHTo(uint256 amount, address to) internal {
    IWETH(WETH).deposit{value: amount}();
    assert(IWETH(WETH).transfer(to, amount));
  }

  function transferAll(
    address token,
    address to,
    uint256 amount
  ) internal returns (bool) {
    if (amount == 0) {
      return true;
    }

    if (isETH(IERC20(token))) {
      IWETH(WETH).withdraw(amount);
      TransferHelper.safeTransferETH(to, amount);
    } else {
      TransferHelper.safeTransfer(token, to, amount);
    }
    return true;
  }

  function isETH(IERC20 token) internal pure returns (bool) {
    return (address(token) == ETH_ADDRESS);
  }

  // **** REMOVE LIQUIDITY ****
  function _removeLiquidity(
    address pair,
    address tokenA,
    address tokenB,
    uint256 liquidity,
    uint256 amountAMin,
    uint256 amountBMin,
    address to
  ) internal returns (uint256 amountA, uint256 amountB) {
    require(IFireBirdFactory(factory).isPair(pair), "Router: Invalid pair");
    IFireBirdPair(pair).transferFrom(msg.sender, pair, liquidity);
    // send liquidity to pair
    (uint256 amount0, uint256 amount1) = IFireBirdPair(pair).burn(to);
    (address token0, ) = IFireBirdFormula(formula).sortTokens(tokenA, tokenB);
    (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
    require(amountA >= amountAMin, "Router: INSUFFICIENT_A_AMOUNT");
    require(amountB >= amountBMin, "Router: INSUFFICIENT_B_AMOUNT");
  }

  function removeLiquidity(
    address pair,
    address tokenA,
    address tokenB,
    uint256 liquidity,
    uint256 amountAMin,
    uint256 amountBMin,
    address to,
    uint256 deadline
  ) public virtual override ensure(deadline) returns (uint256 amountA, uint256 amountB) {
    (amountA, amountB) = _removeLiquidity(pair, tokenA, tokenB, liquidity, amountAMin, amountBMin, to);
  }

  function removeLiquidityETH(
    address pair,
    address token,
    uint256 liquidity,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline
  ) public virtual override ensure(deadline) returns (uint256 amountToken, uint256 amountETH) {
    (amountToken, amountETH) = _removeLiquidity(pair, token, WETH, liquidity, amountTokenMin, amountETHMin, address(this));
    TransferHelper.safeTransfer(token, to, amountToken);
    transferAll(ETH_ADDRESS, to, amountETH);
  }

  function removeLiquidityWithPermit(
    address pair,
    address tokenA,
    address tokenB,
    uint256 liquidity,
    uint256 amountAMin,
    uint256 amountBMin,
    address to,
    uint256 deadline,
    bool approveMax,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external virtual override ensure(deadline) returns (uint256 amountA, uint256 amountB) {
    {
      uint256 value = approveMax ? uint256(-1) : liquidity;
      IFireBirdPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
    }
    (amountA, amountB) = _removeLiquidity(pair, tokenA, tokenB, liquidity, amountAMin, amountBMin, to);
  }

  function removeLiquidityETHWithPermit(
    address pair,
    address token,
    uint256 liquidity,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline,
    bool approveMax,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external virtual override returns (uint256 amountToken, uint256 amountETH) {
    uint256 value = approveMax ? uint256(-1) : liquidity;
    IFireBirdPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
    (amountToken, amountETH) = removeLiquidityETH(pair, token, liquidity, amountTokenMin, amountETHMin, to, deadline);
  }

  // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
  function removeLiquidityETHSupportingFeeOnTransferTokens(
    address pair,
    address token,
    uint256 liquidity,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline
  ) public virtual override ensure(deadline) returns (uint256 amountETH) {
    (, amountETH) = removeLiquidity(pair, token, WETH, liquidity, amountTokenMin, amountETHMin, address(this), deadline);
    TransferHelper.safeTransfer(token, to, IERC20(token).balanceOf(address(this)));
    transferAll(ETH_ADDRESS, to, amountETH);
  }

  function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
    address pair,
    address token,
    uint256 liquidity,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline,
    bool approveMax,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external virtual override returns (uint256 amountETH) {
    uint256 value = approveMax ? uint256(-1) : liquidity;
    IFireBirdPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
    amountETH = removeLiquidityETHSupportingFeeOnTransferTokens(pair, token, liquidity, amountTokenMin, amountETHMin, to, deadline);
  }

  function rescueFunds(address token, uint256 amount) external onlyOwner {
    if (isETH(IERC20(token))) {
      TransferHelper.safeTransferETH(msg.sender, amount);
    } else {
      TransferHelper.safeTransfer(token, msg.sender, amount);
    }
  }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_formula","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"Error","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"},{"indexed":false,"internalType":"address","name":"output","type":"address"}],"name":"Exchange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"contract IERC20","name":"srcToken","type":"address"},{"indexed":false,"internalType":"contract IERC20","name":"dstToken","type":"address"},{"indexed":false,"internalType":"address","name":"dstReceiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"spentAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"returnAmount","type":"uint256"}],"name":"Swapped","type":"event"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint32","name":"tokenWeightA","type":"uint32"},{"internalType":"uint32","name":"swapFee","type":"uint32"},{"internalType":"address","name":"to","type":"address"}],"name":"createPair","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint32","name":"tokenWeight","type":"uint32"},{"internalType":"uint32","name":"swapFee","type":"uint32"},{"internalType":"address","name":"to","type":"address"}],"name":"createPairETH","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"formula","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_swapFeeReward","type":"address"}],"name":"setSwapFeeReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IAggregationExecutor","name":"caller","type":"address"},{"components":[{"internalType":"contract IERC20","name":"srcToken","type":"address"},{"internalType":"contract IERC20","name":"dstToken","type":"address"},{"internalType":"address","name":"srcReceiver","type":"address"},{"internalType":"address","name":"dstReceiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"uint256","name":"flags","type":"uint256"},{"internalType":"bytes","name":"permit","type":"bytes"}],"internalType":"struct FireBirdRouter.SwapDescription","name":"desc","type":"tuple"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swap","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint8[]","name":"dexIds","type":"uint8[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint8[]","name":"dexIds","type":"uint8[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint8[]","name":"dexIds","type":"uint8[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint8[]","name":"dexIds","type":"uint8[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint8[]","name":"dexIds","type":"uint8[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint8[]","name":"dexIds","type":"uint8[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint8[]","name":"dexIds","type":"uint8[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapFeeReward","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint8[]","name":"dexIds","type":"uint8[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint8[]","name":"dexIds","type":"uint8[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e06040523480156200001157600080fd5b5060405162006091380380620060918339810160408190526200003491620000d3565b600062000040620000b2565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160601b0319606093841b811660805291831b821660a05290911b1660c0526200011c565b3390565b80516001600160a01b0381168114620000ce57600080fd5b919050565b600080600060608486031215620000e8578283fd5b620000f384620000b6565b92506200010360208501620000b6565b91506200011360408501620000b6565b90509250925092565b60805160601c60a05160601c60c05160601c615ea4620001ed600039806101e352806107725280610a395280610b6d5280610e1052806115c052806116f252806117bb528061191d52806119825280611a635280611ed5528061201f52806120615280612aad5280612b4552806134dd52806135965250806108c4528061254e52806126a25280612e6e528061301e5280613ffd528061416e528061427a5280614391525080610b305280611aca5280611af1528061258a5280612c53528061304b528061402a5250615ea46000f3fe6080604052600436106101c65760003560e01c8063991bffc7116100f7578063d0f2c82a11610095578063f0c62e2b11610064578063f0c62e2b146104fb578063f2fde38b1461050e578063fbbeedf11461052e578063fbf451351461054e5761020c565b8063d0f2c82a1461047b578063dc9f70291461049b578063e1f4a784146104bb578063ebb5d2e9146104db5761020c565b8063ad5c4648116100d1578063ad5c464814610411578063af7e6aec14610426578063b56b681d14610446578063c45a0155146104665761020c565b8063991bffc7146103c9578063a3ddb30b146103dc578063a4aabb08146103f15761020c565b8063715018a6116101645780637a286fa21161013e5780637a286fa2146103615780637c0252001461038157806389df37af146103945780638da5cb5b146103b45761020c565b8063715018a614610319578063752ebb7c1461032e57806378e3214f146103415761020c565b80634b75f54f116101a05780634b75f54f146102895780634c17fd7c146102ab578063674f19f8146102d95780636cb49428146103065761020c565b80630e2f024c14610211578063242e3b9f146102475780633990ba54146102675761020c565b3661020c573373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461020a57fe5b005b600080fd5b34801561021d57600080fd5b5061023161022c366004614c39565b61056e565b60405161023e919061537b565b60405180910390f35b34801561025357600080fd5b5061020a610262366004614e36565b610651565b61027a610275366004614bc8565b610860565b60405161023e93929190615d0e565b34801561029557600080fd5b5061029e6108c2565b60405161023e9190615384565b3480156102b757600080fd5b506102cb6102c63660046148a1565b6108e6565b60405161023e929190615cc5565b3480156102e557600080fd5b506102f96102f4366004614e36565b6109f6565b60405161023e9190615720565b610231610314366004614f58565b610b2b565b34801561032557600080fd5b5061020a610c1d565b61020a61033c366004614d90565b610cff565b34801561034d57600080fd5b5061020a61035c366004614d65565b610f74565b34801561036d57600080fd5b506102f961037c3660046149ea565b611013565b61023161038f36600461506b565b6110c3565b3480156103a057600080fd5b506102f96103af366004614aad565b611607565b3480156103c057600080fd5b5061029e611694565b6102f96103d7366004614d90565b6116b0565b3480156103e857600080fd5b5061029e611816565b3480156103fd57600080fd5b506102cb61040c366004614c39565b611832565b34801561041d57600080fd5b5061029e61191b565b34801561043257600080fd5b506102f9610441366004614e36565b61193f565b34801561045257600080fd5b506102cb610461366004614bc8565b611a1e565b34801561047257600080fd5b5061029e611ac8565b34801561048757600080fd5b50610231610496366004614ce2565b611aec565b3480156104a757600080fd5b5061020a6104b63660046149ea565b611c58565b3480156104c757600080fd5b506102cb6104d636600461481d565b611e32565b3480156104e757600080fd5b506102316104f6366004614bc8565b611e91565b6102f9610509366004614d90565b611fdd565b34801561051a57600080fd5b5061020a6105293660046147ac565b6120f8565b34801561053a57600080fd5b5061020a6105493660046147ac565b612245565b34801561055a57600080fd5b5061027a61056936600461495c565b6122ff565b6000808561057c578a61059e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8e169063d505accf906105ff903390309086908d908c908c908c906004016153cc565b600060405180830381600087803b15801561061957600080fd5b505af115801561062d573d6000803e3d6000fd5b505050506106408d8d8d8d8d8d8d611e91565b9d9c50505050505050505050505050565b8042811015610695576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615ad2565b60405180910390fd5b6106c28a33898960008181106106a757fe5b90506020020160208101906106bc91906147ac565b8c612409565b6107328a88888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808c0282810182019093528b82529093508b92508a918291850190849080828437600092019190915250309250612535915050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a08231906107a7903090600401615384565b60206040518083038186803b1580156107bf57600080fd5b505afa1580156107d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107f79190615111565b905088811015610833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615b77565b61085273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8583612a53565b505050505050505050505050565b600080600083428110156108a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615ad2565b6108ae8b8b8b8b8b8b612b39565b919d909c50909a5098505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000808642811015610924576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615ad2565b600087610931578c610953565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b90508f73ffffffffffffffffffffffffffffffffffffffff1663d505accf3330848d8c8c8c6040518863ffffffff1660e01b815260040161099a97969594939291906153cc565b600060405180830381600087803b1580156109b457600080fd5b505af11580156109c8573d6000803e3d6000fd5b50505050506109dc8f8f8f8f8f8f8f612c4e565b8093508194505050509c509c9a5050505050505050505050565b60608142811015610a33576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615ad2565b610a638b7f00000000000000000000000000000000000000000000000000000000000000008c8c8c8c8c8c612fde565b9150610aa68b338a8a6000818110610a7757fe5b9050602002016020810190610a8c91906147ac565b85600081518110610a9957fe5b6020026020010151612409565b610ae68b838a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525030925061314f915050565b610b1c73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8584600186510381518110610b0f57fe5b6020026020010151612a53565b50509998505050505050505050565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166314572adb887f000000000000000000000000000000000000000000000000000000000000000088886040518563ffffffff1660e01b8152600401610bad949392919061568c565b602060405180830381600087803b158015610bc757600080fd5b505af1158015610bdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bff91906147c8565b9050610c1081888860008088612b39565b9998505050505050505050565b610c256134d7565b73ffffffffffffffffffffffffffffffffffffffff16610c43611694565b73ffffffffffffffffffffffffffffffffffffffff1614610c90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615a9d565b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b8042811015610d3a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615ad2565b34610d64818989600081610d4a57fe5b9050602002016020810190610d5f91906147ac565b6134db565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190610db9908890600401615384565b60206040518083038186803b158015610dd157600080fd5b505afa158015610de5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e099190615111565b9050610e9b7f00000000000000000000000000000000000000000000000000000000000000008a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808e0282810182019093528d82529093508d92508c9182918501908490808284376000920191909152508b9250612535915050565b89610f2f828d73ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b8152600401610ed99190615384565b60206040518083038186803b158015610ef157600080fd5b505afa158015610f05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f299190615111565b90613628565b1015610f67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615b77565b5050505050505050505050565b610f7c6134d7565b73ffffffffffffffffffffffffffffffffffffffff16610f9a611694565b73ffffffffffffffffffffffffffffffffffffffff1614610fe7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615a9d565b610ff08261366b565b1561100457610fff338261369e565b61100f565b61100f823383613757565b5050565b60608142811015611050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615ad2565b6110608c8c8c8c8c8c8c8c612fde565b91506110748c338a8a6000818110610a7757fe5b6110b48c838a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508a925061314f915050565b509a9950505050505050505050565b6000808460a0013511611102576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615a66565b81611139576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615b09565b60c08401356080850135600061115260208801886147ac565b905060006111666040890160208a016147ac565b905060028416156111c45761117a8261366b565b611185576000611187565b825b34116111bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c906159c1565b611212565b6111cd8261366b565b6111d85760006111da565b825b3414611212576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c906159c1565b600484161561128d576112248261366b565b1561125b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615851565b611272828461126d60e08c018c615d58565b613879565b61128d823361128760608c0160408d016147ac565b86612409565b6000806112a060808b0160608c016147ac565b73ffffffffffffffffffffffffffffffffffffffff16146112d0576112cb60808a0160608b016147ac565b6112d2565b335b90506000600186166112e55760006112ef565b6112ef8433613a86565b905060006112fd8484613a86565b90506000808d73ffffffffffffffffffffffffffffffffffffffff1634635697e45360e01b8e8e3360405160240161133793929190615764565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516113c0919061520f565b60006040518083038185875af1925050503d80600081146113fd576040519150601f19603f3d011682016040523d82523d6000602084013e611402565b606091505b50915091508161147e5761144b816040518060400160405280601281526020017f63616c6c4279746573206661696c65643a200000000000000000000000000000815250613b5d565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c91906157d0565b5086905061149082610f298787613a86565b98506001881615611509576114b26114a88733613a86565b610f29858a613f2f565b90506114c260a08d013582613f6c565b6114cc8a89613f6c565b1015611504576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615a2f565b611547565b8b60a00135891015611547576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615a2f565b7fd6d4f5681c246c9f42c203e287975af1601f8df8035a9251f79aab5c8f09e2f833878787858e60405161158096959493929190615488565b60405180910390a17fddac40937f35385a34f721af292e5a83fc5b840f722bff57c2fc71adba708c488d8a6115b48861366b565b6115be57876115e0565b7f00000000000000000000000000000000000000000000000000000000000000005b6040516115ef939291906156f0565b60405180910390a15050505050505050949350505050565b60608142811015611644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615ad2565b6116528a8a8a8a8a8a613fbd565b915061167b8a338860008151811061166657fe5b602002602001015185600081518110610a9957fe5b6116878a83888761314f565b5098975050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b606081428110156116ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615ad2565b61178f7f00000000000000000000000000000000000000000000000000000000000000008b348c8c8c80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508b8b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613fbd92505050565b91506117b6826000815181106117a157fe5b602002602001015189896000818110610d4a57fe5b6116877f0000000000000000000000000000000000000000000000000000000000000000838a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508a925061314f915050565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b600080600086611842578b611864565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8f169063d505accf906118c5903390309086908e908d908d908d906004016153cc565b600060405180830381600087803b1580156118df57600080fd5b505af11580156118f3573d6000803e3d6000fd5b505050506119068e8e8e8e8e8e8e611a1e565b909f909e509c50505050505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6060814281101561197c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615ad2565b610a638b7f00000000000000000000000000000000000000000000000000000000000000008c8c8c8c80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508b8b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613fbd92505050565b6000808242811015611a5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615ad2565b611a8b8a8a7f00000000000000000000000000000000000000000000000000000000000000008b8b8b30612c4e565b9093509150611a9b898685613757565b611aba73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8684612a53565b505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166314572adb8a8a88886040518563ffffffff1660e01b8152600401611b4e949392919061568c565b602060405180830381600087803b158015611b6857600080fd5b505af1158015611b7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba091906147c8565b9050611bb2818a8a8a8a60008061412b565b50506040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690636a62784290611c06908690600401615384565b602060405180830381600087803b158015611c2057600080fd5b505af1158015611c34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c109190615111565b8042811015611c93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615ad2565b611ca58b33898960008181106106a757fe5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190611cfa908790600401615384565b60206040518083038186803b158015611d1257600080fd5b505afa158015611d26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4a9190615111565b9050611dbc8c89898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808d0282810182019093528c82529093508c92508b9182918501908490808284376000920191909152508a9250612535915050565b88611dfa828d73ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401610ed99190615384565b1015610852576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615b77565b6000808242811015611e70576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615ad2565b611e7f8b8b8b8b8b8b8b612c4e565b909c909b509950505050505050505050565b60008142811015611ece576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615ad2565b611efe89897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a611e32565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152909350611fb191508990869073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190611f5c903090600401615384565b60206040518083038186803b158015611f7457600080fd5b505afa158015611f88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fac9190615111565b613757565b611fd073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8584612a53565b5050979650505050505050565b6060814281101561201a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615ad2565b61204a7f00000000000000000000000000000000000000000000000000000000000000008b8b348c8c8c8c612fde565b915061205c826000815181106117a157fe5b6120bc7f0000000000000000000000000000000000000000000000000000000000000000838a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508a925061314f915050565b816000815181106120c957fe5b60200260200101513411156116875761168733836000815181106120e957fe5b6020026020010151340361369e565b6121006134d7565b73ffffffffffffffffffffffffffffffffffffffff1661211e611694565b73ffffffffffffffffffffffffffffffffffffffff161461216b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615a9d565b73ffffffffffffffffffffffffffffffffffffffff81166121b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615888565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b61224d6134d7565b73ffffffffffffffffffffffffffffffffffffffff1661226b611694565b73ffffffffffffffffffffffffffffffffffffffff16146122b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615a9d565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000806000834281101561233f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615ad2565b61234e8d8d8d8d8d8d8d61412b565b6040517f6a627842000000000000000000000000000000000000000000000000000000008152919550935073ffffffffffffffffffffffffffffffffffffffff8e1690636a627842906123a5908990600401615384565b602060405180830381600087803b1580156123bf57600080fd5b505af11580156123d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123f79190615111565b91505099509950999650505050505050565b6000808573ffffffffffffffffffffffffffffffffffffffff166323b872dd86868660405160240161243d93929190615457565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161248b919061520f565b6000604051808303816000865af19150503d80600081146124c8576040519150601f19603f3d011682016040523d82523d6000602084013e6124cd565b606091505b50915091508180156124f75750805115806124f75750808060200190518101906124f7919061504f565b61252d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615c31565b505050505050565b60005b8351811015612a4c5760008060008060008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663eb22d54f7f00000000000000000000000000000000000000000000000000000000000000008d8b815181106125b557fe5b60200260200101518f8e8d815181106125ca57fe5b60200260200101516040518563ffffffff1660e01b81526004016125f19493929190615653565b60c06040518083038186803b15801561260957600080fd5b505afa15801561261d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126419190614ee5565b9550509450945094509450600061269e858e73ffffffffffffffffffffffffffffffffffffffff166370a082318f8d8151811061267a57fe5b60200260200101516040518263ffffffff1660e01b8152600401610ed99190615384565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663671a11b58287878788606403886040518763ffffffff1660e01b815260040161270696959493929190615d24565b60206040518083038186803b15801561271e57600080fd5b505afa158015612732573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127569190615111565b9750859650505050505050600086848151811061276f57fe5b602002602001015190506000808273ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156127c257600080fd5b505afa1580156127d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127fa91906147c8565b73ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff161461283457846000612838565b6000855b600154919350915073ffffffffffffffffffffffffffffffffffffffff161561292557600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663677fdac8338c87898e8c815181106128a957fe5b60200260200101516040518663ffffffff1660e01b81526004016128d195949392919061541a565b602060405180830381600087803b1580156128eb57600080fd5b505af11580156128ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612923919061504f565b505b600060018a510387106129385787612950565b89876001018151811061294757fe5b60200260200101515b604080516000815260208101918290527f022c0d9f0000000000000000000000000000000000000000000000000000000090915290915073ffffffffffffffffffffffffffffffffffffffff85169063022c0d9f906129b89086908690869060248101615cd3565b600060405180830381600087803b1580156129d257600080fd5b505af11580156129e6573d6000803e3d6000fd5b505050507fddac40937f35385a34f721af292e5a83fc5b840f722bff57c2fc71adba708c488a8881518110612a1757fe5b60200260200101518787604051612a30939291906156f0565b60405180910390a1509298505060019093019250612538915050565b5050505050565b600081612a6257506001612b32565b612a6b8461366b565b15612b23576040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d90612ae290859060040161537b565b600060405180830381600087803b158015612afc57600080fd5b505af1158015612b10573d6000803e3d6000fd5b50505050612b1e838361369e565b612b2e565b612b2e848484613757565b5060015b9392505050565b6000806000612b6d89897f00000000000000000000000000000000000000000000000000000000000000008a348b8b614166565b9093509150612b7e88338b86612409565b612b88828a6134db565b6040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a1690636a62784290612bda908790600401615384565b602060405180830381600087803b158015612bf457600080fd5b505af1158015612c08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c2c9190615111565b905081341115612c4257612c423383340361369e565b96509650969350505050565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e5e31b138a6040518263ffffffff1660e01b8152600401612caa9190615384565b60206040518083038186803b158015612cc257600080fd5b505afa158015612cd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cfa919061504f565b612d30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615c8e565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16906323b872dd90612d869033908d908b90600401615457565b602060405180830381600087803b158015612da057600080fd5b505af1158015612db4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dd8919061504f565b506000808a73ffffffffffffffffffffffffffffffffffffffff166389afcb44866040518263ffffffff1660e01b8152600401612e159190615384565b6040805180830381600087803b158015612e2e57600080fd5b505af1158015612e42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e669190615129565b9150915060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663544caa568c8c6040518363ffffffff1660e01b8152600401612ec79291906153a5565b604080518083038186803b158015612ede57600080fd5b505afa158015612ef2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f1691906147e4565b5090508073ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff1614612f53578183612f56565b82825b909550935087851015612f95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c906159f8565b86841015612fcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615953565b50505097509795505050505050565b6040517f30994f7100000000000000000000000000000000000000000000000000000000815260609073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906330994f7190613081907f0000000000000000000000000000000000000000000000000000000000000000908d908d908d908c908c908c908c906004016154ff565b60006040518083038186803b15801561309957600080fd5b505afa1580156130ad573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526130f39190810190614fbf565b9050858160008151811061310357fe5b60200260200101511115613143576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c9061591c565b98975050505050505050565b8360005b835181101561252d57600084828151811061316a57fe5b6020026020010151905060008173ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156131bc57600080fd5b505afa1580156131d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131f491906147c8565b9050600087846001018151811061320757fe5b6020026020010151905060008060008473ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161461325257836000866132d3565b6000848773ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561329b57600080fd5b505afa1580156132af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132d391906147c8565b600154929550909350915073ffffffffffffffffffffffffffffffffffffffff16156133c357600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663677fdac8338a84888f8d8151811061334757fe5b60200260200101516040518663ffffffff1660e01b815260040161336f95949392919061541a565b602060405180830381600087803b15801561338957600080fd5b505af115801561339d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133c1919061504f565b505b600060018b510388106133d657896133ee565b8a88600101815181106133e557fe5b60200260200101515b604080516000815260208101918290527f022c0d9f0000000000000000000000000000000000000000000000000000000090915290915073ffffffffffffffffffffffffffffffffffffffff88169063022c0d9f906134569087908790869060248101615cd3565b600060405180830381600087803b15801561347057600080fd5b505af1158015613484573d6000803e3d6000fd5b505050507fddac40937f35385a34f721af292e5a83fc5b840f722bff57c2fc71adba708c488786846040516134bb939291906156f0565b60405180910390a1509650506001909401935061315392505050565b3390565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b15801561354357600080fd5b505af1158015613557573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb92506135d09150849086906004016156ca565b602060405180830381600087803b1580156135ea57600080fd5b505af11580156135fe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613622919061504f565b61100f57fe5b80820382811115613665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c906157e3565b92915050565b73ffffffffffffffffffffffffffffffffffffffff811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b919050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040516136d5919061520f565b60006040518083038185875af1925050503d8060008114613712576040519150601f19603f3d011682016040523d82523d6000602084013e613717565b606091505b5050905080613752576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615bd4565b505050565b6000808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040516024016137899291906156ca565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516137d7919061520f565b6000604051808303816000865af19150503d8060008114613814576040519150601f19603f3d011682016040523d82523d6000602084013e613819565b606091505b5091509150818015613843575080511580613843575080806020019051810190613843919061504f565b612a4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c9061581a565b60e0811415613a80576000808573ffffffffffffffffffffffffffffffffffffffff1663d505accf60e01b85856040516020016138b8939291906151d3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526138f09161520f565b6000604051808303816000865af19150503d806000811461392d576040519150601f19603f3d011682016040523d82523d6000602084013e613932565b606091505b50915091508161252d57600061397d826040518060400160405280601481526020017f5065726d69742063616c6c206661696c65643a20000000000000000000000000815250613b5d565b9050858773ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b81526004016139bb9291906153a5565b60206040518083038186803b1580156139d357600080fd5b505afa1580156139e7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a0b9190615111565b1015613a4557806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c91906157d0565b7f08c379a0afcc32b1a39302f7cb8073359698411ab5fd6e3edb2c02c0b5fba8aa81604051613a7491906157d0565b60405180910390a15050505b50505050565b6000613a918361366b565b15613ab4575073ffffffffffffffffffffffffffffffffffffffff811631613665565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190613b06908590600401615384565b60206040518083038186803b158015613b1e57600080fd5b505afa158015613b32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b569190615111565b9050613665565b60606044835110158015613bc4575082600081518110613b7957fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f0800000000000000000000000000000000000000000000000000000000000000145b8015613c23575082600181518110613bd857fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167fc300000000000000000000000000000000000000000000000000000000000000145b8015613c82575082600281518110613c3757fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f7900000000000000000000000000000000000000000000000000000000000000145b8015613ce1575082600381518110613c9657fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167fa000000000000000000000000000000000000000000000000000000000000000145b15613d57576060604484019050805160440184511015613d2d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615b40565b8281604051602001613d4092919061532f565b604051602081830303815290604052915050613665565b82516024148015613dbb575082600081518110613d7057fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f4e00000000000000000000000000000000000000000000000000000000000000145b8015613e1a575082600181518110613dcf57fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f4800000000000000000000000000000000000000000000000000000000000000145b8015613e79575082600281518110613e2e57fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f7b00000000000000000000000000000000000000000000000000000000000000145b8015613ed8575082600381518110613e8d57fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f7100000000000000000000000000000000000000000000000000000000000000145b15613efd57602483015182613eec82614472565b604051602001613d4092919061522b565b81613f0784614498565b604051602001613f189291906152ad565b604051602081830303815290604052905092915050565b80820182811015613665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c9061598a565b6000811580613f8757505080820282828281613f8457fe5b04145b613665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c906158e5565b6040517ff2734c3800000000000000000000000000000000000000000000000000000000815260609073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063f2734c389061405c907f0000000000000000000000000000000000000000000000000000000000000000908b908b908b908a908a906004016155c0565b60006040518083038186803b15801561407457600080fd5b505afa158015614088573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526140ce9190810190614fbf565b905083816001835103815181106140e157fe5b60200260200101511015614121576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615b77565b9695505050505050565b60008061413d89898989898989614166565b909250905061414e88338b85612409565b61415a87338b84612409565b97509795505050505050565b6000806000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663327494618c8c8c6040518463ffffffff1660e01b81526004016141c9939291906154cf565b604080518083038186803b1580156141e057600080fd5b505afa1580156141f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142189190615129565b9150915081600014801561422a575080155b1561423a57879350869250611aba565b6040517fad615dec00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063ad615dec906142b3908c9087908790600401615d0e565b60206040518083038186803b1580156142cb57600080fd5b505afa1580156142df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143039190615111565b90508781116143515785811015614346576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90615953565b889450925082612fcf565b6040517fad615dec00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063ad615dec906143ca908c9087908990600401615d0e565b60206040518083038186803b1580156143e257600080fd5b505afa1580156143f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061441a9190615111565b90508981111561442657fe5b87811015614460576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c906159f8565b9c979b50969950505050505050505050565b606061366582604051602001614488919061537b565b6040516020818303038152906040525b80516060907f30313233343536373839616263646566000000000000000000000000000000009060009060029081020167ffffffffffffffff811180156144de57600080fd5b506040519080825280601f01601f191660200182016040528015614509576020820181803683370190505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061453a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061459757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060005b84518110156146cc578260048683815181106145e157fe5b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c60f81c6010811061461757fe5b1a60f81b82826002026002018151811061462d57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508285828151811061466957fe5b60209101015160f81c600f166010811061467f57fe5b1a60f81b82826002026003018151811061469557fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001016145c9565b509392505050565b803561369981615e29565b60008083601f8401126146f0578182fd5b50813567ffffffffffffffff811115614707578182fd5b602083019150836020808302850101111561472157600080fd5b9250929050565b600082601f830112614738578081fd5b8135602061474d61474883615ddf565b615dbb565b8281528181019085830183850287018401881015614769578586fd5b855b8581101561478e5761477c8261479b565b8452928401929084019060010161476b565b5090979650505050505050565b803560ff8116811461369957600080fd5b6000602082840312156147bd578081fd5b8135612b3281615e29565b6000602082840312156147d9578081fd5b8151612b3281615e29565b600080604083850312156147f6578081fd5b825161480181615e29565b602084015190925061481281615e29565b809150509250929050565b600080600080600080600080610100898b031215614839578384fd5b883561484481615e29565b9750602089013561485481615e29565b9650604089013561486481615e29565b9550606089013594506080890135935060a0890135925060c089013561488981615e29565b8092505060e089013590509295985092959890939650565b6000806000806000806000806000806000806101808d8f0312156148c3578586fd5b8c356148ce81615e29565b9b5060208d01356148de81615e29565b9a5060408d01356148ee81615e29565b995060608d0135985060808d0135975060a08d0135965060c08d013561491381615e29565b955060e08d013594506101008d013561492b81615e4e565b935061493a6101208e0161479b565b92506101408d013591506101608d013590509295989b509295989b509295989b565b60008060008060008060008060006101208a8c03121561497a578283fd5b893561498581615e29565b985060208a013561499581615e29565b975060408a01356149a581615e29565b965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a01356149d181615e29565b809250506101008a013590509295985092959850929598565b6000806000806000806000806000806101008b8d031215614a09578384fd5b8a35614a1481615e29565b995060208b0135614a2481615e29565b985060408b0135975060608b0135965060808b013567ffffffffffffffff80821115614a4e578586fd5b614a5a8e838f016146df565b909850965060a08d0135915080821115614a72578586fd5b50614a7f8d828e016146df565b90955093505060c08b0135614a9381615e29565b8092505060e08b013590509295989b9194979a5092959850565b600080600080600080600080610100898b031215614ac9578182fd5b614ad38935615e29565b883597506020890135614ae581615e29565b96506040890135955060608901359450608089013567ffffffffffffffff80821115614b0f578384fd5b818b0191508b601f830112614b22578384fd5b8135614b3061474882615ddf565b80828252602082019150602085018f60208086028801011115614b51578788fd5b8795505b83861015614b7e57614b678135615e29565b803583526001959095019460209283019201614b55565b509750505060a08b0135915080821115614b96578384fd5b50614ba38b828c01614728565b935050614bb260c08a016146d4565b915060e089013590509295985092959890939650565b600080600080600080600060e0888a031215614be2578081fd5b8735614bed81615e29565b96506020880135614bfd81615e29565b955060408801359450606088013593506080880135925060a0880135614c2281615e29565b8092505060c0880135905092959891949750929550565b60008060008060008060008060008060006101608c8e031215614c5a578485fd5b8b35614c6581615e29565b9a5060208c0135614c7581615e29565b995060408c0135985060608c0135975060808c0135965060a08c0135614c9a81615e29565b955060c08c0135945060e08c0135614cb181615e4e565b9350614cc06101008d0161479b565b92506101208c013591506101408c013590509295989b509295989b9093969950565b600080600080600080600060e0888a031215614cfc578081fd5b8735614d0781615e29565b96506020880135614d1781615e29565b955060408801359450606088013593506080880135614d3581615e5c565b925060a0880135614d4581615e5c565b915060c0880135614d5581615e29565b8091505092959891949750929550565b60008060408385031215614d77578182fd5b8235614d8281615e29565b946020939093013593505050565b60008060008060008060008060c0898b031215614dab578182fd5b8835614db681615e29565b975060208901359650604089013567ffffffffffffffff80821115614dd9578384fd5b614de58c838d016146df565b909850965060608b0135915080821115614dfd578384fd5b50614e0a8b828c016146df565b9095509350506080890135614e1e81615e29565b8092505060a089013590509295985092959890939650565b600080600080600080600080600060e08a8c031215614e53578283fd5b8935614e5e81615e29565b985060208a0135975060408a0135965060608a013567ffffffffffffffff80821115614e88578485fd5b614e948d838e016146df565b909850965060808c0135915080821115614eac578485fd5b50614eb98c828d016146df565b90955093505060a08a0135614ecd81615e29565b8092505060c08a013590509295985092959850929598565b60008060008060008060c08789031215614efd578384fd5b8651614f0881615e29565b8096505060208701519450604087015193506060870151614f2881615e5c565b6080880151909350614f3981615e5c565b60a0880151909250614f4a81615e5c565b809150509295509295509295565b600080600080600060a08688031215614f6f578283fd5b8535614f7a81615e29565b9450602086013593506040860135614f9181615e5c565b92506060860135614fa181615e5c565b91506080860135614fb181615e29565b809150509295509295909350565b60006020808385031215614fd1578182fd5b825167ffffffffffffffff811115614fe7578283fd5b8301601f81018513614ff7578283fd5b805161500561474882615ddf565b8181528381019083850185840285018601891015615021578687fd5b8694505b83851015615043578051835260019490940193918501918501615025565b50979650505050505050565b600060208284031215615060578081fd5b8151612b3281615e4e565b60008060008060608587031215615080578182fd5b843561508b81615e29565b9350602085013567ffffffffffffffff808211156150a7578384fd5b9086019061010082890312156150bb578384fd5b909350604086013590808211156150d0578384fd5b818701915087601f8301126150e3578384fd5b8135818111156150f1578485fd5b886020828501011115615102578485fd5b95989497505060200194505050565b600060208284031215615122578081fd5b5051919050565b6000806040838503121561513b578182fd5b505080516020909101519092909150565b6000815180845260208085019450808401835b8381101561517e57815160ff168752958201959082019060010161515f565b509495945050505050565b600081518084526151a1816020860160208601615dfd565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60007fffffffff000000000000000000000000000000000000000000000000000000008516825282846004840137910160040190815292915050565b60008251615221818460208701615dfd565b9190910192915050565b6000835161523d818460208801615dfd565b7f50616e69632800000000000000000000000000000000000000000000000000009083019081528351615277816006840160208801615dfd565b7f290000000000000000000000000000000000000000000000000000000000000060069290910191820152600701949350505050565b600083516152bf818460208801615dfd565b7f556e6b6e6f776e2800000000000000000000000000000000000000000000000090830190815283516152f9816008840160208801615dfd565b7f290000000000000000000000000000000000000000000000000000000000000060089290910191820152600901949350505050565b60008351615341818460208801615dfd565b7f4572726f722800000000000000000000000000000000000000000000000000009083019081528351615277816006840160208801615dfd565b90815260200190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff97881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b73ffffffffffffffffffffffffffffffffffffffff9586168152938516602085015291841660408401526060830152909116608082015260a00190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff96871681529486166020860152928516604085015293166060830152608082019290925260a081019190915260c00190565b73ffffffffffffffffffffffffffffffffffffffff93841681529183166020830152909116604082015260600190565b600060c0820173ffffffffffffffffffffffffffffffffffffffff808c1684526020818c1681860152818b16604086015289606086015260c060808601528288845260e086019050899350845b8981101561557357843561555f81615e29565b84168252938201939082019060010161554c565b5085810360a087015286815281019250869150835b868110156155ae5760ff61559b8461479b565b1684529281019291810191600101615588565b50919c9b505050505050505050505050565b600060c0820173ffffffffffffffffffffffffffffffffffffffff808a1684526020818a1681860152818916604086015287606086015260c0608086015282875180855260e0870191508289019450855b8181101561562f578551851683529483019491830191600101615611565b505085810360a0870152615643818861514c565b9c9b505050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff948516815292841660208401529216604082015260ff909116606082015260800190565b73ffffffffffffffffffffffffffffffffffffffff948516815292909316602083015263ffffffff9081166040830152909116606082015260800190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff93841681526020810192909252909116604082015260600190565b6020808252825182820181905260009190848201906040850190845b818110156157585783518352928401929184019160010161573c565b50909695505050505050565b60006040825283604083015283856060840137806060858401015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116830101905073ffffffffffffffffffffffffffffffffffffffff83166020830152949350505050565b600060208252612b326020830184615189565b60208082526015908201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604082015260600190565b6020808252601f908201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604082015260600190565b60208082526012908201527f436c61696d20746f6b656e206973204554480000000000000000000000000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b60208082526014908201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604082015260600190565b6020808252601e908201527f526f757465723a204558434553534956455f494e5055545f414d4f554e540000604082015260600190565b6020808252601d908201527f526f757465723a20494e53554646494349454e545f425f414d4f554e54000000604082015260600190565b60208082526014908201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604082015260600190565b60208082526011908201527f496e76616c6964206d73672e76616c7565000000000000000000000000000000604082015260600190565b6020808252601d908201527f526f757465723a20494e53554646494349454e545f415f414d4f554e54000000604082015260600190565b6020808252601b908201527f52657475726e20616d6f756e74206973206e6f7420656e6f7567680000000000604082015260600190565b6020808252601a908201527f4d696e2072657475726e2073686f756c64206e6f742062652030000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600f908201527f526f757465723a20455850495245440000000000000000000000000000000000604082015260600190565b60208082526017908201527f646174612073686f756c64206265206e6f74207a65726f000000000000000000604082015260600190565b60208082526015908201527f496e76616c69642072657665727420726561736f6e0000000000000000000000604082015260600190565b60208082526022908201527f526f757465723a20494e53554646494349454e545f4f55545055545f414d4f5560408201527f4e54000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526023908201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960408201527f4c45440000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526024908201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f464160408201527f494c454400000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526014908201527f526f757465723a20496e76616c69642070616972000000000000000000000000604082015260600190565b918252602082015260400190565b600085825284602083015273ffffffffffffffffffffffffffffffffffffffff84166040830152608060608301526141216080830184615189565b9283526020830191909152604082015260600190565b9586526020860194909452604085019290925263ffffffff908116606085015290811660808401521660a082015260c00190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615d8c578283fd5b83018035915067ffffffffffffffff821115615da6578283fd5b60200191503681900382131561472157600080fd5b60405181810167ffffffffffffffff81118282101715615dd757fe5b604052919050565b600067ffffffffffffffff821115615df357fe5b5060209081020190565b60005b83811015615e18578181015183820152602001615e00565b83811115613a805750506000910152565b73ffffffffffffffffffffffffffffffffffffffff81168114615e4b57600080fd5b50565b8015158114615e4b57600080fd5b63ffffffff81168114615e4b57600080fdfea2646970667358221220195ff6f860b2fc7d0b617a8af6518f4d5d5250ec9425b517617dfc4cddb2bdbf64736f6c634300070600330000000000000000000000005de74546d3b86c8df7feec30253865e1149818c80000000000000000000000007973b6961c8c5ca8026b9fb82332626e715ff8c70000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000005de74546d3b86c8df7feec30253865e1149818c80000000000000000000000007973b6961c8c5ca8026b9fb82332626e715ff8c70000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23

-----Decoded View---------------
Arg [0] : _factory (address): 0x5de74546d3b86c8df7feec30253865e1149818c8
Arg [1] : _formula (address): 0x7973b6961c8c5ca8026b9fb82332626e715ff8c7
Arg [2] : _WETH (address): 0x5c7f8a570d578ed84e63fdfa7b1ee72deae1ae23

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000005de74546d3b86c8df7feec30253865e1149818c8
Arg [1] : 0000000000000000000000007973b6961c8c5ca8026b9fb82332626e715ff8c7
Arg [2] : 0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23


Deployed ByteCode Sourcemap

22306:22107:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23636:10;:18;23650:4;23636:18;;23629:26;;;;22306:22107;;;;;43513:638;;;;;;;;;;-1:-1:-1;43513:638:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35263:632;;;;;;;;;;-1:-1:-1;35263:632:0;;;;;:::i;:::-;;:::i;27658:510::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;22452:41::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;41617:643::-;;;;;;;;;;-1:-1:-1;41617:643:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;30675:576::-;;;;;;;;;;-1:-1:-1;30675:576:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;27279:373::-;;;;;;:::i;:::-;;:::i;21786:138::-;;;;;;;;;;;;;:::i;34597:660::-;;;;;;:::i;:::-;;:::i;44157:253::-;;;;;;;;;;-1:-1:-1;44157:253:0;;;;;:::i;:::-;;:::i;29684:531::-;;;;;;;;;;-1:-1:-1;29684:531:0;;;;;:::i;:::-;;:::i;35901:2174::-;;;;;;:::i;:::-;;:::i;29152:526::-;;;;;;;;;;-1:-1:-1;29152:526:0;;;;;:::i;:::-;;:::i;21175:81::-;;;;;;;;;;;;;:::i;30221:448::-;;;;;;:::i;:::-;;:::i;22541:37::-;;;;;;;;;;;;;:::i;42266:616::-;;;;;;;;;;-1:-1:-1;42266:616:0;;;;;:::i;:::-;;:::i;22498:38::-;;;;;;;;;;;;;:::i;31257:577::-;;;;;;;;;;-1:-1:-1;31257:577:0;;;;;:::i;:::-;;:::i;41094:517::-;;;;;;;;;;-1:-1:-1;41094:517:0;;;;;:::i;:::-;;:::i;22406:41::-;;;;;;;;;;;;;:::i;25521:448::-;;;;;;;;;;-1:-1:-1;25521:448:0;;;;;:::i;:::-;;:::i;33953:638::-;;;;;;;;;;-1:-1:-1;33953:638:0;;;;;:::i;:::-;;:::i;40688:400::-;;;;;;;;;;-1:-1:-1;40688:400:0;;;;;:::i;:::-;;:::i;42957:550::-;;;;;;;;;;-1:-1:-1;42957:550:0;;;;;:::i;:::-;;:::i;31840:574::-;;;;;;:::i;:::-;;:::i;22069:230::-;;;;;;;;;;-1:-1:-1;22069:230:0;;;;;:::i;:::-;;:::i;23727:110::-;;;;;;;;;;-1:-1:-1;23727:110:0;;;;;:::i;:::-;;:::i;25975:574::-;;;;;;;;;;-1:-1:-1;25975:574:0;;;;;:::i;:::-;;:::i;43513:638::-;43847:17;43873:13;43889:10;:36;;43916:9;43889:36;;;43910:2;43889:36;43932:79;;;;;43873:52;;-1:-1:-1;43932:26:0;;;;;;:79;;43959:10;;43979:4;;43873:52;;43993:8;;44003:1;;44006;;44009;;43932:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44030:115;44078:4;44084:5;44091:9;44102:14;44118:12;44132:2;44136:8;44030:47;:115::i;:::-;44018:127;43513:638;-1:-1:-1;;;;;;;;;;;;;43513:638:0:o;35263:632::-;35533:8;23369:15;23357:8;:27;;23349:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;35550:71:::1;35582:7;35591:10;35603:4;;35608:1;35603:7;;;;;;;;;;;;;;;;;;;;:::i;:::-;35612:8;35550:31;:71::i;:::-;35628:72;35663:7;35672:4;;35628:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;35628:72:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;35678:6:0;;-1:-1:-1;35678:6:0;;;;35628:72;::::1;::::0;35678:6;;35628:72;35678:6;35628:72;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;35694:4:0::1;::::0;-1:-1:-1;35628:34:0::1;::::0;-1:-1:-1;;35628:72:0:i:1;:::-;35727:37;::::0;;;;35707:17:::1;::::0;35727:22:::1;35734:4;35727:22;::::0;::::1;::::0;:37:::1;::::0;35758:4:::1;::::0;35727:37:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35707:57;;35792:12;35779:9;:25;;35771:72;;;;;;;;;;;;:::i;:::-;35850:39;22630:42;35875:2;35879:9;35850:11;:39::i;:::-;;23411:1;35263:632:::0;;;;;;;;;;:::o;27658:510::-;27952:19;27980:17;28006;27920:8;23369:15;23357:8;:27;;23349:55;;;;;;;;;;;;:::i;:::-;28079:83:::1;28096:4;28102:5;28109:18;28129:14;28145:12;28159:2;28079:16;:83::i;:::-;28041:121:::0;;;;-1:-1:-1;28041:121:0;;-1:-1:-1;27658:510:0;-1:-1:-1;;;;;;;;;27658:510:0:o;22452:41::-;;;:::o;41617:643::-;41952:15;41969;41933:8;23369:15;23357:8;:27;;23349:55;;;;;;;;;;;;:::i;:::-;42002:13:::1;42018:10;:36;;42045:9;42018:36;;;42039:2;42018:36;42002:52;;42077:4;42063:26;;;42090:10;42110:4;42117:5;42124:8;42134:1;42137;42140;42063:79;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;23411:1;42177:77;42194:4;42200:6;42208;42216:9;42227:10;42239;42251:2;42177:16;:77::i;:::-;42156:98;;;;;;;;41617:643:::0;;;;;;;;;;;;;;;;:::o;30675:576::-;30935:24;30916:8;23369:15;23357:8;:27;;23349:55;;;;;;;;;;;;:::i;:::-;30978:70:::1;30996:7;31005:4;31011:9;31022:11;31035:4;;31041:6;;30978:17;:70::i;:::-;30968:80;;31057:73;31089:7;31098:10;31110:4;;31115:1;31110:7;;;;;;;;;;;;;;;;;;;;:::i;:::-;31119;31127:1;31119:10;;;;;;;;;;;;;;31057:31;:73::i;:::-;31137:44;31143:7;31152;31161:4;;31137:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;31175:4:0::1;::::0;-1:-1:-1;31137:5:0::1;::::0;-1:-1:-1;;31137:44:0:i:1;:::-;31188:57;22630:42;31213:2;31217:7;31242:1;31225:7;:14;:18;31217:27;;;;;;;;;;;;;;31188:11;:57::i;:::-;;30675:576:::0;;;;;;;;;;;;:::o;27279:373::-;27457:17;27483:12;27515:7;27498:36;;;27535:5;27542:4;27548:11;27561:7;27498:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27483:86;;27594:52;27611:4;27617:5;27624:11;27637:1;27640;27643:2;27594:16;:52::i;:::-;27576:70;27279:373;-1:-1:-1;;;;;;;;;27279:373:0:o;21786:138::-;21388:12;:10;:12::i;:::-;21377:23;;:7;:5;:7::i;:::-;:23;;;21369:68;;;;;;;;;;;;:::i;:::-;21889:1:::1;21873:6:::0;;21852:40:::1;::::0;::::1;21873:6:::0;;::::1;::::0;21852:40:::1;::::0;21889:1;;21852:40:::1;21916:1;21899:19:::0;;;::::1;::::0;;21786:138::o;34597:660::-;34853:8;23369:15;23357:8;:27;;23349:55;;;;;;;;;;;;:::i;:::-;34958:9:::1;34974:32;34958:9:::0;34998:4;;34939:16:::1;34998:7:::0;::::1;;;;;;;;;;;;;;;;;:::i;:::-;34974:13;:32::i;:::-;35037:30;::::0;;;;35013:21:::1;::::0;35037:26:::1;::::0;::::1;::::0;::::1;::::0;:30:::1;::::0;35064:2;;35037:30:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35013:54;;35074:58;35109:4;35115;;35074:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;35074:58:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;35121:6:0;;-1:-1:-1;35121:6:0;;;;35074:58;::::1;::::0;35121:6;;35074:58;35121:6;35074:58;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;35129:2:0;;-1:-1:-1;35074:34:0::1;::::0;-1:-1:-1;;35074:58:0:i:1;:::-;35200:12;35147:49;35182:13;35154:8;35147:26;;;35174:2;35147:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:34:::0;::::1;:49::i;:::-;:65;;35139:112;;;;;;;;;;;;:::i;:::-;23411:1;;34597:660:::0;;;;;;;;;:::o;44157:253::-;21388:12;:10;:12::i;:::-;21377:23;;:7;:5;:7::i;:::-;:23;;;21369:68;;;;;;;;;;;;:::i;:::-;44239:20:::1;44252:5;44239;:20::i;:::-;44235:170;;;44270:50;44301:10;44313:6;44270:30;:50::i;:::-;44235:170;;;44343:54;44371:5;44378:10;44390:6;44343:27;:54::i;:::-;44157:253:::0;;:::o;29684:531::-;29970:24;29951:8;23369:15;23357:8;:27;;23349:55;;;;;;;;;;;;:::i;:::-;30013:74:::1;30031:7;30040:8;30050:9;30061:11;30074:4;;30080:6;;30013:17;:74::i;:::-;30003:84;;30096:73;30128:7;30137:10;30149:4;;30154:1;30149:7;;;;;;30096:73;30176:33;30182:7;30191;30200:4;;30176:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;30206:2:0;;-1:-1:-1;30176:5:0::1;::::0;-1:-1:-1;;30176:33:0:i:1;:::-;29684:531:::0;;;;;;;;;;;;;:::o;35901:2174::-;36042:20;36102:1;36079:4;:20;;;:24;36071:63;;;;;;;;;;;;:::i;:::-;36149:15;36141:51;;;;;;;;;;;;:::i;:::-;36217:10;;;;36251:11;;;;36201:13;36287;;;;36217:4;36287:13;:::i;:::-;36269:31;-1:-1:-1;36307:15:0;36325:13;;;;;;;;:::i;:::-;36307:31;-1:-1:-1;22777:4:0;36351:27;;:32;36347:223;;36415:15;36421:8;36415:5;:15::i;:::-;:28;;36442:1;36415:28;;;36433:6;36415:28;36402:9;:42;36394:72;;;;;;;;;;;;:::i;:::-;36347:223;;;36511:15;36517:8;36511:5;:15::i;:::-;:28;;36538:1;36511:28;;;36529:6;36511:28;36497:9;:43;36489:73;;;;;;;;;;;;:::i;:::-;22827:4;36582:21;;:26;36578:240;;36628:15;36634:8;36628:5;:15::i;:::-;36627:16;36619:47;;;;;;;;;;;;:::i;:::-;36675:38;36683:8;36693:6;36701:11;;;;:4;:11;:::i;:::-;36675:7;:38::i;:::-;36722:88;36762:8;36773:10;36785:16;;;;;;;;:::i;:::-;36803:6;36722:31;:88::i;:::-;36826:19;;36849:16;;;;;;;;:::i;:::-;:30;;;36848:64;;36896:16;;;;;;;;:::i;:::-;36848:64;;;36883:10;36848:64;36826:86;-1:-1:-1;36919:25:0;22721:4;36948:21;;36947:67;;37013:1;36947:67;;;36978:32;36989:8;36999:10;36978;:32::i;:::-;36919:95;;37021:25;37049:33;37060:8;37070:11;37049:10;:33::i;:::-;37021:61;;37159:12;37173:19;37204:6;37196:20;;37224:9;37258:25;;;37285:4;;37291:10;37235:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37196:107;;;;37235:67;37196:107;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37158:145;;;;37317:7;37312:97;;37344:54;37369:6;37344:54;;;;;;;;;;;;;;;;;:24;:54::i;:::-;37337:62;;;;;;;;;;;:::i;37312:97::-;-1:-1:-1;37446:6:0;;-1:-1:-1;37474:56:0;37512:17;37474:33;37485:8;37495:11;37474:10;:33::i;:56::-;37459:71;-1:-1:-1;22721:4:0;37543:21;;:26;37539:343;;37594:67;37628:32;37639:8;37649:10;37628;:32::i;:::-;37594:29;:17;37616:6;37594:21;:29::i;:67::-;37580:81;-1:-1:-1;37706:37:0;:20;;;;37580:81;37706:24;:37::i;:::-;37678:24;:12;37695:6;37678:16;:24::i;:::-;:65;;37670:105;;;;;;;;;;;;:::i;:::-;37539:343;;;37822:4;:20;;;37806:12;:36;;37798:76;;;;;;;;;;;;:::i;:::-;37895:79;37903:10;37915:8;37925;37935:11;37948;37961:12;37895:79;;;;;;;;;;;:::i;:::-;;;;;;;;37986:83;38003:6;38012:12;38026:15;38032:8;38026:5;:15::i;:::-;:42;;38059:8;38026:42;;;38044:4;38026:42;37986:83;;;;;;;;:::i;:::-;;;;;;;;35901:2174;;;;;;;;;;;;;;:::o;29152:526::-;29432:24;29413:8;23369:15;23357:8;:27;;23349:55;;;;;;;;;;;;:::i;:::-;29475:75:::1;29494:7;29503:8;29513;29523:12;29537:4;29543:6;29475:18;:75::i;:::-;29465:85;;29559:73;29591:7;29600:10;29612:4;29617:1;29612:7;;;;;;;;;;;;;;29621;29629:1;29621:10;;;;;;;29559:73;29639:33;29645:7;29654;29663:4;29669:2;29639:5;:33::i;:::-;29152:526:::0;;;;;;;;;;;:::o;21175:81::-;21221:7;21244:6;;;21175:81;:::o;30221:448::-;30467:24;30448:8;23369:15;23357:8;:27;;23349:55;;;;;;;;;;;;:::i;:::-;30510:73:::1;30529:4;30535:8;30545:9;30556:12;30570:4;;30510:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30576:6;;30510:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;30510:18:0::1;::::0;-1:-1:-1;;;30510:73:0:i:1;:::-;30500:83;;30592:34;30606:7;30614:1;30606:10;;;;;;;;;;;;;;30618:4;;30623:1;30618:7;;;;;;30592:34;30633:30;30639:4;30645:7;30654:4;;30633:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;30660:2:0;;-1:-1:-1;30633:5:0::1;::::0;-1:-1:-1;;30633:30:0:i:1;22541:37::-:0;;;;;;:::o;42266:616::-;42571:19;42592:17;42618:13;42634:10;:36;;42661:9;42634:36;;;42655:2;42634:36;42677:79;;;;;42618:52;;-1:-1:-1;42677:26:0;;;;;;:79;;42704:10;;42724:4;;42618:52;;42738:8;;42748:1;;42751;;42754;;42677:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42790:86;42809:4;42815:5;42822:9;42833:14;42849:12;42863:2;42867:8;42790:18;:86::i;:::-;42763:113;;;;-1:-1:-1;42266:616:0;-1:-1:-1;;;;;;;;;;;;;42266:616:0:o;22498:38::-;;;:::o;31257:577::-;31517:24;31498:8;23369:15;23357:8;:27;;23349:55;;;;;;;;;;;;:::i;:::-;31560:71:::1;31579:7;31588:4;31594:8;31604:12;31618:4;;31560:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31624:6;;31560:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;31560:18:0::1;::::0;-1:-1:-1;;;31560:71:0:i:1;41094:517::-:0;41336:19;41357:17;41317:8;23369:15;23357:8;:27;;23349:55;;;;;;;;;;;;:::i;:::-;41410:91:::1;41427:4;41433:5;41440:4;41446:9;41457:14;41473:12;41495:4;41410:16;:91::i;:::-;41383:118:::0;;-1:-1:-1;41383:118:0;-1:-1:-1;41508:51:0::1;41536:5:::0;41543:2;41383:118;41508:27:::1;:51::i;:::-;41566:39;22630:42;41591:2;41595:9;41566:11;:39::i;:::-;;41094:517:::0;;;;;;;;;;;:::o;22406:41::-;;;:::o;25521:448::-;25729:17;25755:12;25787:7;25770:36;;;25807:6;25815;25823:12;25837:7;25770:75;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25755:90;;25852:64;25871:4;25877:6;25885;25893:7;25902;25911:1;25914;25852:18;:64::i;:::-;-1:-1:-1;;25935:28:0;;;;;:24;;;;;;:28;;25960:2;;25935:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;33953:638::-;34249:8;23369:15;23357:8;:27;;23349:55;;;;;;;;;;;;:::i;:::-;34266:71:::1;34298:7;34307:10;34319:4;;34324:1;34319:7;;;;;;34266:71;34368:30;::::0;;;;34344:21:::1;::::0;34368:26:::1;::::0;::::1;::::0;::::1;::::0;:30:::1;::::0;34395:2;;34368:30:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34344:54;;34405:61;34440:7;34449:4;;34405:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;34405:61:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;34455:6:0;;-1:-1:-1;34455:6:0;;;;34405:61;::::1;::::0;34455:6;;34405:61;34455:6;34405:61;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;34463:2:0;;-1:-1:-1;34405:34:0::1;::::0;-1:-1:-1;;34405:61:0:i:1;:::-;34534:12;34481:49;34516:13;34488:8;34481:26;;;34508:2;34481:30;;;;;;;;;;;;;;;:::i;:49::-;:65;;34473:112;;;;;;;;;;;;:::i;40688:400::-:0;40943:15;40960;40924:8;23369:15;23357:8;:27;;23349:55;;;;;;;;;;;;:::i;:::-;41005:77:::1;41022:4;41028:6;41036;41044:9;41055:10;41067;41079:2;41005:16;:77::i;:::-;40984:98:::0;;;;-1:-1:-1;40688:400:0;-1:-1:-1;;;;;;;;;;40688:400:0:o;42957:550::-;43228:17;43209:8;23369:15;23357:8;:27;;23349:55;;;;;;;;;;;;:::i;:::-;43270:100:::1;43286:4;43292:5;43299:4;43305:9;43316:14;43332:12;43354:4;43361:8;43270:15;:100::i;:::-;43416:38;::::0;;;;43254:116;;-1:-1:-1;43377:78:0::1;::::0;-1:-1:-1;43405:5:0;;43412:2;;43416:23:::1;::::0;::::1;::::0;::::1;::::0;:38:::1;::::0;43448:4:::1;::::0;43416:38:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43377:27;:78::i;:::-;43462:39;22630:42;43487:2;43491:9;43462:11;:39::i;:::-;;42957:550:::0;;;;;;;;;;:::o;31840:574::-;32083:24;32064:8;23369:15;23357:8;:27;;23349:55;;;;;;;;;;;;:::i;:::-;32126:69:::1;32144:4;32150:8;32160:9;32171;32182:4;;32188:6;;32126:17;:69::i;:::-;32116:79;;32204:34;32218:7;32226:1;32218:10;;;;;;;32204:34;32245:30;32251:4;32257:7;32266:4;;32245:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;32272:2:0;;-1:-1:-1;32245:5:0::1;::::0;-1:-1:-1;;32245:30:0:i:1;:::-;32330:7;32338:1;32330:10;;;;;;;;;;;;;;32318:9;:22;32314:94;;;32342:66;32373:10;32397:7;32405:1;32397:10;;;;;;;;;;;;;;32385:9;:22;32342:30;:66::i;22069:230::-:0;21388:12;:10;:12::i;:::-;21377:23;;:7;:5;:7::i;:::-;:23;;;21369:68;;;;;;;;;;;;:::i;:::-;22154:22:::1;::::0;::::1;22146:73;;;;;;;;;;;;:::i;:::-;22252:6;::::0;;22231:38:::1;::::0;::::1;::::0;;::::1;::::0;22252:6;::::1;::::0;22231:38:::1;::::0;::::1;22276:6;:17:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;22069:230::o;23727:110::-;21388:12;:10;:12::i;:::-;21377:23;;:7;:5;:7::i;:::-;:23;;;21369:68;;;;;;;;;;;;:::i;:::-;23801:13:::1;:30:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;23727:110::o;25975:574::-;26296:15;26320;26344:17;26264:8;23369:15;23357:8;:27;;23349:55;;;;;;;;;;;;:::i;:::-;26400:96:::1;26419:4;26425:6;26433;26441:14;26457;26473:10;26485;26400:18;:96::i;:::-;26515:28;::::0;;;;26379:117;;-1:-1:-1;26379:117:0;-1:-1:-1;26515:24:0::1;::::0;::::1;::::0;::::1;::::0;:28:::1;::::0;26540:2;;26515:28:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26503:40;;25975:574:::0;;;;;;;;;;;;;;:::o;7589:416::-;7788:12;7802:17;7823:5;:10;;7857;7869:4;7875:2;7879:5;7834:51;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7823:63;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7787:99;;;;7901:7;:57;;;;-1:-1:-1;7913:11:0;;:16;;:44;;;7944:4;7933:24;;;;;;;;;;;;:::i;:::-;7893:106;;;;;;;;;;;;:::i;:::-;7589:416;;;;;;:::o;32555:1392::-;32729:9;32724:1218;32744:4;:11;32740:1;:15;32724:1218;;;32771:20;32800:21;32842:14;32858:20;32880:21;32903:23;32930:14;32965:7;32948:53;;;33014:7;33034:4;33039:1;33034:7;;;;;;;;;;;;;;33054;33074:6;33081:1;33074:9;;;;;;;;;;;;;;32948:146;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32841:253;;;;;;;;;;;33105:19;33127:52;33166:12;33134:7;33127:25;;;33153:4;33158:1;33153:7;;;;;;;;;;;;;;33127:34;;;;;;;;;;;;;;;:::i;:52::-;33105:74;;33222:7;33205:38;;;33244:11;33257:12;33271:13;33286:16;33310;33304:3;:22;33328:7;33205:131;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33190:146;;33363:6;33347:22;;32724:1218;;;;;;33389:18;33424:4;33429:1;33424:7;;;;;;;;;;;;;;33389:43;;33442:18;33462;33495:4;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33484:24;;:7;:24;;;:82;;33541:12;33563:1;33484:82;;;33520:1;33524:12;33484:82;33579:13;;33441:125;;-1:-1:-1;33441:125:0;-1:-1:-1;33579:27:0;:13;:27;33575:147;;33634:13;;;;;;;;;;;33619:34;;;33654:10;33666:7;33675:13;33690:12;33704:4;33709:1;33704:7;;;;;;;;;;;;;;33619:93;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33575:147;33730:10;33761:1;33747:4;:11;:15;33743:1;:19;:39;;33779:3;33743:39;;;33765:4;33770:1;33774;33770:5;33765:11;;;;;;;;;;;;;;33743:39;33829:12;;;33839:1;33829:12;;;;;;;;;33791:51;;;;33730:52;;-1:-1:-1;33791:9:0;;;;;;:51;;33801:10;;33813;;33730:52;;33791:51;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33856:46;33865:4;33870:1;33865:7;;;;;;;;;;;;;;33874:12;33888:13;33856:46;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;33921:13:0;;-1:-1:-1;;32757:3:0;;;;;-1:-1:-1;32724:1218:0;;-1:-1:-1;;32724:1218:0;;;32555:1392;;;;:::o;39350:382::-;39452:4;39469:11;39465:45;;-1:-1:-1;39498:4:0;39491:11;;39465:45;39522:20;39535:5;39522;:20::i;:::-;39518:191;;;39553:28;;;;;:20;39559:4;39553:20;;;;:28;;39574:6;;39553:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39590:42;39621:2;39625:6;39590:30;:42::i;:::-;39518:191;;;39655:46;39683:5;39690:2;39694:6;39655:27;:46::i;:::-;-1:-1:-1;39722:4:0;39350:382;;;;;;:::o;26555:718::-;26767:19;26795:17;26821;26883:93;26897:4;26903:5;26910:4;26916:18;26936:9;26947:14;26963:12;26883:13;:93::i;:::-;26856:120;;-1:-1:-1;26856:120:0;-1:-1:-1;26983:69:0;27015:5;27022:10;27034:4;26856:120;26983:31;:69::i;:::-;27059:30;27073:9;27084:4;27059:13;:30::i;:::-;27108:28;;;;;:24;;;;;;:28;;27133:2;;27108:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27096:40;;27191:9;27179;:21;27175:92;;;27202:65;27233:10;27257:9;27245;:21;27202:30;:65::i;:::-;26555:718;;;;;;;;;;:::o;39886:796::-;40087:15;40104;40153:7;40136:32;;;40169:4;40136:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40128:71;;;;;;;;;;;;:::i;:::-;40206:61;;;;;:32;;;;;;:61;;40239:10;;40220:4;;40257:9;;40206:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40306:15;40323;40356:4;40342:24;;;40367:2;40342:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40305:65;;;;40378:14;40415:7;40398:36;;;40435:6;40443;40398:52;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40377:73;;;40488:6;40478:16;;:6;:16;;;:58;;40519:7;40528;40478:58;;;40498:7;40507;40478:58;40457:79;;-1:-1:-1;40457:79:0;-1:-1:-1;40551:21:0;;;;40543:63;;;;;;;;;;;;:::i;:::-;40632:10;40621:7;:21;;40613:63;;;;;;;;;;;;:::i;:::-;39886:796;;;;;;;;;;;;;:::o;38750:432::-;39003:98;;;;;38960:24;;39003:45;39020:7;39003:45;;;;:98;;39049:7;;39058;;39067:8;;39077:9;;39088:4;;;;39094:6;;;;39003:98;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38993:108;;39130:11;39116:7;39124:1;39116:10;;;;;;;;;;;;;;:25;;39108:68;;;;;;;;;;;;:::i;:::-;38750:432;;;;;;;;;;:::o;28273:873::-;28432:7;28416:13;28446:695;28470:4;:11;28466:1;:15;28446:695;;;28497:20;28534:4;28539:1;28534:7;;;;;;;;;;;;;;28497:45;;28551:14;28568:6;:13;;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28551:32;;28592:17;28612:7;28620:1;28624;28620:5;28612:14;;;;;;;;;;;;;;28592:34;;28636:18;28656;28676:14;28703:6;28694:15;;:5;:15;;;:92;;28756:9;28775:1;28779:6;28694:92;;;28721:1;28725:9;28736:6;:13;;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28799:13;;28635:151;;-1:-1:-1;28635:151:0;;-1:-1:-1;28635:151:0;-1:-1:-1;28799:27:0;:13;:27;28795:135;;28854:13;;;;;;;;;;;28839:34;;;28874:10;28886:5;28893:6;28901:9;28912:4;28917:1;28912:7;;;;;;;;;;;;;;28839:81;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28795:135;28938:10;28969:1;28955:4;:11;:15;28951:1;:19;:39;;28987:3;28951:39;;;28973:4;28978:1;28982;28978:5;28973:11;;;;;;;;;;;;;;28951:39;29039:12;;;29049:1;29039:12;;;;;;;;;28999:53;;;;28938:52;;-1:-1:-1;28999:11:0;;;;;;:53;;29011:10;;29023;;28938:52;;28999:53;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29066:44;29083:6;29092:9;29103:6;29066:44;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;29127:6:0;-1:-1:-1;;28483:3:0;;;;;-1:-1:-1;28446:695:0;;-1:-1:-1;;;28446:695:0;19857:100;19941:10;19857:100;:::o;39188:156::-;39261:4;39255:19;;;39282:6;39255:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39305:32:0;;;;;:20;39311:4;39305:20;;-1:-1:-1;39305:20:0;;-1:-1:-1;39305:32:0;;-1:-1:-1;39326:2:0;;39330:6;;39305:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39298:40;;;14882:132;14971:5;;;14966:16;;;;14958:50;;;;;;;;;;;;:::i;:::-;14882:132;;;;:::o;39738:109::-;39811:29;;;22630:42;39811:29;39738:109;;;;:::o;8011:190::-;8120:12;;;8080;8120;;;;;;;;;8098:7;;;;8113:5;;8098:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8079:54;;;8148:7;8140:55;;;;;;;;;;;;:::i;:::-;8011:190;;;:::o;7213:370::-;7377:12;7391:17;7412:5;:10;;7446;7458:2;7462:5;7423:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7412:57;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7376:93;;;;7484:7;:57;;;;-1:-1:-1;7496:11:0;;:16;;:44;;;7527:4;7516:24;;;;;;;;;;;;:::i;:::-;7476:101;;;;;;;;;;;;:::i;18704:605::-;18831:6;18814:23;;18810:494;;;18907:12;18921:19;18952:5;18944:19;;18981:28;;;19011:6;;18964:54;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;18944:75;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18906:113;;;;19033:7;19028:269;;19053:20;19076:56;19101:6;19076:56;;;;;;;;;;;;;;;;;:24;:56::i;:::-;19053:79;;19192:6;19147:5;:15;;;19163:10;19183:4;19147:42;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;19143:145;;;19220:6;19213:14;;;;;;;;;;;:::i;19143:145::-;19263:13;19269:6;19263:13;;;;;;:::i;:::-;;;;;;;;19028:269;18810:494;;;18704:605;;;;:::o;38081:206::-;38155:7;38175:12;38181:5;38175;:12::i;:::-;38171:111;;;-1:-1:-1;38205:15:0;;;;38198:22;;38171:111;38250:24;;;;;:15;;;;;;:24;;38266:7;;38250:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38243:31;;;;16314:1769;16393:13;16662:2;16647:4;:11;:17;;:38;;;;;16668:4;16673:1;16668:7;;;;;;;;;;;;;;;:17;;16647:38;:59;;;;;16689:4;16694:1;16689:7;;;;;;;;;;;;;;;:17;;16647:59;:80;;;;;16710:4;16715:1;16710:7;;;;;;;;;;;;;;;:17;;16647:80;:101;;;;;16731:4;16736:1;16731:7;;;;;;;;;;;;;;;:17;;16647:101;16643:1356;;;16759:20;16947:2;16941:4;16937:13;16927:23;;17431:6;17425:20;17420:2;:25;17405:4;:11;:40;;17397:74;;;;;;;;;;;;:::i;:::-;17511:6;17529;17494:47;;;;;;;;;:::i;:::-;;;;;;;;;;;;;17480:62;;;;;16643:1356;17624:4;:11;17639:2;17624:17;:38;;;;;17645:4;17650:1;17645:7;;;;;;;;;;;;;;;:17;;17624:38;:59;;;;;17666:4;17671:1;17666:7;;;;;;;;;;;;;;;:17;;17624:59;:80;;;;;17687:4;17692:1;17687:7;;;;;;;;;;;;;;;:17;;17624:80;:101;;;;;17708:4;17713:1;17708:7;;;;;;;;;;;;;;;:17;;17624:101;17620:379;;;17902:2;17892:13;;17886:20;17954:6;17972:12;17886:20;17972:6;:12::i;:::-;17937:53;;;;;;;;;:::i;17620:379::-;18038:6;18058:12;18065:4;18058:6;:12::i;:::-;18021:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;18007:70;;16314:1769;;;;:::o;14745:131::-;14834:5;;;14829:16;;;;14821:49;;;;;;;;;;;;:::i;15020:145::-;15078:9;15104:6;;;:30;;-1:-1:-1;;15119:5:0;;;15133:1;15128;15119:5;15128:1;15114:15;;;;;:20;15104:30;15096:63;;;;;;;;;;;;:::i;38293:451::-;38543:98;;;;;38500:24;;38543:46;38560:7;38543:46;;;;:98;;38590:7;;38599;;38608:8;;38618;;38628:4;;38634:6;;38543:98;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38533:108;;38687:12;38656:7;38681:1;38664:7;:14;:18;38656:27;;;;;;;;;;;;;;:43;;38648:90;;;;;;;;;;;;:::i;:::-;38293:451;;;;;;;;:::o;24990:525::-;25210:15;25227;25272:91;25286:4;25292:6;25300;25308:14;25324;25340:10;25352;25272:13;:91::i;:::-;25251:112;;-1:-1:-1;25251:112:0;-1:-1:-1;25370:66:0;25402:6;25410:10;25422:4;25251:112;25370:31;:66::i;:::-;25443;25475:6;25483:10;25495:4;25501:7;25443:31;:66::i;:::-;24990:525;;;;;;;;;;:::o;23873:1111::-;24096:15;24113;24138:16;24156;24193:7;24176:37;;;24214:4;24220:6;24228;24176:59;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24137:98;;;;24246:8;24258:1;24246:13;:30;;;;-1:-1:-1;24263:13:0;;24246:30;24242:737;;;24309:14;;-1:-1:-1;24325:14:0;;-1:-1:-1;24242:737:0;;;24388:67;;;;;24363:22;;24388:31;24405:7;24388:31;;;;:67;;24420:14;;24436:8;;24446;;24388:67;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24363:92;;24486:14;24468;:32;24464:508;;24539:10;24521:14;:28;;24513:70;;;;;;;;;;;;:::i;:::-;24616:14;;-1:-1:-1;24632:14:0;-1:-1:-1;24632:14:0;24464:508;;;24699:67;;;;;24674:22;;24699:31;24716:7;24699:31;;;;:67;;24731:14;;24747:8;;24757;;24699:67;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24674:92;;24802:14;24784;:32;;24777:40;;;;24854:10;24836:14;:28;;24828:70;;;;;;;;;;;;:::i;:::-;24931:14;24947;;-1:-1:-1;23873:1111:0;;-1:-1:-1;;;;;;;;;;23873:1111:0:o;18089:119::-;18142:13;18171:31;18195:5;18178:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;18214:425;18386:11;;18271:13;;18293:53;;:16;;18400:1;18386:15;;;18382:19;18372:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18372:30:0;;18353:49;;18409:12;:3;18413:1;18409:6;;;;;;;;;;;:12;;;;;;;;;;;18428;:3;18432:1;18428:6;;;;;;;;;;;:12;;;;;;;;;;;18452:9;18447:162;18471:4;:11;18467:1;:15;18447:162;;;18515:8;18541:1;18530:4;18535:1;18530:7;;;;;;;;;;;;;;:12;;:7;18524:19;18515:29;;;;;;;;;;18498:3;18506:1;18502;:5;18510:1;18502:9;18498:14;;;;;;;;;;;:46;;;;;;;;;;;18570:8;18585:4;18590:1;18585:7;;;;;;;;;;;;;;;18595:4;18579:21;18570:31;;;;;;;;;;18553:3;18561:1;18557;:5;18565:1;18557:9;18553:14;;;;;;;;;;;:48;;;;;;;;;;-1:-1:-1;18484:3:0;;18447:162;;;-1:-1:-1;18629:3:0;18214:425;-1:-1:-1;;;18214:425:0:o;14:138:1:-;84:20;;113:33;84:20;113:33;:::i;157:404::-;;;290:3;283:4;275:6;271:17;267:27;257:2;;315:8;305;298:26;257:2;-1:-1:-1;345:20:1;;388:18;377:30;;374:2;;;427:8;417;410:26;374:2;471:4;463:6;459:17;447:29;;534:3;527:4;519;511:6;507:17;499:6;495:30;491:41;488:50;485:2;;;551:1;548;541:12;485:2;247:314;;;;;:::o;566:709::-;;677:3;670:4;662:6;658:17;654:27;644:2;;699:5;692;685:20;644:2;739:6;726:20;765:4;789:65;804:49;850:2;804:49;:::i;:::-;789:65;:::i;:::-;888:15;;;919:12;;;;951:15;;;997:11;;;985:24;;981:33;;978:42;-1:-1:-1;975:2:1;;;1037:5;1030;1023:20;975:2;1063:5;1077:169;1091:2;1088:1;1085:9;1077:169;;;1148:23;1167:3;1148:23;:::i;:::-;1136:36;;1192:12;;;;1224;;;;1109:1;1102:9;1077:169;;;-1:-1:-1;1264:5:1;;634:641;-1:-1:-1;;;;;;;634:641:1:o;1280:158::-;1348:20;;1408:4;1397:16;;1387:27;;1377:2;;1428:1;1425;1418:12;1443:259;;1555:2;1543:9;1534:7;1530:23;1526:32;1523:2;;;1576:6;1568;1561:22;1523:2;1620:9;1607:23;1639:33;1666:5;1639:33;:::i;1707:263::-;;1830:2;1818:9;1809:7;1805:23;1801:32;1798:2;;;1851:6;1843;1836:22;1798:2;1888:9;1882:16;1907:33;1934:5;1907:33;:::i;1975:399::-;;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2136:6;2128;2121:22;2083:2;2173:9;2167:16;2192:33;2219:5;2192:33;:::i;:::-;2294:2;2279:18;;2273:25;2244:5;;-1:-1:-1;2307:35:1;2273:25;2307:35;:::i;:::-;2361:7;2351:17;;;2073:301;;;;;:::o;2379:965::-;;;;;;;;;2610:3;2598:9;2589:7;2585:23;2581:33;2578:2;;;2632:6;2624;2617:22;2578:2;2676:9;2663:23;2695:33;2722:5;2695:33;:::i;:::-;2747:5;-1:-1:-1;2804:2:1;2789:18;;2776:32;2817:35;2776:32;2817:35;:::i;:::-;2871:7;-1:-1:-1;2930:2:1;2915:18;;2902:32;2943:35;2902:32;2943:35;:::i;:::-;2997:7;-1:-1:-1;3051:2:1;3036:18;;3023:32;;-1:-1:-1;3102:3:1;3087:19;;3074:33;;-1:-1:-1;3154:3:1;3139:19;;3126:33;;-1:-1:-1;3211:3:1;3196:19;;3183:33;3225:35;3183:33;3225:35;:::i;:::-;3279:7;3269:17;;;3333:3;3322:9;3318:19;3305:33;3295:43;;2568:776;;;;;;;;;;;:::o;3349:1318::-;;;;;;;;;;;;;3645:3;3633:9;3624:7;3620:23;3616:33;3613:2;;;3667:6;3659;3652:22;3613:2;3711:9;3698:23;3730:33;3757:5;3730:33;:::i;:::-;3782:5;-1:-1:-1;3839:2:1;3824:18;;3811:32;3852:35;3811:32;3852:35;:::i;:::-;3906:7;-1:-1:-1;3965:2:1;3950:18;;3937:32;3978:35;3937:32;3978:35;:::i;:::-;4032:7;-1:-1:-1;4086:2:1;4071:18;;4058:32;;-1:-1:-1;4137:3:1;4122:19;;4109:33;;-1:-1:-1;4189:3:1;4174:19;;4161:33;;-1:-1:-1;4246:3:1;4231:19;;4218:33;4260:35;4218:33;4260:35;:::i;:::-;4314:7;-1:-1:-1;4368:3:1;4353:19;;4340:33;;-1:-1:-1;4425:3:1;4410:19;;4397:33;4439:32;4397:33;4439:32;:::i;:::-;4490:7;-1:-1:-1;4516:39:1;4550:3;4535:19;;4516:39;:::i;:::-;4506:49;;4603:3;4592:9;4588:19;4575:33;4564:44;;4656:3;4645:9;4641:19;4628:33;4617:44;;3603:1064;;;;;;;;;;;;;;:::o;4672:1034::-;;;;;;;;;;4920:3;4908:9;4899:7;4895:23;4891:33;4888:2;;;4942:6;4934;4927:22;4888:2;4986:9;4973:23;5005:33;5032:5;5005:33;:::i;:::-;5057:5;-1:-1:-1;5114:2:1;5099:18;;5086:32;5127:35;5086:32;5127:35;:::i;:::-;5181:7;-1:-1:-1;5240:2:1;5225:18;;5212:32;5253:35;5212:32;5253:35;:::i;:::-;5307:7;-1:-1:-1;5361:2:1;5346:18;;5333:32;;-1:-1:-1;5412:3:1;5397:19;;5384:33;;-1:-1:-1;5464:3:1;5449:19;;5436:33;;-1:-1:-1;5516:3:1;5501:19;;5488:33;;-1:-1:-1;5573:3:1;5558:19;;5545:33;5587:35;5545:33;5587:35;:::i;:::-;5641:7;5631:17;;;5695:3;5684:9;5680:19;5667:33;5657:43;;4878:828;;;;;;;;;;;:::o;5711:1445::-;;;;;;;;;;;6010:3;5998:9;5989:7;5985:23;5981:33;5978:2;;;6032:6;6024;6017:22;5978:2;6076:9;6063:23;6095:33;6122:5;6095:33;:::i;:::-;6147:5;-1:-1:-1;6204:2:1;6189:18;;6176:32;6217:35;6176:32;6217:35;:::i;:::-;6271:7;-1:-1:-1;6325:2:1;6310:18;;6297:32;;-1:-1:-1;6376:2:1;6361:18;;6348:32;;-1:-1:-1;6431:3:1;6416:19;;6403:33;6455:18;6485:14;;;6482:2;;;6517:6;6509;6502:22;6482:2;6561:76;6629:7;6620:6;6609:9;6605:22;6561:76;:::i;:::-;6656:8;;-1:-1:-1;6535:102:1;-1:-1:-1;6744:3:1;6729:19;;6716:33;;-1:-1:-1;6761:16:1;;;6758:2;;;6795:6;6787;6780:22;6758:2;;6839:78;6909:7;6898:8;6887:9;6883:24;6839:78;:::i;:::-;6936:8;;-1:-1:-1;6813:104:1;-1:-1:-1;;7023:3:1;7008:19;;6995:33;7037:35;6995:33;7037:35;:::i;:::-;7091:7;7081:17;;;7145:3;7134:9;7130:19;7117:33;7107:43;;5968:1188;;;;;;;;;;;;;:::o;7161:1799::-;;;;;;;;;7440:3;7428:9;7419:7;7415:23;7411:33;7408:2;;;7462:6;7454;7447:22;7408:2;7480:51;7520:9;7507:23;7480:51;:::i;:::-;7563:9;7550:23;7540:33;;7623:2;7612:9;7608:18;7595:32;7636:33;7663:5;7636:33;:::i;:::-;7688:5;-1:-1:-1;7740:2:1;7725:18;;7712:32;;-1:-1:-1;7791:2:1;7776:18;;7763:32;;-1:-1:-1;7846:3:1;7831:19;;7818:33;7870:18;7900:14;;;7897:2;;;7932:6;7924;7917:22;7897:2;7975:6;7964:9;7960:22;7950:32;;8020:7;8013:4;8009:2;8005:13;8001:27;7991:2;;8047:6;8039;8032:22;7991:2;8088;8075:16;8111:65;8126:49;8172:2;8126:49;:::i;8111:65::-;8198:3;8222:2;8217:3;8210:15;8250:2;8245:3;8241:12;8234:19;;8281:2;8277;8273:11;8330:7;8325:2;8319;8315;8311:11;8307:2;8303:20;8299:29;8296:42;8293:2;;;8356:6;8348;8341:22;8293:2;8383:6;8374:15;;8398:221;8412:2;8409:1;8406:9;8398:221;;;8457:45;8497:3;8484:17;8457:45;:::i;:::-;8527:17;;8515:30;;8430:1;8423:9;;;;;8574:2;8565:12;;;;8597;8398:221;;;-1:-1:-1;8638:5:1;-1:-1:-1;;;8696:3:1;8681:19;;8668:33;;-1:-1:-1;8713:16:1;;;8710:2;;;8747:6;8739;8732:22;8710:2;;8775:67;8834:7;8823:8;8812:9;8808:24;8775:67;:::i;:::-;8765:77;;;8861:41;8897:3;8886:9;8882:19;8861:41;:::i;:::-;8851:51;;8949:3;8938:9;8934:19;8921:33;8911:43;;7398:1562;;;;;;;;;;;:::o;8965:821::-;;;;;;;;9179:3;9167:9;9158:7;9154:23;9150:33;9147:2;;;9201:6;9193;9186:22;9147:2;9245:9;9232:23;9264:33;9291:5;9264:33;:::i;:::-;9316:5;-1:-1:-1;9373:2:1;9358:18;;9345:32;9386:35;9345:32;9386:35;:::i;:::-;9440:7;-1:-1:-1;9494:2:1;9479:18;;9466:32;;-1:-1:-1;9545:2:1;9530:18;;9517:32;;-1:-1:-1;9596:3:1;9581:19;;9568:33;;-1:-1:-1;9653:3:1;9638:19;;9625:33;9667:35;9625:33;9667:35;:::i;:::-;9721:7;9711:17;;;9775:3;9764:9;9760:19;9747:33;9737:43;;9137:649;;;;;;;;;;:::o;9791:1172::-;;;;;;;;;;;;10069:3;10057:9;10048:7;10044:23;10040:33;10037:2;;;10091:6;10083;10076:22;10037:2;10135:9;10122:23;10154:33;10181:5;10154:33;:::i;:::-;10206:5;-1:-1:-1;10263:2:1;10248:18;;10235:32;10276:35;10235:32;10276:35;:::i;:::-;10330:7;-1:-1:-1;10384:2:1;10369:18;;10356:32;;-1:-1:-1;10435:2:1;10420:18;;10407:32;;-1:-1:-1;10486:3:1;10471:19;;10458:33;;-1:-1:-1;10543:3:1;10528:19;;10515:33;10557:35;10515:33;10557:35;:::i;:::-;10611:7;-1:-1:-1;10665:3:1;10650:19;;10637:33;;-1:-1:-1;10722:3:1;10707:19;;10694:33;10736:32;10694:33;10736:32;:::i;:::-;10787:7;-1:-1:-1;10813:39:1;10847:3;10832:19;;10813:39;:::i;:::-;10803:49;;10899:3;10888:9;10884:19;10871:33;10861:43;;10952:3;10941:9;10937:19;10924:33;10913:44;;10027:936;;;;;;;;;;;;;;:::o;10968:967::-;;;;;;;;11180:3;11168:9;11159:7;11155:23;11151:33;11148:2;;;11202:6;11194;11187:22;11148:2;11246:9;11233:23;11265:33;11292:5;11265:33;:::i;:::-;11317:5;-1:-1:-1;11374:2:1;11359:18;;11346:32;11387:35;11346:32;11387:35;:::i;:::-;11441:7;-1:-1:-1;11495:2:1;11480:18;;11467:32;;-1:-1:-1;11546:2:1;11531:18;;11518:32;;-1:-1:-1;11602:3:1;11587:19;;11574:33;11616:34;11574:33;11616:34;:::i;:::-;11669:7;-1:-1:-1;11728:3:1;11713:19;;11700:33;11742:34;11700:33;11742:34;:::i;:::-;11795:7;-1:-1:-1;11854:3:1;11839:19;;11826:33;11868:35;11826:33;11868:35;:::i;:::-;11922:7;11912:17;;;11138:797;;;;;;;;;;:::o;11940:327::-;;;12069:2;12057:9;12048:7;12044:23;12040:32;12037:2;;;12090:6;12082;12075:22;12037:2;12134:9;12121:23;12153:33;12180:5;12153:33;:::i;:::-;12205:5;12257:2;12242:18;;;;12229:32;;-1:-1:-1;;;12027:240:1:o;12272:1232::-;;;;;;;;;12537:3;12525:9;12516:7;12512:23;12508:33;12505:2;;;12559:6;12551;12544:22;12505:2;12603:9;12590:23;12622:33;12649:5;12622:33;:::i;:::-;12674:5;-1:-1:-1;12726:2:1;12711:18;;12698:32;;-1:-1:-1;12781:2:1;12766:18;;12753:32;12804:18;12834:14;;;12831:2;;;12866:6;12858;12851:22;12831:2;12910:76;12978:7;12969:6;12958:9;12954:22;12910:76;:::i;:::-;13005:8;;-1:-1:-1;12884:102:1;-1:-1:-1;13093:2:1;13078:18;;13065:32;;-1:-1:-1;13109:16:1;;;13106:2;;;13143:6;13135;13128:22;13106:2;;13187:78;13257:7;13246:8;13235:9;13231:24;13187:78;:::i;:::-;13284:8;;-1:-1:-1;13161:104:1;-1:-1:-1;;13371:3:1;13356:19;;13343:33;13385:35;13343:33;13385:35;:::i;:::-;13439:7;13429:17;;;13493:3;13482:9;13478:19;13465:33;13455:43;;12495:1009;;;;;;;;;;;:::o;13509:1301::-;;;;;;;;;;13791:3;13779:9;13770:7;13766:23;13762:33;13759:2;;;13813:6;13805;13798:22;13759:2;13857:9;13844:23;13876:33;13903:5;13876:33;:::i;:::-;13928:5;-1:-1:-1;13980:2:1;13965:18;;13952:32;;-1:-1:-1;14031:2:1;14016:18;;14003:32;;-1:-1:-1;14086:2:1;14071:18;;14058:32;14109:18;14139:14;;;14136:2;;;14171:6;14163;14156:22;14136:2;14215:76;14283:7;14274:6;14263:9;14259:22;14215:76;:::i;:::-;14310:8;;-1:-1:-1;14189:102:1;-1:-1:-1;14398:3:1;14383:19;;14370:33;;-1:-1:-1;14415:16:1;;;14412:2;;;14449:6;14441;14434:22;14412:2;;14493:78;14563:7;14552:8;14541:9;14537:24;14493:78;:::i;:::-;14590:8;;-1:-1:-1;14467:104:1;-1:-1:-1;;14677:3:1;14662:19;;14649:33;14691:35;14649:33;14691:35;:::i;:::-;14745:7;14735:17;;;14799:3;14788:9;14784:19;14771:33;14761:43;;13749:1061;;;;;;;;;;;:::o;14815:790::-;;;;;;;15020:3;15008:9;14999:7;14995:23;14991:33;14988:2;;;15042:6;15034;15027:22;14988:2;15079:9;15073:16;15098:33;15125:5;15098:33;:::i;:::-;15150:5;15140:15;;;15195:2;15184:9;15180:18;15174:25;15164:35;;15239:2;15228:9;15224:18;15218:25;15208:35;;15288:2;15277:9;15273:18;15267:25;15301:34;15327:7;15301:34;:::i;:::-;15406:3;15391:19;;15385:26;15354:7;;-1:-1:-1;15420:34:1;15385:26;15420:34;:::i;:::-;15525:3;15510:19;;15504:26;15473:7;;-1:-1:-1;15539:34:1;15504:26;15539:34;:::i;:::-;15592:7;15582:17;;;14978:627;;;;;;;;:::o;15610:754::-;;;;;;15788:3;15776:9;15767:7;15763:23;15759:33;15756:2;;;15810:6;15802;15795:22;15756:2;15854:9;15841:23;15873:33;15900:5;15873:33;:::i;:::-;15925:5;-1:-1:-1;15977:2:1;15962:18;;15949:32;;-1:-1:-1;16033:2:1;16018:18;;16005:32;16046:34;16005:32;16046:34;:::i;:::-;16099:7;-1:-1:-1;16158:2:1;16143:18;;16130:32;16171:34;16130:32;16171:34;:::i;:::-;16224:7;-1:-1:-1;16283:3:1;16268:19;;16255:33;16297:35;16255:33;16297:35;:::i;:::-;16351:7;16341:17;;;15746:618;;;;;;;;:::o;16369:943::-;;16495:2;16538;16526:9;16517:7;16513:23;16509:32;16506:2;;;16559:6;16551;16544:22;16506:2;16597:9;16591:16;16630:18;16622:6;16619:30;16616:2;;;16667:6;16659;16652:22;16616:2;16695:22;;16748:4;16740:13;;16736:27;-1:-1:-1;16726:2:1;;16782:6;16774;16767:22;16726:2;16816;16810:9;16839:65;16854:49;16900:2;16854:49;:::i;16839:65::-;16938:15;;;16969:12;;;;17001:11;;;17039;;;17031:20;;17027:29;;17024:42;-1:-1:-1;17021:2:1;;;17084:6;17076;17069:22;17021:2;17111:6;17102:15;;17126:156;17140:2;17137:1;17134:9;17126:156;;;17197:10;;17185:23;;17158:1;17151:9;;;;;17228:12;;;;17260;;17126:156;;;-1:-1:-1;17301:5:1;16475:837;-1:-1:-1;;;;;;;16475:837:1:o;17317:257::-;;17437:2;17425:9;17416:7;17412:23;17408:32;17405:2;;;17458:6;17450;17443:22;17405:2;17495:9;17489:16;17514:30;17538:5;17514:30;:::i;17579:1100::-;;;;;17808:2;17796:9;17787:7;17783:23;17779:32;17776:2;;;17829:6;17821;17814:22;17776:2;17873:9;17860:23;17892:33;17919:5;17892:33;:::i;:::-;17944:5;-1:-1:-1;18000:2:1;17985:18;;17972:32;18023:18;18053:14;;;18050:2;;;18085:6;18077;18070:22;18050:2;18113:22;;;;18169:3;18151:16;;;18147:26;18144:2;;;18191:6;18183;18176:22;18144:2;18219;;-1:-1:-1;18274:2:1;18259:18;;18246:32;;18290:16;;;18287:2;;;18324:6;18316;18309:22;18287:2;18367:8;18356:9;18352:24;18342:34;;18414:7;18407:4;18403:2;18399:13;18395:27;18385:2;;18441:6;18433;18426:22;18385:2;18486;18473:16;18512:2;18504:6;18501:14;18498:2;;;18533:6;18525;18518:22;18498:2;18583:7;18578:2;18569:6;18565:2;18561:15;18557:24;18554:37;18551:2;;;18609:6;18601;18594:22;18551:2;17766:913;;;;-1:-1:-1;;18645:2:1;18637:11;;-1:-1:-1;;;17766:913:1:o;18962:194::-;;19085:2;19073:9;19064:7;19060:23;19056:32;19053:2;;;19106:6;19098;19091:22;19053:2;-1:-1:-1;19134:16:1;;19043:113;-1:-1:-1;19043:113:1:o;19161:255::-;;;19301:2;19289:9;19280:7;19276:23;19272:32;19269:2;;;19322:6;19314;19307:22;19269:2;-1:-1:-1;;19350:16:1;;19406:2;19391:18;;;19385:25;19350:16;;19385:25;;-1:-1:-1;19259:157:1:o;19421:452::-;;19516:5;19510:12;19543:6;19538:3;19531:19;19569:4;19598:2;19593:3;19589:12;19582:19;;19635:2;19628:5;19624:14;19656:3;19668:180;19682:6;19679:1;19676:13;19668:180;;;19747:13;;19762:4;19743:24;19731:37;;19788:12;;;;19823:15;;;;19704:1;19697:9;19668:180;;;-1:-1:-1;19864:3:1;;19486:387;-1:-1:-1;;;;;19486:387:1:o;19878:318::-;;19959:5;19953:12;19986:6;19981:3;19974:19;20002:63;20058:6;20051:4;20046:3;20042:14;20035:4;20028:5;20024:16;20002:63;:::i;:::-;20110:2;20098:15;20115:66;20094:88;20085:98;;;;20185:4;20081:109;;19929:267;-1:-1:-1;;19929:267:1:o;20201:416::-;;20408:66;20400:6;20396:79;20391:3;20384:92;20519:6;20511;20507:1;20502:3;20498:11;20485:41;20549:16;;20567:1;20545:24;20578:15;;;20545:24;20374:243;-1:-1:-1;;20374:243:1:o;20622:274::-;;20789:6;20783:13;20805:53;20851:6;20846:3;20839:4;20831:6;20827:17;20805:53;:::i;:::-;20874:16;;;;;20759:137;-1:-1:-1;;20759:137:1:o;20901:773::-;;21320:6;21314:13;21336:53;21382:6;21377:3;21370:4;21362:6;21358:17;21336:53;:::i;:::-;21450:8;21411:16;;;21436:23;;;21484:13;;21506:65;21484:13;21558:1;21547:13;;21540:4;21528:17;;21506:65;:::i;:::-;21638:3;21634:1;21590:20;;;;21626:10;;;21619:23;21666:1;21658:10;;21290:384;-1:-1:-1;;;;21290:384:1:o;21679:775::-;;22098:6;22092:13;22114:53;22160:6;22155:3;22148:4;22140:6;22136:17;22114:53;:::i;:::-;22228:10;22189:16;;;22214:25;;;22264:13;;22286:65;22264:13;22338:1;22327:13;;22320:4;22308:17;;22286:65;:::i;:::-;22418:3;22414:1;22370:20;;;;22406:10;;;22399:23;22446:1;22438:10;;22068:386;-1:-1:-1;;;;22068:386:1:o;22459:773::-;;22878:6;22872:13;22894:53;22940:6;22935:3;22928:4;22920:6;22916:17;22894:53;:::i;:::-;23008:8;22969:16;;;22994:23;;;23042:13;;23064:65;23042:13;23116:1;23105:13;;23098:4;23086:17;;23064:65;:::i;23237:182::-;23366:19;;;23410:2;23401:12;;23356:63::o;23424:226::-;23600:42;23588:55;;;;23570:74;;23558:2;23543:18;;23525:125::o;23894:335::-;24086:42;24155:15;;;24137:34;;24207:15;;24202:2;24187:18;;24180:43;24064:2;24049:18;;24031:198::o;24234:709::-;24571:42;24640:15;;;24622:34;;24692:15;;;;24687:2;24672:18;;24665:43;24739:2;24724:18;;24717:34;;;;24782:2;24767:18;;24760:34;;;;24843:4;24831:17;24825:3;24810:19;;24803:46;24880:3;24865:19;;24858:35;24924:3;24909:19;;24902:35;;;;24548:3;24533:19;;24515:428::o;24948:568::-;25225:42;25294:15;;;25276:34;;25346:15;;;25341:2;25326:18;;25319:43;25398:15;;;25393:2;25378:18;;25371:43;25445:2;25430:18;;25423:34;25494:15;;;25488:3;25473:19;;25466:44;25202:3;25187:19;;25169:347::o;25521:406::-;25741:42;25810:15;;;25792:34;;25862:15;;;;25857:2;25842:18;;25835:43;25909:2;25894:18;;25887:34;;;;25719:2;25704:18;;25686:241::o;25932:668::-;26265:42;26334:15;;;26316:34;;26386:15;;;26381:2;26366:18;;26359:43;26438:15;;;26433:2;26418:18;;26411:43;26490:15;;26485:2;26470:18;;26463:43;26537:3;26522:19;;26515:35;;;;26581:3;26566:19;;26559:35;;;;26242:3;26227:19;;26209:391::o;26937:407::-;27149:42;27218:15;;;27200:34;;27270:15;;;27265:2;27250:18;;27243:43;27322:15;;;27317:2;27302:18;;27295:43;27127:2;27112:18;;27094:250::o;27349:1570::-;;27745:3;27734:9;27730:19;27768:42;27849:2;27841:6;27837:15;27826:9;27819:34;27872:2;27922;27914:6;27910:15;27905:2;27894:9;27890:18;27883:43;27974:2;27966:6;27962:15;27957:2;27946:9;27942:18;27935:43;28014:6;28009:2;27998:9;27994:18;27987:34;28058:3;28052;28041:9;28037:19;28030:32;28082:6;28112;28104;28097:22;28150:3;28139:9;28135:19;28128:26;;28177:6;28163:20;;28201:4;28214:262;28228:6;28225:1;28222:13;28214:262;;;28303:6;28290:20;28323:33;28350:5;28323:33;:::i;:::-;28381:14;;28369:27;;28451:15;;;;28416:12;;;;28250:1;28243:9;28214:262;;;-1:-1:-1;28513:19:1;;;28507:3;28492:19;;28485:48;28567:19;;;28604:12;;;-1:-1:-1;28641:6:1;;-1:-1:-1;28667:4:1;28680:211;28696:6;28691:3;28688:15;28680:211;;;28797:4;28767:28;28786:8;28767:28;:::i;:::-;28763:39;28749:54;;28825:14;;;;28864:17;;;;28722:1;28713:11;28680:211;;;-1:-1:-1;28908:5:1;;27706:1213;-1:-1:-1;;;;;;;;;;;;27706:1213:1:o;28924:1193::-;;29300:3;29289:9;29285:19;29323:42;29404:2;29396:6;29392:15;29381:9;29374:34;29427:2;29477;29469:6;29465:15;29460:2;29449:9;29445:18;29438:43;29529:2;29521:6;29517:15;29512:2;29501:9;29497:18;29490:43;29569:6;29564:2;29553:9;29549:18;29542:34;29613:3;29607;29596:9;29592:19;29585:32;29637:6;29672;29666:13;29703:6;29695;29688:22;29741:3;29730:9;29726:19;29719:26;;29780:2;29772:6;29768:15;29754:29;;29801:4;29814:178;29828:6;29825:1;29822:13;29814:178;;;29893:13;;29889:22;;29877:35;;29967:15;;;;29932:12;;;;29850:1;29843:9;29814:178;;;29818:3;;30038:9;30033:3;30029:19;30023:3;30012:9;30008:19;30001:48;30066:45;30107:3;30099:6;30066:45;:::i;:::-;30058:53;29261:856;-1:-1:-1;;;;;;;;;;;;29261:856:1:o;30122:486::-;30359:42;30428:15;;;30410:34;;30480:15;;;30475:2;30460:18;;30453:43;30532:15;;30527:2;30512:18;;30505:43;30596:4;30584:17;;;30579:2;30564:18;;30557:45;30336:3;30321:19;;30303:305::o;31016:513::-;31253:42;31322:15;;;31304:34;;31374:15;;;;31369:2;31354:18;;31347:43;31409:10;31455:15;;;31450:2;31435:18;;31428:43;31507:15;;;31502:2;31487:18;;31480:43;31230:3;31215:19;;31197:332::o;31534:297::-;31738:42;31726:55;;;;31708:74;;31813:2;31798:18;;31791:34;31696:2;31681:18;;31663:168::o;31836:398::-;32048:42;32117:15;;;32099:34;;32164:2;32149:18;;32142:34;;;;32212:15;;;32207:2;32192:18;;32185:43;32026:2;32011:18;;31993:241::o;32239:635::-;32410:2;32462:21;;;32532:13;;32435:18;;;32554:22;;;32239:635;;32410:2;32633:15;;;;32607:2;32592:18;;;32239:635;32679:169;32693:6;32690:1;32687:13;32679:169;;;32754:13;;32742:26;;32823:15;;;;32788:12;;;;32715:1;32708:9;32679:169;;;-1:-1:-1;32865:3:1;;32390:484;-1:-1:-1;;;;;;32390:484:1:o;32879:588::-;;33080:2;33069:9;33062:21;33119:6;33114:2;33103:9;33099:18;33092:34;33176:6;33168;33163:2;33152:9;33148:18;33135:48;33232:4;33227:2;33218:6;33207:9;33203:22;33199:31;33192:45;33364:2;33294:66;33289:2;33281:6;33277:15;33273:88;33262:9;33258:104;33254:113;33246:121;;33417:42;33409:6;33405:55;33398:4;33387:9;33383:20;33376:85;33052:415;;;;;;:::o;33472:221::-;;33621:2;33610:9;33603:21;33641:46;33683:2;33672:9;33668:18;33660:6;33641:46;:::i;33698:345::-;33900:2;33882:21;;;33939:2;33919:18;;;33912:30;33978:23;33973:2;33958:18;;33951:51;34034:2;34019:18;;33872:171::o;34048:355::-;34250:2;34232:21;;;34289:2;34269:18;;;34262:30;34328:33;34323:2;34308:18;;34301:61;34394:2;34379:18;;34222:181::o;34408:342::-;34610:2;34592:21;;;34649:2;34629:18;;;34622:30;34688:20;34683:2;34668:18;;34661:48;34741:2;34726:18;;34582:168::o;34755:402::-;34957:2;34939:21;;;34996:2;34976:18;;;34969:30;35035:34;35030:2;35015:18;;35008:62;35106:8;35101:2;35086:18;;35079:36;35147:3;35132:19;;34929:228::o;35162:344::-;35364:2;35346:21;;;35403:2;35383:18;;;35376:30;35442:22;35437:2;35422:18;;35415:50;35497:2;35482:18;;35336:170::o;35511:354::-;35713:2;35695:21;;;35752:2;35732:18;;;35725:30;35791:32;35786:2;35771:18;;35764:60;35856:2;35841:18;;35685:180::o;35870:353::-;36072:2;36054:21;;;36111:2;36091:18;;;36084:30;36150:31;36145:2;36130:18;;36123:59;36214:2;36199:18;;36044:179::o;36228:344::-;36430:2;36412:21;;;36469:2;36449:18;;;36442:30;36508:22;36503:2;36488:18;;36481:50;36563:2;36548:18;;36402:170::o;36577:341::-;36779:2;36761:21;;;36818:2;36798:18;;;36791:30;36857:19;36852:2;36837:18;;36830:47;36909:2;36894:18;;36751:167::o;36923:353::-;37125:2;37107:21;;;37164:2;37144:18;;;37137:30;37203:31;37198:2;37183:18;;37176:59;37267:2;37252:18;;37097:179::o;37281:351::-;37483:2;37465:21;;;37522:2;37502:18;;;37495:30;37561:29;37556:2;37541:18;;37534:57;37623:2;37608:18;;37455:177::o;37637:350::-;37839:2;37821:21;;;37878:2;37858:18;;;37851:30;37917:28;37912:2;37897:18;;37890:56;37978:2;37963:18;;37811:176::o;37992:356::-;38194:2;38176:21;;;38213:18;;;38206:30;38272:34;38267:2;38252:18;;38245:62;38339:2;38324:18;;38166:182::o;38353:339::-;38555:2;38537:21;;;38594:2;38574:18;;;38567:30;38633:17;38628:2;38613:18;;38606:45;38683:2;38668:18;;38527:165::o;38697:347::-;38899:2;38881:21;;;38938:2;38918:18;;;38911:30;38977:25;38972:2;38957:18;;38950:53;39035:2;39020:18;;38871:173::o;39049:345::-;39251:2;39233:21;;;39290:2;39270:18;;;39263:30;39329:23;39324:2;39309:18;;39302:51;39385:2;39370:18;;39223:171::o;39399:398::-;39601:2;39583:21;;;39640:2;39620:18;;;39613:30;39679:34;39674:2;39659:18;;39652:62;39750:4;39745:2;39730:18;;39723:32;39787:3;39772:19;;39573:224::o;39802:399::-;40004:2;39986:21;;;40043:2;40023:18;;;40016:30;40082:34;40077:2;40062:18;;40055:62;40153:5;40148:2;40133:18;;40126:33;40191:3;40176:19;;39976:225::o;40206:400::-;40408:2;40390:21;;;40447:2;40427:18;;;40420:30;40486:34;40481:2;40466:18;;40459:62;40557:6;40552:2;40537:18;;40530:34;40596:3;40581:19;;40380:226::o;40611:344::-;40813:2;40795:21;;;40852:2;40832:18;;;40825:30;40891:22;40886:2;40871:18;;40864:50;40946:2;40931:18;;40785:170::o;41142:248::-;41316:25;;;41372:2;41357:18;;41350:34;41304:2;41289:18;;41271:119::o;41395:483::-;;41626:6;41615:9;41608:25;41669:6;41664:2;41653:9;41649:18;41642:34;41724:42;41716:6;41712:55;41707:2;41696:9;41692:18;41685:83;41804:3;41799:2;41788:9;41784:18;41777:31;41825:47;41867:3;41856:9;41852:19;41844:6;41825:47;:::i;41883:319::-;42085:25;;;42141:2;42126:18;;42119:34;;;;42184:2;42169:18;;42162:34;42073:2;42058:18;;42040:162::o;42207:585::-;42488:25;;;42544:2;42529:18;;42522:34;;;;42587:2;42572:18;;42565:34;;;;42618:10;42664:15;;;42659:2;42644:18;;42637:43;42717:15;;;42711:3;42696:19;;42689:44;42770:15;42764:3;42749:19;;42742:44;42475:3;42460:19;;42442:350::o;42797:592::-;;;42940:11;42927:25;43030:66;43019:8;43003:14;42999:29;42995:102;42975:18;42971:127;42961:2;;43115:4;43109;43102:18;42961:2;43145:33;;43197:20;;;-1:-1:-1;43240:18:1;43229:30;;43226:2;;;43275:4;43269;43262:18;43226:2;43311:4;43299:17;;-1:-1:-1;43342:14:1;43338:27;;;43328:38;;43325:2;;;43379:1;43376;43369:12;43394:242;43464:2;43458:9;43494:17;;;43541:18;43526:34;;43562:22;;;43523:62;43520:2;;;43588:9;43520:2;43615;43608:22;43438:198;;-1:-1:-1;43438:198:1:o;43641:183::-;;43740:18;43732:6;43729:30;43726:2;;;43762:9;43726:2;-1:-1:-1;43813:4:1;43794:17;;;43790:28;;43716:108::o;43829:258::-;43901:1;43911:113;43925:6;43922:1;43919:13;43911:113;;;44001:11;;;43995:18;43982:11;;;43975:39;43947:2;43940:10;43911:113;;;44042:6;44039:1;44036:13;44033:2;;;-1:-1:-1;;44077:1:1;44059:16;;44052:27;43882:205::o;44092:156::-;44180:42;44173:5;44169:54;44162:5;44159:65;44149:2;;44238:1;44235;44228:12;44149:2;44139:109;:::o;44253:120::-;44341:5;44334:13;44327:21;44320:5;44317:32;44307:2;;44363:1;44360;44353:12;44378:123;44465:10;44458:5;44454:22;44447:5;44444:33;44434:2;;44491:1;44488;44481:12

Swarm Source

ipfs://195ff6f860b2fc7d0b617a8af6518f4d5d5250ec9425b517617dfc4cddb2bdbf
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.