{
  "contractName": "UniswapFactory",
  "abi": [
    {
      "constant": true,
      "inputs": [],
      "name": "exchangeTemplate",
      "outputs": [
        {
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "tokenCount",
      "outputs": [
        {
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "name": "token",
          "type": "address"
        },
        {
          "indexed": true,
          "name": "exchange",
          "type": "address"
        }
      ],
      "name": "NewExchange",
      "type": "event"
    },
    {
      "constant": false,
      "inputs": [
        {
          "name": "template",
          "type": "address"
        }
      ],
      "name": "initializeFactory",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "name": "token",
          "type": "address"
        }
      ],
      "name": "createExchange",
      "outputs": [
        {
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "name": "exchange",
          "type": "address"
        },
        {
          "name": "token",
          "type": "address"
        }
      ],
      "name": "registerExchange",
      "outputs": [
        {
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "name": "token",
          "type": "address"
        }
      ],
      "name": "getExchange",
      "outputs": [
        {
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "name": "exchange",
          "type": "address"
        }
      ],
      "name": "getToken",
      "outputs": [
        {
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "name": "token_id",
          "type": "uint256"
        }
      ],
      "name": "getTokenWithId",
      "outputs": [
        {
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "bytecode": "0x608060405234801561001057600080fd5b50d3801561001d57600080fd5b50d2801561002a57600080fd5b506160ac8061003a6000396000f3fe608060405234801561001057600080fd5b50d3801561001d57600080fd5b50d2801561002a57600080fd5b50600436106100bf576000357c010000000000000000000000000000000000000000000000000000000090048063538a3f0e11610092578063538a3f0e146102ba57806359770438146102fe5780639f181b5e14610382578063aa65a6c0146103a0576100bf565b806306f2bf62146100c457806315e7dc86146101485780631648f38e146101ec5780631c2bbd1814610270575b600080fd5b610106600480360360208110156100da57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061040e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101aa6004803603604081101561015e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610477565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61022e6004803603602081101561020257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610849565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610278610c4d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102fc600480360360208110156102d057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c72565b005b6103406004803603602081101561031457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d49565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61038a610db2565b6040518082815260200191505060405180910390f35b6103cc600480360360208110156103b657600080fd5b8101908080359060200190929190505050610db8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156104b257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461054a57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1663966dae0e6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156105c357600080fd5b505afa1580156105d7573d6000803e3d6000fd5b505050506040513d60208110156105ed57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614610687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f65786368616e67652e666163746f727920646f6573206e6f74206d617463680081525060200191505060405180910390fd5b82600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006001805401905080600181905550826004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f9d42cb017eb05bd8944ab536a8b35bc68085931dd5f4356489801453923953f960405160405180910390a38391505092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561088457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156108df57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461097757600080fd5b600060405161098590610df5565b604051809103906000f0801580156109a1573d6000803e3d6000fd5b5090508073ffffffffffffffffffffffffffffffffffffffff16632d34ba7984306040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b158015610a7357600080fd5b505af1158015610a87573d6000803e3d6000fd5b5050505080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006001805401905080600181905550836004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f9d42cb017eb05bd8944ab536a8b35bc68085931dd5f4356489801453923953f960405160405180910390a38192505050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ccc57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d0657600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60015481565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61527e80610e038339019056fe60806040523480156200001157600080fd5b50d380156200001f57600080fd5b50d280156200002d57600080fd5b50615240806200003e6000396000f3fe608060405260043610610242576000357c010000000000000000000000000000000000000000000000000000000090048063966dae0e11610140578063d4e4841d116100c8578063f39b5b9b1161008c578063f39b5b9b146112cc578063f3c0efe914611318578063f552d91b146113df578063f88bf15a146114a6578063fd11c2231461153457610242565b8063d4e4841d14610f7b578063dd62ed3e14611018578063ddf7e1a7146110b7578063ea650c7d1461115e578063ec384a3e1461120557610242565b8063a9059cbb1161010f578063a9059cbb14610ccb578063ad65d76d14610d58578063b040d54514610dc4578063b1cb43bf14610e6b578063cd7724c314610f1257610242565b8063966dae0e14610a95578063981a132714610b065780639d76ea5814610bcd578063a457c2d714610c3e57610242565b806339509351116101ce5780637237e031116101925780637237e0311461085057806389f2a871146108ed57806395b68fe71461096a57806395d89b41146109d357806395e3c50b14610a1857610242565b80633950935114610639578063422f1043146106c657806359e948621461071c5780636b1d4db71461078557806370a08231146107d157610242565b806318160ddd1161021557806318160ddd1461040e57806323b872dd146104535780632640f62c146105005780632d34ba7914610569578063313ce567146105f457610242565b8063013efd8b1461025357806306fdde03146102d0578063095ea7b3146103155780630b573638146103a2575b6102503460014233336115b1565b50005b34801561025f57600080fd5b50d3801561026c57600080fd5b50d2801561027957600080fd5b506102ba6004803603606081101561029057600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050611873565b6040518082815260200191505060405180910390f35b3480156102dc57600080fd5b50d380156102e957600080fd5b50d280156102f657600080fd5b506102ff61188b565b6040518082815260200191505060405180910390f35b34801561032157600080fd5b50d3801561032e57600080fd5b50d2801561033b57600080fd5b506103886004803603604081101561035257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611891565b604051808215151515815260200191505060405180910390f35b6103f8600480360360608110156103b857600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506118a8565b6040518082815260200191505060405180910390f35b34801561041a57600080fd5b50d3801561042757600080fd5b50d2801561043457600080fd5b5061043d611932565b6040518082815260200191505060405180910390f35b34801561045f57600080fd5b50d3801561046c57600080fd5b50d2801561047957600080fd5b506104e66004803603606081101561049057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061193c565b604051808215151515815260200191505060405180910390f35b34801561050c57600080fd5b50d3801561051957600080fd5b50d2801561052657600080fd5b506105536004803603602081101561053d57600080fd5b81019080803590602001909291905050506119ed565b6040518082815260200191505060405180910390f35b34801561057557600080fd5b50d3801561058257600080fd5b50d2801561058f57600080fd5b506105f2600480360360408110156105a657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b1f565b005b34801561060057600080fd5b50d3801561060d57600080fd5b50d2801561061a57600080fd5b50610623611d58565b6040518082815260200191505060405180910390f35b34801561064557600080fd5b50d3801561065257600080fd5b50d2801561065f57600080fd5b506106ac6004803603604081101561067657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611d5e565b604051808215151515815260200191505060405180910390f35b610706600480360360608110156106dc57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050611e03565b6040518082815260200191505060405180910390f35b34801561072857600080fd5b50d3801561073557600080fd5b50d2801561074257600080fd5b5061076f6004803603602081101561075957600080fd5b81019080803590602001909291905050506127a6565b6040518082815260200191505060405180910390f35b6107bb6004803603604081101561079b57600080fd5b8101908080359060200190929190803590602001909291905050506128de565b6040518082815260200191505060405180910390f35b3480156107dd57600080fd5b50d380156107ea57600080fd5b50d280156107f757600080fd5b5061083a6004803603602081101561080e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128f5565b6040518082815260200191505060405180910390f35b34801561085c57600080fd5b50d3801561086957600080fd5b50d2801561087657600080fd5b506108d76004803603608081101561088d57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061293d565b6040518082815260200191505060405180910390f35b3480156108f957600080fd5b50d3801561090657600080fd5b50d2801561091357600080fd5b506109546004803603606081101561092a57600080fd5b810190808035906020019092919080359060200190929190803590602001909291905050506129c8565b6040518082815260200191505060405180910390f35b34801561097657600080fd5b50d3801561098357600080fd5b50d2801561099057600080fd5b506109bd600480360360208110156109a757600080fd5b8101908080359060200190929190505050612abc565b6040518082815260200191505060405180910390f35b3480156109df57600080fd5b50d380156109ec57600080fd5b50d280156109f957600080fd5b50610a02612bf4565b6040518082815260200191505060405180910390f35b348015610a2457600080fd5b50d38015610a3157600080fd5b50d28015610a3e57600080fd5b50610a7f60048036036060811015610a5557600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050612bfa565b6040518082815260200191505060405180910390f35b348015610aa157600080fd5b50d38015610aae57600080fd5b50d28015610abb57600080fd5b50610ac4612c12565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b1257600080fd5b50d38015610b1f57600080fd5b50d28015610b2c57600080fd5b50610bb7600480360360c0811015610b4357600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c3c565b6040518082815260200191505060405180910390f35b348015610bd957600080fd5b50d38015610be657600080fd5b50d28015610bf357600080fd5b50610bfc612c92565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610c4a57600080fd5b50d38015610c5757600080fd5b50d28015610c6457600080fd5b50610cb160048036036040811015610c7b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612cbc565b604051808215151515815260200191505060405180910390f35b348015610cd757600080fd5b50d38015610ce457600080fd5b50d28015610cf157600080fd5b50610d3e60048036036040811015610d0857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612d61565b604051808215151515815260200191505060405180910390f35b610dae60048036036060811015610d6e57600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d78565b6040518082815260200191505060405180910390f35b348015610dd057600080fd5b50d38015610ddd57600080fd5b50d28015610dea57600080fd5b50610e55600480360360a0811015610e0157600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612e02565b6040518082815260200191505060405180910390f35b348015610e7757600080fd5b50d38015610e8457600080fd5b50d28015610e9157600080fd5b50610efc600480360360a0811015610ea857600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612f18565b6040518082815260200191505060405180910390f35b348015610f1e57600080fd5b50d38015610f2b57600080fd5b50d28015610f3857600080fd5b50610f6560048036036020811015610f4f57600080fd5b8101908080359060200190929190505050612f34565b6040518082815260200191505060405180910390f35b348015610f8757600080fd5b50d38015610f9457600080fd5b50d28015610fa157600080fd5b5061100260048036036080811015610fb857600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613066565b6040518082815260200191505060405180910390f35b34801561102457600080fd5b50d3801561103157600080fd5b50d2801561103e57600080fd5b506110a16004803603604081101561105557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506130f1565b6040518082815260200191505060405180910390f35b3480156110c357600080fd5b50d380156110d057600080fd5b50d280156110dd57600080fd5b50611148600480360360a08110156110f457600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613178565b6040518082815260200191505060405180910390f35b34801561116a57600080fd5b50d3801561117757600080fd5b50d2801561118457600080fd5b506111ef600480360360a081101561119b57600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061328e565b6040518082815260200191505060405180910390f35b34801561121157600080fd5b50d3801561121e57600080fd5b50d2801561122b57600080fd5b506112b6600480360360c081101561124257600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506132aa565b6040518082815260200191505060405180910390f35b611302600480360360408110156112e257600080fd5b810190808035906020019092919080359060200190929190505050613300565b6040518082815260200191505060405180910390f35b34801561132457600080fd5b50d3801561133157600080fd5b50d2801561133e57600080fd5b506113c9600480360360c081101561135557600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613317565b6040518082815260200191505060405180910390f35b3480156113eb57600080fd5b50d380156113f857600080fd5b50d2801561140557600080fd5b50611490600480360360c081101561141c57600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061342e565b6040518082815260200191505060405180910390f35b3480156114b257600080fd5b50d380156114bf57600080fd5b50d280156114cc57600080fd5b50611517600480360360808110156114e357600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190505050613545565b604051808381526020018281526020019250505060405180910390f35b34801561154057600080fd5b50d3801561154d57600080fd5b50d2801561155a57600080fd5b5061159b6004803603606081101561157157600080fd5b810190808035906020019092919080359060200190929190803590602001909291905050506139b0565b6040518082815260200191505060405180910390f35b60004284101580156115c35750600086115b80156115cf5750600085115b6115d857600080fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561169557600080fd5b505afa1580156116a9573d6000803e3d6000fd5b505050506040513d60208110156116bf57600080fd5b810190808051906020019092919050505090506000611708886117028a3073ffffffffffffffffffffffffffffffffffffffff1631613a4890919063ffffffff16565b846129c8565b90508681101561171757600080fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156117dc57600080fd5b505af11580156117f0573d6000803e3d6000fd5b505050506040513d602081101561180657600080fd5b810190808051906020019092919050505061182057600080fd5b80888673ffffffffffffffffffffffffffffffffffffffff167fcd60aa75dea3072fbc07ae6d7d856b5dc5f4eee88854f5b4abf7b680ef8bc50f60405160405180910390a4809250505095945050505050565b60006118828484843333613ad1565b90509392505050565b60035481565b600061189e338484613df0565b6001905092915050565b60003073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156119135750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61191c57600080fd5b6119298434853386613f4f565b90509392505050565b6000600254905090565b600061194984848461426d565b6119e284336119dd85600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613a4890919063ffffffff16565b613df0565b600190509392505050565b60008082116119fb57600080fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611ab857600080fd5b505afa158015611acc573d6000803e3d6000fd5b505050506040513d6020811015611ae257600080fd5b81019080805190602001909291905050509050611b1783823073ffffffffffffffffffffffffffffffffffffffff16316139b0565b915050919050565b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148015611bcb5750600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b8015611c045750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b611c76576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f494e56414c49445f41444452455353000000000000000000000000000000000081525060200191505060405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f556e6973776170205631000000000000000000000000000000000000000000006001026003819055507f554e492d5631000000000000000000000000000000000000000000000000000060010260048190555060126005819055505050565b60055481565b6000611df93384611df485600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461443790919063ffffffff16565b613df0565b6001905092915050565b60004282118015611e145750600083115b8015611e205750600034115b611e75576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806151e7602e913960400191505060405180910390fd5b6000600254905060008111156122c75760008511611e9257600080fd5b6000611ebe343073ffffffffffffffffffffffffffffffffffffffff1631613a4890919063ffffffff16565b90506000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611f7d57600080fd5b505afa158015611f91573d6000803e3d6000fd5b505050506040513d6020811015611fa757600080fd5b810190808051906020019092919050505090506000611feb600184611fd585346144bf90919063ffffffff16565b81611fdc57fe5b0461443790919063ffffffff16565b905060008361200386346144bf90919063ffffffff16565b8161200a57fe5b04905081881015801561201d5750888110155b61202657600080fd5b612077816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461443790919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506120cc818661443790919063ffffffff16565b600281905550600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156121cb57600080fd5b505af11580156121df573d6000803e3d6000fd5b505050506040513d60208110156121f557600080fd5b810190808051906020019092919050505061220f57600080fd5b81343373ffffffffffffffffffffffffffffffffffffffff167f06239653922ac7bea6aa2b19dc486b9361821d37712eb796adfd38d81de278ca60405160405180910390a43373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3809550505050505061279f565b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141580156123755750600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b80156123845750620f42403410155b6123f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f494e56414c49445f56414c55450000000000000000000000000000000000000081525060200191505060405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306f2bf62600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156124ea57600080fd5b505afa1580156124fe573d6000803e3d6000fd5b505050506040513d602081101561251457600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff161461254557600080fd5b600084905060003073ffffffffffffffffffffffffffffffffffffffff1631905080600281905550806000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156126a957600080fd5b505af11580156126bd573d6000803e3d6000fd5b505050506040513d60208110156126d357600080fd5b81019080805190602001909291905050506126ed57600080fd5b81343373ffffffffffffffffffffffffffffffffffffffff167f06239653922ac7bea6aa2b19dc486b9361821d37712eb796adfd38d81de278ca60405160405180910390a43373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a38093505050505b9392505050565b60008082116127b457600080fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561287157600080fd5b505afa158015612885573d6000803e3d6000fd5b505050506040513d602081101561289b57600080fd5b8101908080519060200190929190505050905060006128d2843073ffffffffffffffffffffffffffffffffffffffff1631846139b0565b90508092505050919050565b60006128ed8334843333613f4f565b905092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60003073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156129a85750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6129b157600080fd5b6129be8585853386614562565b9050949350505050565b600080831180156129d95750600082115b612a4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f494e56414c49445f56414c55450000000000000000000000000000000000000081525060200191505060405180910390fd5b6000612a626103e5866144bf90919063ffffffff16565b90506000612a7984836144bf90919063ffffffff16565b90506000612aa483612a966103e8896144bf90919063ffffffff16565b61443790919063ffffffff16565b9050808281612aaf57fe5b0493505050509392505050565b6000808211612aca57600080fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612b8757600080fd5b505afa158015612b9b573d6000803e3d6000fd5b505050506040513d6020811015612bb157600080fd5b810190808051906020019092919050505090506000612be884833073ffffffffffffffffffffffffffffffffffffffff16316129c8565b90508092505050919050565b60045481565b6000612c098484843333614562565b90509392505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60003073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c7757600080fd5b612c8687878787338888614893565b90509695505050505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000612d573384612d5285600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613a4890919063ffffffff16565b613df0565b6001905092915050565b6000612d6e33848461426d565b6001905092915050565b60003073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015612de35750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b612dec57600080fd5b612df934858533866115b1565b90509392505050565b600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306f2bf62846040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612ec057600080fd5b505afa158015612ed4573d6000803e3d6000fd5b505050506040513d6020811015612eea57600080fd5b81019080805190602001909291905050509050612f0c87878787333387614893565b91505095945050505050565b6000612f2986868686333388614d90565b905095945050505050565b6000808211612f4257600080fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612fff57600080fd5b505afa158015613013573d6000803e3d6000fd5b505050506040513d602081101561302957600080fd5b8101908080519060200190929190505050905061305e833073ffffffffffffffffffffffffffffffffffffffff1631836129c8565b915050919050565b60003073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156130d15750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6130da57600080fd5b6130e78585853386613ad1565b9050949350505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306f2bf62846040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561323657600080fd5b505afa15801561324a573d6000803e3d6000fd5b505050506040513d602081101561326057600080fd5b8101908080519060200190929190505050905061328287878787333387614d90565b91505095945050505050565b600061329f86868686333388614893565b905095945050505050565b60003073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132e557600080fd5b6132f487878787338888614d90565b90509695505050505050565b600061330f34848433336115b1565b905092915050565b600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306f2bf62846040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156133d557600080fd5b505afa1580156133e9573d6000803e3d6000fd5b505050506040513d60208110156133ff57600080fd5b8101908080519060200190929190505050905061342188888888338987614893565b9150509695505050505050565b600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306f2bf62846040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156134ec57600080fd5b505afa158015613500573d6000803e3d6000fd5b505050506040513d602081101561351657600080fd5b8101908080519060200190929190505050905061353888888888338987614d90565b9150509695505050505050565b60008060008611801561355757504283115b80156135635750600085115b801561356f5750600084115b61357857600080fd5b600060025490506000811161358c57600080fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561364957600080fd5b505afa15801561365d573d6000803e3d6000fd5b505050506040513d602081101561367357600080fd5b810190808051906020019092919050505090506000826136b33073ffffffffffffffffffffffffffffffffffffffff16318b6144bf90919063ffffffff16565b816136ba57fe5b0490506000836136d3848c6144bf90919063ffffffff16565b816136da57fe5b0490508882101580156136ed5750878110155b6136f657600080fd5b6137478a6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613a4890919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061379c8a85613a4890919063ffffffff16565b6002819055503373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050501580156137e8573d6000803e3d6000fd5b50600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156138ae57600080fd5b505af11580156138c2573d6000803e3d6000fd5b505050506040513d60208110156138d857600080fd5b81019080805190602001909291905050506138f257600080fd5b80823373ffffffffffffffffffffffffffffffffffffffff167f0fbf06c058b90cb038a618f8c2acbf6145f8b3570fd1fa56abb8f0f3f05b36e860405160405180910390a4600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c6040518082815260200191505060405180910390a38181955095505050505094509492505050565b600080831180156139c15750600082115b6139ca57600080fd5b60006139f36103e86139e587876144bf90919063ffffffff16565b6144bf90919063ffffffff16565b90506000613a1e6103e5613a108887613a4890919063ffffffff16565b6144bf90919063ffffffff16565b9050613a3d6001828481613a2e57fe5b0461443790919063ffffffff16565b925050509392505050565b600082821115613ac0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f536166654d617468237375623a20554e444552464c4f5700000000000000000081525060200191505060405180910390fd5b600082840390508091505092915050565b6000428410158015613ae35750600086115b613aec57600080fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015613ba957600080fd5b505afa158015613bbd573d6000803e3d6000fd5b505050506040513d6020811015613bd357600080fd5b810190808051906020019092919050505090506000613c0a88833073ffffffffffffffffffffffffffffffffffffffff16316139b0565b905080871015613c1957600080fd5b8373ffffffffffffffffffffffffffffffffffffffff166108fc899081150290604051600060405180830381858888f19350505050158015613c5f573d6000803e3d6000fd5b50600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8630846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015613d5957600080fd5b505af1158015613d6d573d6000803e3d6000fd5b505050506040513d6020811015613d8357600080fd5b8101908080519060200190929190505050613d9d57600080fd5b87818673ffffffffffffffffffffffffffffffffffffffff167f7f4091b46c33e918a0f3aa42307641d17bb67029427a5369e54b35398423870560405160405180910390a4809250505095945050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613e2a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613e6457600080fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b6000428410158015613f615750600086115b8015613f6d5750600085115b613f7657600080fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561403357600080fd5b505afa158015614047573d6000803e3d6000fd5b505050506040513d602081101561405d57600080fd5b8101908080519060200190929190505050905060006140a6886140a0893073ffffffffffffffffffffffffffffffffffffffff1631613a4890919063ffffffff16565b846139b0565b905060006140bd8289613a4890919063ffffffff16565b90506000811115614110578573ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561410e573d6000803e3d6000fd5b505b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb868b6040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156141d557600080fd5b505af11580156141e9573d6000803e3d6000fd5b505050506040513d60208110156141ff57600080fd5b810190808051906020019092919050505061421957600080fd5b88828773ffffffffffffffffffffffffffffffffffffffff167fcd60aa75dea3072fbc07ae6d7d856b5dc5f4eee88854f5b4abf7b680ef8bc50f60405160405180910390a481935050505095945050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156142a757600080fd5b6142f8816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613a4890919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061438b816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461443790919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000808284019050838110156144b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f536166654d617468236164643a204f564552464c4f570000000000000000000081525060200191505060405180910390fd5b8091505092915050565b6000808314156144d2576000905061455c565b60008284029050828482816144e357fe5b0414614557576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f536166654d617468236d756c3a204f564552464c4f570000000000000000000081525060200191505060405180910390fd5b809150505b92915050565b60004284101580156145745750600086115b80156145805750600085115b61458957600080fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561464657600080fd5b505afa15801561465a573d6000803e3d6000fd5b505050506040513d602081101561467057600080fd5b8101908080519060200190929190505050905060006146a788833073ffffffffffffffffffffffffffffffffffffffff16316129c8565b90506000819050878110156146bb57600080fd5b8473ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015614701573d6000803e3d6000fd5b50600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd87308c6040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156147fb57600080fd5b505af115801561480f573d6000803e3d6000fd5b505050506040513d602081101561482557600080fd5b810190808051906020019092919050505061483f57600080fd5b80898773ffffffffffffffffffffffffffffffffffffffff167f7f4091b46c33e918a0f3aa42307641d17bb67029427a5369e54b35398423870560405160405180910390a480935050505095945050505050565b60004285101580156148b157506000881180156148b05750600086115b5b6148ba57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156149235750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61492c57600080fd5b60008273ffffffffffffffffffffffffffffffffffffffff166359e948628a6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060206040518083038186803b15801561499b57600080fd5b505afa1580156149af573d6000803e3d6000fd5b505050506040513d60208110156149c557600080fd5b810190808051906020019092919050505090506000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015614a9557600080fd5b505afa158015614aa9573d6000803e3d6000fd5b505050506040513d6020811015614abf57600080fd5b810190808051906020019092919050505090506000614af683833073ffffffffffffffffffffffffffffffffffffffff16316139b0565b9050808a10158015614b085750828910155b614b1157600080fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8830846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015614c0a57600080fd5b505af1158015614c1e573d6000803e3d6000fd5b505050506040513d6020811015614c3457600080fd5b8101908080519060200190929190505050614c4e57600080fd5b60008573ffffffffffffffffffffffffffffffffffffffff16630b573638858e8c8b6040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200193505050506020604051808303818588803b158015614cfb57600080fd5b505af1158015614d0f573d6000803e3d6000fd5b50505050506040513d6020811015614d2657600080fd5b8101908080519060200190929190505050905083828973ffffffffffffffffffffffffffffffffffffffff167f7f4091b46c33e918a0f3aa42307641d17bb67029427a5369e54b35398423870560405160405180910390a481945050505050979650505050505050565b6000428510158015614da25750600088115b8015614dae5750600087115b8015614dba5750600086115b614dc357600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015614e2c5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b614e3557600080fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015614ef257600080fd5b505afa158015614f06573d6000803e3d6000fd5b505050506040513d6020811015614f1c57600080fd5b810190808051906020019092919050505090506000614f538a833073ffffffffffffffffffffffffffffffffffffffff16316129c8565b9050600081905088811015614f6757600080fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd88308e6040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561506057600080fd5b505af1158015615074573d6000803e3d6000fd5b505050506040513d602081101561508a57600080fd5b81019080805190602001909291905050506150a457600080fd5b60008573ffffffffffffffffffffffffffffffffffffffff1663ad65d76d838d8c8b6040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200193505050506020604051808303818588803b15801561515157600080fd5b505af1158015615165573d6000803e3d6000fd5b50505050506040513d602081101561517c57600080fd5b81019080805190602001909291905050509050818c8973ffffffffffffffffffffffffffffffffffffffff167f7f4091b46c33e918a0f3aa42307641d17bb67029427a5369e54b35398423870560405160405180910390a48094505050505097965050505050505056fe556e697377617045786368616e6765236164644c69717569646974793a20494e56414c49445f415247554d454e54a165627a7a7230582097daed3603c7d4ee87fe83c836547fdec27577fccad9e7294eb6a99aae2e05740029a165627a7a72305820b9e9769a4685f2d54513be262013f145bfda04e77a4bae3a2e453552c021661e0029",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50d3801561001d57600080fd5b50d2801561002a57600080fd5b50600436106100bf576000357c010000000000000000000000000000000000000000000000000000000090048063538a3f0e11610092578063538a3f0e146102ba57806359770438146102fe5780639f181b5e14610382578063aa65a6c0146103a0576100bf565b806306f2bf62146100c457806315e7dc86146101485780631648f38e146101ec5780631c2bbd1814610270575b600080fd5b610106600480360360208110156100da57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061040e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101aa6004803603604081101561015e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610477565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61022e6004803603602081101561020257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610849565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610278610c4d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102fc600480360360208110156102d057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c72565b005b6103406004803603602081101561031457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d49565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61038a610db2565b6040518082815260200191505060405180910390f35b6103cc600480360360208110156103b657600080fd5b8101908080359060200190929190505050610db8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156104b257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461054a57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1663966dae0e6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156105c357600080fd5b505afa1580156105d7573d6000803e3d6000fd5b505050506040513d60208110156105ed57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614610687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f65786368616e67652e666163746f727920646f6573206e6f74206d617463680081525060200191505060405180910390fd5b82600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006001805401905080600181905550826004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f9d42cb017eb05bd8944ab536a8b35bc68085931dd5f4356489801453923953f960405160405180910390a38391505092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561088457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156108df57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461097757600080fd5b600060405161098590610df5565b604051809103906000f0801580156109a1573d6000803e3d6000fd5b5090508073ffffffffffffffffffffffffffffffffffffffff16632d34ba7984306040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b158015610a7357600080fd5b505af1158015610a87573d6000803e3d6000fd5b5050505080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006001805401905080600181905550836004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f9d42cb017eb05bd8944ab536a8b35bc68085931dd5f4356489801453923953f960405160405180910390a38192505050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ccc57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d0657600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60015481565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61527e80610e038339019056fe60806040523480156200001157600080fd5b50d380156200001f57600080fd5b50d280156200002d57600080fd5b50615240806200003e6000396000f3fe608060405260043610610242576000357c010000000000000000000000000000000000000000000000000000000090048063966dae0e11610140578063d4e4841d116100c8578063f39b5b9b1161008c578063f39b5b9b146112cc578063f3c0efe914611318578063f552d91b146113df578063f88bf15a146114a6578063fd11c2231461153457610242565b8063d4e4841d14610f7b578063dd62ed3e14611018578063ddf7e1a7146110b7578063ea650c7d1461115e578063ec384a3e1461120557610242565b8063a9059cbb1161010f578063a9059cbb14610ccb578063ad65d76d14610d58578063b040d54514610dc4578063b1cb43bf14610e6b578063cd7724c314610f1257610242565b8063966dae0e14610a95578063981a132714610b065780639d76ea5814610bcd578063a457c2d714610c3e57610242565b806339509351116101ce5780637237e031116101925780637237e0311461085057806389f2a871146108ed57806395b68fe71461096a57806395d89b41146109d357806395e3c50b14610a1857610242565b80633950935114610639578063422f1043146106c657806359e948621461071c5780636b1d4db71461078557806370a08231146107d157610242565b806318160ddd1161021557806318160ddd1461040e57806323b872dd146104535780632640f62c146105005780632d34ba7914610569578063313ce567146105f457610242565b8063013efd8b1461025357806306fdde03146102d0578063095ea7b3146103155780630b573638146103a2575b6102503460014233336115b1565b50005b34801561025f57600080fd5b50d3801561026c57600080fd5b50d2801561027957600080fd5b506102ba6004803603606081101561029057600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050611873565b6040518082815260200191505060405180910390f35b3480156102dc57600080fd5b50d380156102e957600080fd5b50d280156102f657600080fd5b506102ff61188b565b6040518082815260200191505060405180910390f35b34801561032157600080fd5b50d3801561032e57600080fd5b50d2801561033b57600080fd5b506103886004803603604081101561035257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611891565b604051808215151515815260200191505060405180910390f35b6103f8600480360360608110156103b857600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506118a8565b6040518082815260200191505060405180910390f35b34801561041a57600080fd5b50d3801561042757600080fd5b50d2801561043457600080fd5b5061043d611932565b6040518082815260200191505060405180910390f35b34801561045f57600080fd5b50d3801561046c57600080fd5b50d2801561047957600080fd5b506104e66004803603606081101561049057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061193c565b604051808215151515815260200191505060405180910390f35b34801561050c57600080fd5b50d3801561051957600080fd5b50d2801561052657600080fd5b506105536004803603602081101561053d57600080fd5b81019080803590602001909291905050506119ed565b6040518082815260200191505060405180910390f35b34801561057557600080fd5b50d3801561058257600080fd5b50d2801561058f57600080fd5b506105f2600480360360408110156105a657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b1f565b005b34801561060057600080fd5b50d3801561060d57600080fd5b50d2801561061a57600080fd5b50610623611d58565b6040518082815260200191505060405180910390f35b34801561064557600080fd5b50d3801561065257600080fd5b50d2801561065f57600080fd5b506106ac6004803603604081101561067657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611d5e565b604051808215151515815260200191505060405180910390f35b610706600480360360608110156106dc57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050611e03565b6040518082815260200191505060405180910390f35b34801561072857600080fd5b50d3801561073557600080fd5b50d2801561074257600080fd5b5061076f6004803603602081101561075957600080fd5b81019080803590602001909291905050506127a6565b6040518082815260200191505060405180910390f35b6107bb6004803603604081101561079b57600080fd5b8101908080359060200190929190803590602001909291905050506128de565b6040518082815260200191505060405180910390f35b3480156107dd57600080fd5b50d380156107ea57600080fd5b50d280156107f757600080fd5b5061083a6004803603602081101561080e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128f5565b6040518082815260200191505060405180910390f35b34801561085c57600080fd5b50d3801561086957600080fd5b50d2801561087657600080fd5b506108d76004803603608081101561088d57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061293d565b6040518082815260200191505060405180910390f35b3480156108f957600080fd5b50d3801561090657600080fd5b50d2801561091357600080fd5b506109546004803603606081101561092a57600080fd5b810190808035906020019092919080359060200190929190803590602001909291905050506129c8565b6040518082815260200191505060405180910390f35b34801561097657600080fd5b50d3801561098357600080fd5b50d2801561099057600080fd5b506109bd600480360360208110156109a757600080fd5b8101908080359060200190929190505050612abc565b6040518082815260200191505060405180910390f35b3480156109df57600080fd5b50d380156109ec57600080fd5b50d280156109f957600080fd5b50610a02612bf4565b6040518082815260200191505060405180910390f35b348015610a2457600080fd5b50d38015610a3157600080fd5b50d28015610a3e57600080fd5b50610a7f60048036036060811015610a5557600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050612bfa565b6040518082815260200191505060405180910390f35b348015610aa157600080fd5b50d38015610aae57600080fd5b50d28015610abb57600080fd5b50610ac4612c12565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b1257600080fd5b50d38015610b1f57600080fd5b50d28015610b2c57600080fd5b50610bb7600480360360c0811015610b4357600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c3c565b6040518082815260200191505060405180910390f35b348015610bd957600080fd5b50d38015610be657600080fd5b50d28015610bf357600080fd5b50610bfc612c92565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610c4a57600080fd5b50d38015610c5757600080fd5b50d28015610c6457600080fd5b50610cb160048036036040811015610c7b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612cbc565b604051808215151515815260200191505060405180910390f35b348015610cd757600080fd5b50d38015610ce457600080fd5b50d28015610cf157600080fd5b50610d3e60048036036040811015610d0857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612d61565b604051808215151515815260200191505060405180910390f35b610dae60048036036060811015610d6e57600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d78565b6040518082815260200191505060405180910390f35b348015610dd057600080fd5b50d38015610ddd57600080fd5b50d28015610dea57600080fd5b50610e55600480360360a0811015610e0157600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612e02565b6040518082815260200191505060405180910390f35b348015610e7757600080fd5b50d38015610e8457600080fd5b50d28015610e9157600080fd5b50610efc600480360360a0811015610ea857600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612f18565b6040518082815260200191505060405180910390f35b348015610f1e57600080fd5b50d38015610f2b57600080fd5b50d28015610f3857600080fd5b50610f6560048036036020811015610f4f57600080fd5b8101908080359060200190929190505050612f34565b6040518082815260200191505060405180910390f35b348015610f8757600080fd5b50d38015610f9457600080fd5b50d28015610fa157600080fd5b5061100260048036036080811015610fb857600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613066565b6040518082815260200191505060405180910390f35b34801561102457600080fd5b50d3801561103157600080fd5b50d2801561103e57600080fd5b506110a16004803603604081101561105557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506130f1565b6040518082815260200191505060405180910390f35b3480156110c357600080fd5b50d380156110d057600080fd5b50d280156110dd57600080fd5b50611148600480360360a08110156110f457600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613178565b6040518082815260200191505060405180910390f35b34801561116a57600080fd5b50d3801561117757600080fd5b50d2801561118457600080fd5b506111ef600480360360a081101561119b57600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061328e565b6040518082815260200191505060405180910390f35b34801561121157600080fd5b50d3801561121e57600080fd5b50d2801561122b57600080fd5b506112b6600480360360c081101561124257600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506132aa565b6040518082815260200191505060405180910390f35b611302600480360360408110156112e257600080fd5b810190808035906020019092919080359060200190929190505050613300565b6040518082815260200191505060405180910390f35b34801561132457600080fd5b50d3801561133157600080fd5b50d2801561133e57600080fd5b506113c9600480360360c081101561135557600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613317565b6040518082815260200191505060405180910390f35b3480156113eb57600080fd5b50d380156113f857600080fd5b50d2801561140557600080fd5b50611490600480360360c081101561141c57600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061342e565b6040518082815260200191505060405180910390f35b3480156114b257600080fd5b50d380156114bf57600080fd5b50d280156114cc57600080fd5b50611517600480360360808110156114e357600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190505050613545565b604051808381526020018281526020019250505060405180910390f35b34801561154057600080fd5b50d3801561154d57600080fd5b50d2801561155a57600080fd5b5061159b6004803603606081101561157157600080fd5b810190808035906020019092919080359060200190929190803590602001909291905050506139b0565b6040518082815260200191505060405180910390f35b60004284101580156115c35750600086115b80156115cf5750600085115b6115d857600080fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561169557600080fd5b505afa1580156116a9573d6000803e3d6000fd5b505050506040513d60208110156116bf57600080fd5b810190808051906020019092919050505090506000611708886117028a3073ffffffffffffffffffffffffffffffffffffffff1631613a4890919063ffffffff16565b846129c8565b90508681101561171757600080fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156117dc57600080fd5b505af11580156117f0573d6000803e3d6000fd5b505050506040513d602081101561180657600080fd5b810190808051906020019092919050505061182057600080fd5b80888673ffffffffffffffffffffffffffffffffffffffff167fcd60aa75dea3072fbc07ae6d7d856b5dc5f4eee88854f5b4abf7b680ef8bc50f60405160405180910390a4809250505095945050505050565b60006118828484843333613ad1565b90509392505050565b60035481565b600061189e338484613df0565b6001905092915050565b60003073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156119135750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61191c57600080fd5b6119298434853386613f4f565b90509392505050565b6000600254905090565b600061194984848461426d565b6119e284336119dd85600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613a4890919063ffffffff16565b613df0565b600190509392505050565b60008082116119fb57600080fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611ab857600080fd5b505afa158015611acc573d6000803e3d6000fd5b505050506040513d6020811015611ae257600080fd5b81019080805190602001909291905050509050611b1783823073ffffffffffffffffffffffffffffffffffffffff16316139b0565b915050919050565b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148015611bcb5750600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b8015611c045750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b611c76576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f494e56414c49445f41444452455353000000000000000000000000000000000081525060200191505060405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f556e6973776170205631000000000000000000000000000000000000000000006001026003819055507f554e492d5631000000000000000000000000000000000000000000000000000060010260048190555060126005819055505050565b60055481565b6000611df93384611df485600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461443790919063ffffffff16565b613df0565b6001905092915050565b60004282118015611e145750600083115b8015611e205750600034115b611e75576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806151e7602e913960400191505060405180910390fd5b6000600254905060008111156122c75760008511611e9257600080fd5b6000611ebe343073ffffffffffffffffffffffffffffffffffffffff1631613a4890919063ffffffff16565b90506000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611f7d57600080fd5b505afa158015611f91573d6000803e3d6000fd5b505050506040513d6020811015611fa757600080fd5b810190808051906020019092919050505090506000611feb600184611fd585346144bf90919063ffffffff16565b81611fdc57fe5b0461443790919063ffffffff16565b905060008361200386346144bf90919063ffffffff16565b8161200a57fe5b04905081881015801561201d5750888110155b61202657600080fd5b612077816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461443790919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506120cc818661443790919063ffffffff16565b600281905550600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156121cb57600080fd5b505af11580156121df573d6000803e3d6000fd5b505050506040513d60208110156121f557600080fd5b810190808051906020019092919050505061220f57600080fd5b81343373ffffffffffffffffffffffffffffffffffffffff167f06239653922ac7bea6aa2b19dc486b9361821d37712eb796adfd38d81de278ca60405160405180910390a43373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3809550505050505061279f565b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141580156123755750600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b80156123845750620f42403410155b6123f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f494e56414c49445f56414c55450000000000000000000000000000000000000081525060200191505060405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306f2bf62600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156124ea57600080fd5b505afa1580156124fe573d6000803e3d6000fd5b505050506040513d602081101561251457600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff161461254557600080fd5b600084905060003073ffffffffffffffffffffffffffffffffffffffff1631905080600281905550806000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156126a957600080fd5b505af11580156126bd573d6000803e3d6000fd5b505050506040513d60208110156126d357600080fd5b81019080805190602001909291905050506126ed57600080fd5b81343373ffffffffffffffffffffffffffffffffffffffff167f06239653922ac7bea6aa2b19dc486b9361821d37712eb796adfd38d81de278ca60405160405180910390a43373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a38093505050505b9392505050565b60008082116127b457600080fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561287157600080fd5b505afa158015612885573d6000803e3d6000fd5b505050506040513d602081101561289b57600080fd5b8101908080519060200190929190505050905060006128d2843073ffffffffffffffffffffffffffffffffffffffff1631846139b0565b90508092505050919050565b60006128ed8334843333613f4f565b905092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60003073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156129a85750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6129b157600080fd5b6129be8585853386614562565b9050949350505050565b600080831180156129d95750600082115b612a4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f494e56414c49445f56414c55450000000000000000000000000000000000000081525060200191505060405180910390fd5b6000612a626103e5866144bf90919063ffffffff16565b90506000612a7984836144bf90919063ffffffff16565b90506000612aa483612a966103e8896144bf90919063ffffffff16565b61443790919063ffffffff16565b9050808281612aaf57fe5b0493505050509392505050565b6000808211612aca57600080fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612b8757600080fd5b505afa158015612b9b573d6000803e3d6000fd5b505050506040513d6020811015612bb157600080fd5b810190808051906020019092919050505090506000612be884833073ffffffffffffffffffffffffffffffffffffffff16316129c8565b90508092505050919050565b60045481565b6000612c098484843333614562565b90509392505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60003073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c7757600080fd5b612c8687878787338888614893565b90509695505050505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000612d573384612d5285600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613a4890919063ffffffff16565b613df0565b6001905092915050565b6000612d6e33848461426d565b6001905092915050565b60003073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015612de35750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b612dec57600080fd5b612df934858533866115b1565b90509392505050565b600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306f2bf62846040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612ec057600080fd5b505afa158015612ed4573d6000803e3d6000fd5b505050506040513d6020811015612eea57600080fd5b81019080805190602001909291905050509050612f0c87878787333387614893565b91505095945050505050565b6000612f2986868686333388614d90565b905095945050505050565b6000808211612f4257600080fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612fff57600080fd5b505afa158015613013573d6000803e3d6000fd5b505050506040513d602081101561302957600080fd5b8101908080519060200190929190505050905061305e833073ffffffffffffffffffffffffffffffffffffffff1631836129c8565b915050919050565b60003073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156130d15750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6130da57600080fd5b6130e78585853386613ad1565b9050949350505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306f2bf62846040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561323657600080fd5b505afa15801561324a573d6000803e3d6000fd5b505050506040513d602081101561326057600080fd5b8101908080519060200190929190505050905061328287878787333387614d90565b91505095945050505050565b600061329f86868686333388614893565b905095945050505050565b60003073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132e557600080fd5b6132f487878787338888614d90565b90509695505050505050565b600061330f34848433336115b1565b905092915050565b600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306f2bf62846040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156133d557600080fd5b505afa1580156133e9573d6000803e3d6000fd5b505050506040513d60208110156133ff57600080fd5b8101908080519060200190929190505050905061342188888888338987614893565b9150509695505050505050565b600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306f2bf62846040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156134ec57600080fd5b505afa158015613500573d6000803e3d6000fd5b505050506040513d602081101561351657600080fd5b8101908080519060200190929190505050905061353888888888338987614d90565b9150509695505050505050565b60008060008611801561355757504283115b80156135635750600085115b801561356f5750600084115b61357857600080fd5b600060025490506000811161358c57600080fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561364957600080fd5b505afa15801561365d573d6000803e3d6000fd5b505050506040513d602081101561367357600080fd5b810190808051906020019092919050505090506000826136b33073ffffffffffffffffffffffffffffffffffffffff16318b6144bf90919063ffffffff16565b816136ba57fe5b0490506000836136d3848c6144bf90919063ffffffff16565b816136da57fe5b0490508882101580156136ed5750878110155b6136f657600080fd5b6137478a6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613a4890919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061379c8a85613a4890919063ffffffff16565b6002819055503373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050501580156137e8573d6000803e3d6000fd5b50600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156138ae57600080fd5b505af11580156138c2573d6000803e3d6000fd5b505050506040513d60208110156138d857600080fd5b81019080805190602001909291905050506138f257600080fd5b80823373ffffffffffffffffffffffffffffffffffffffff167f0fbf06c058b90cb038a618f8c2acbf6145f8b3570fd1fa56abb8f0f3f05b36e860405160405180910390a4600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c6040518082815260200191505060405180910390a38181955095505050505094509492505050565b600080831180156139c15750600082115b6139ca57600080fd5b60006139f36103e86139e587876144bf90919063ffffffff16565b6144bf90919063ffffffff16565b90506000613a1e6103e5613a108887613a4890919063ffffffff16565b6144bf90919063ffffffff16565b9050613a3d6001828481613a2e57fe5b0461443790919063ffffffff16565b925050509392505050565b600082821115613ac0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f536166654d617468237375623a20554e444552464c4f5700000000000000000081525060200191505060405180910390fd5b600082840390508091505092915050565b6000428410158015613ae35750600086115b613aec57600080fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015613ba957600080fd5b505afa158015613bbd573d6000803e3d6000fd5b505050506040513d6020811015613bd357600080fd5b810190808051906020019092919050505090506000613c0a88833073ffffffffffffffffffffffffffffffffffffffff16316139b0565b905080871015613c1957600080fd5b8373ffffffffffffffffffffffffffffffffffffffff166108fc899081150290604051600060405180830381858888f19350505050158015613c5f573d6000803e3d6000fd5b50600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8630846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015613d5957600080fd5b505af1158015613d6d573d6000803e3d6000fd5b505050506040513d6020811015613d8357600080fd5b8101908080519060200190929190505050613d9d57600080fd5b87818673ffffffffffffffffffffffffffffffffffffffff167f7f4091b46c33e918a0f3aa42307641d17bb67029427a5369e54b35398423870560405160405180910390a4809250505095945050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613e2a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613e6457600080fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b6000428410158015613f615750600086115b8015613f6d5750600085115b613f7657600080fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561403357600080fd5b505afa158015614047573d6000803e3d6000fd5b505050506040513d602081101561405d57600080fd5b8101908080519060200190929190505050905060006140a6886140a0893073ffffffffffffffffffffffffffffffffffffffff1631613a4890919063ffffffff16565b846139b0565b905060006140bd8289613a4890919063ffffffff16565b90506000811115614110578573ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561410e573d6000803e3d6000fd5b505b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb868b6040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156141d557600080fd5b505af11580156141e9573d6000803e3d6000fd5b505050506040513d60208110156141ff57600080fd5b810190808051906020019092919050505061421957600080fd5b88828773ffffffffffffffffffffffffffffffffffffffff167fcd60aa75dea3072fbc07ae6d7d856b5dc5f4eee88854f5b4abf7b680ef8bc50f60405160405180910390a481935050505095945050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156142a757600080fd5b6142f8816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613a4890919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061438b816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461443790919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000808284019050838110156144b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f536166654d617468236164643a204f564552464c4f570000000000000000000081525060200191505060405180910390fd5b8091505092915050565b6000808314156144d2576000905061455c565b60008284029050828482816144e357fe5b0414614557576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f536166654d617468236d756c3a204f564552464c4f570000000000000000000081525060200191505060405180910390fd5b809150505b92915050565b60004284101580156145745750600086115b80156145805750600085115b61458957600080fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561464657600080fd5b505afa15801561465a573d6000803e3d6000fd5b505050506040513d602081101561467057600080fd5b8101908080519060200190929190505050905060006146a788833073ffffffffffffffffffffffffffffffffffffffff16316129c8565b90506000819050878110156146bb57600080fd5b8473ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015614701573d6000803e3d6000fd5b50600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd87308c6040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156147fb57600080fd5b505af115801561480f573d6000803e3d6000fd5b505050506040513d602081101561482557600080fd5b810190808051906020019092919050505061483f57600080fd5b80898773ffffffffffffffffffffffffffffffffffffffff167f7f4091b46c33e918a0f3aa42307641d17bb67029427a5369e54b35398423870560405160405180910390a480935050505095945050505050565b60004285101580156148b157506000881180156148b05750600086115b5b6148ba57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156149235750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61492c57600080fd5b60008273ffffffffffffffffffffffffffffffffffffffff166359e948628a6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060206040518083038186803b15801561499b57600080fd5b505afa1580156149af573d6000803e3d6000fd5b505050506040513d60208110156149c557600080fd5b810190808051906020019092919050505090506000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015614a9557600080fd5b505afa158015614aa9573d6000803e3d6000fd5b505050506040513d6020811015614abf57600080fd5b810190808051906020019092919050505090506000614af683833073ffffffffffffffffffffffffffffffffffffffff16316139b0565b9050808a10158015614b085750828910155b614b1157600080fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8830846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015614c0a57600080fd5b505af1158015614c1e573d6000803e3d6000fd5b505050506040513d6020811015614c3457600080fd5b8101908080519060200190929190505050614c4e57600080fd5b60008573ffffffffffffffffffffffffffffffffffffffff16630b573638858e8c8b6040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200193505050506020604051808303818588803b158015614cfb57600080fd5b505af1158015614d0f573d6000803e3d6000fd5b50505050506040513d6020811015614d2657600080fd5b8101908080519060200190929190505050905083828973ffffffffffffffffffffffffffffffffffffffff167f7f4091b46c33e918a0f3aa42307641d17bb67029427a5369e54b35398423870560405160405180910390a481945050505050979650505050505050565b6000428510158015614da25750600088115b8015614dae5750600087115b8015614dba5750600086115b614dc357600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015614e2c5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b614e3557600080fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015614ef257600080fd5b505afa158015614f06573d6000803e3d6000fd5b505050506040513d6020811015614f1c57600080fd5b810190808051906020019092919050505090506000614f538a833073ffffffffffffffffffffffffffffffffffffffff16316129c8565b9050600081905088811015614f6757600080fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd88308e6040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561506057600080fd5b505af1158015615074573d6000803e3d6000fd5b505050506040513d602081101561508a57600080fd5b81019080805190602001909291905050506150a457600080fd5b60008573ffffffffffffffffffffffffffffffffffffffff1663ad65d76d838d8c8b6040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200193505050506020604051808303818588803b15801561515157600080fd5b505af1158015615165573d6000803e3d6000fd5b50505050506040513d602081101561517c57600080fd5b81019080805190602001909291905050509050818c8973ffffffffffffffffffffffffffffffffffffffff167f7f4091b46c33e918a0f3aa42307641d17bb67029427a5369e54b35398423870560405160405180910390a48094505050505097965050505050505056fe556e697377617045786368616e6765236164644c69717569646974793a20494e56414c49445f415247554d454e54a165627a7a7230582097daed3603c7d4ee87fe83c836547fdec27577fccad9e7294eb6a99aae2e05740029a165627a7a72305820b9e9769a4685f2d54513be262013f145bfda04e77a4bae3a2e453552c021661e0029",
  "sourceMap": "104:2436:11:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;104:2436:11;;8:9:-1;5:2;;;30:1;27;20:12;5:2;104:2436:11;;8:9:-1;5:2;;;30:1;27;20:12;5:2;104:2436:11;;;;;;;",
  "deployedSourceMap": "104:2436:11:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;104:2436:11;;8:9:-1;5:2;;;30:1;27;20:12;5:2;104:2436:11;;8:9:-1;5:2;;;30:1;27;20:12;5:2;104:2436:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2199:108;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2199:108:11;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1502:572;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1502:572:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;878:576;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;878:576:11;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;325:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;682:192;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;682:192:11;;;;;;;;;;;;;;;;;;;:::i;:::-;;2311:111;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2311:111:11;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;360:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2426:111;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2426:111:11;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;2199:108;2256:7;2278:17;:24;2296:5;2278:24;;;;;;;;;;;;;;;;;;;;;;;;;2271:31;;2199:108;;;:::o;1502:572::-;1585:7;1625:1;1608:19;;:5;:19;;;;1600:28;;;;;;1678:1;1642:38;;:17;:24;1660:5;1642:24;;;;;;;;;;;;;;;;;;;;;;;;;:38;;;1634:47;;;;;;1749:4;1695:59;;1711:8;1695:40;;;:42;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1695:42:11;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1695:42:11;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1695:42:11;;;;;;;;;;;;;;;;:59;;;1687:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1831:8;1796:17;:24;1814:5;1796:24;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;1885:5;1846:17;:36;1872:8;1846:36;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;1896:16;1928:1;1915:10;;:14;1896:33;;1948:8;1935:10;:21;;;;1986:5;1962:11;:21;1974:8;1962:21;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;2029:8;2002:37;;2014:5;2002:37;;;;;;;;;;;;2060:8;2045:24;;;1502:572;;;;:::o;878:576::-;933:7;973:1;956:19;;:5;:19;;;;948:28;;;;;;1018:1;990:30;;:16;;;;;;;;;;;:30;;;;982:39;;;;;;1071:1;1035:38;;:17;:24;1053:5;1035:24;;;;;;;;;;;;;;;;;;;;;;;;;:38;;;1027:47;;;;;;1080:24;1107:21;;;;;:::i;:::-;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1107:21:11;1080:48;;1134:8;:14;;;1149:5;1164:4;1134:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1134:36:11;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1134:36:11;;;;1211:8;1176:17;:24;1194:5;1176:24;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;1265:5;1226:17;:36;1252:8;1226:36;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;1276:16;1308:1;1295:10;;:14;1276:33;;1328:8;1315:10;:21;;;;1366:5;1342:11;:21;1354:8;1342:21;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;1409:8;1382:37;;1394:5;1382:37;;;;;;;;;;;;1440:8;1425:24;;;;878:576;;;:::o;325:31::-;;;;;;;;;;;;;:::o;682:192::-;776:1;748:30;;:16;;;;;;;;;;;:30;;;740:39;;;;;;833:1;813:22;;:8;:22;;;;805:31;;;;;;861:8;842:16;;:27;;;;;;;;;;;;;;;;;;682:192;:::o;2311:111::-;2368:7;2390:17;:27;2408:8;2390:27;;;;;;;;;;;;;;;;;;;;;;;;;2383:34;;2311:111;;;:::o;360:25::-;;;;:::o;2426:111::-;2489:7;2511:11;:21;2523:8;2511:21;;;;;;;;;;;;;;;;;;;;;2504:28;;2426:111;;;:::o;104:2436::-;;;;;;;;:::o",
  "source": "pragma solidity ^0.5.0;\n\nimport \"./UniswapExchange.sol\";\nimport \"../interfaces/IUniswapExchange.sol\";\n\n\ncontract UniswapFactory {\n\n  /***********************************|\n  |       Events And Variables        |\n  |__________________________________*/\n\n  event NewExchange(address indexed token, address indexed exchange);\n\n  address public exchangeTemplate;\n  uint256 public tokenCount;\n  mapping (address => address) internal token_to_exchange;\n  mapping (address => address) internal exchange_to_token;\n  mapping (uint256 => address) internal id_to_token;\n\n  /***********************************|\n  |         Factory Functions         |\n  |__________________________________*/\n\n  function initializeFactory(address template) public {\n    require(exchangeTemplate == address(0));                    \n    require(template != address(0));\n    exchangeTemplate = template;\n  }\n\n  function createExchange(address token) public returns (address) {\n    require(token != address(0));\n    require(exchangeTemplate != address(0));\n    require(token_to_exchange[token] == address(0));\n    UniswapExchange exchange = new UniswapExchange();\n    exchange.setup(token, address(this));\n    token_to_exchange[token] = address(exchange);\n    exchange_to_token[address(exchange)] = token;\n    uint256 token_id = tokenCount + 1;\n    tokenCount = token_id;\n    id_to_token[token_id] = token;\n    emit NewExchange(token, address(exchange));\n    return address(exchange);\n  }\n\n  // TODO: get token directly from exchange\n  function registerExchange(address payable exchange, address token) public returns (address) {\n    require(token != address(0));\n    require(token_to_exchange[token] == address(0));\n    require(UniswapExchange(exchange).factoryAddress() == address(this), \"exchange.factory does not match\");\n    token_to_exchange[token] = address(exchange);\n    exchange_to_token[address(exchange)] = token;\n    uint256 token_id = tokenCount + 1;\n    tokenCount = token_id;\n    id_to_token[token_id] = token;\n    emit NewExchange(token, address(exchange));\n    return address(exchange);\n  }\n\n  /***********************************|\n  |         Getter Functions          |\n  |__________________________________*/\n\n  function getExchange(address token) public view returns (address) {\n    return token_to_exchange[token];\n  }\n\n  function getToken(address exchange) public view returns (address) {\n    return exchange_to_token[exchange];\n  }\n\n  function getTokenWithId(uint256 token_id) public view returns (address) {\n    return id_to_token[token_id];\n  }\n\n}\n\n",
  "sourcePath": "/home/binyu/Desktop/Synthetix/prod/swap-solidity/contracts/uniswap/UniswapFactory.sol",
  "ast": {
    "absolutePath": "/home/binyu/Desktop/Synthetix/prod/swap-solidity/contracts/uniswap/UniswapFactory.sol",
    "exportedSymbols": {
      "UniswapFactory": [
        5760
      ]
    },
    "id": 5761,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 5497,
        "literals": [
          "solidity",
          "^",
          "0.5",
          ".0"
        ],
        "nodeType": "PragmaDirective",
        "src": "0:23:11"
      },
      {
        "absolutePath": "/home/binyu/Desktop/Synthetix/prod/swap-solidity/contracts/uniswap/UniswapExchange.sol",
        "file": "./UniswapExchange.sol",
        "id": 5498,
        "nodeType": "ImportDirective",
        "scope": 5761,
        "sourceUnit": 5496,
        "src": "25:31:11",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "/home/binyu/Desktop/Synthetix/prod/swap-solidity/contracts/interfaces/IUniswapExchange.sol",
        "file": "../interfaces/IUniswapExchange.sol",
        "id": 5499,
        "nodeType": "ImportDirective",
        "scope": 5761,
        "sourceUnit": 409,
        "src": "57:44:11",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "baseContracts": [],
        "contractDependencies": [
          5495
        ],
        "contractKind": "contract",
        "documentation": null,
        "fullyImplemented": true,
        "id": 5760,
        "linearizedBaseContracts": [
          5760
        ],
        "name": "UniswapFactory",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "anonymous": false,
            "documentation": "*********************************|\n|       Events And Variables        |\n|__________________________________",
            "id": 5505,
            "name": "NewExchange",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 5504,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5501,
                  "indexed": true,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 5505,
                  "src": "272:21:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5500,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "272:7:11",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5503,
                  "indexed": true,
                  "name": "exchange",
                  "nodeType": "VariableDeclaration",
                  "scope": 5505,
                  "src": "295:24:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5502,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "295:7:11",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "271:49:11"
            },
            "src": "254:67:11"
          },
          {
            "constant": false,
            "id": 5507,
            "name": "exchangeTemplate",
            "nodeType": "VariableDeclaration",
            "scope": 5760,
            "src": "325:31:11",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_address",
              "typeString": "address"
            },
            "typeName": {
              "id": 5506,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "325:7:11",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "constant": false,
            "id": 5509,
            "name": "tokenCount",
            "nodeType": "VariableDeclaration",
            "scope": 5760,
            "src": "360:25:11",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 5508,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "360:7:11",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "constant": false,
            "id": 5513,
            "name": "token_to_exchange",
            "nodeType": "VariableDeclaration",
            "scope": 5760,
            "src": "389:55:11",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
              "typeString": "mapping(address => address)"
            },
            "typeName": {
              "id": 5512,
              "keyType": {
                "id": 5510,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "398:7:11",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "389:28:11",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                "typeString": "mapping(address => address)"
              },
              "valueType": {
                "id": 5511,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "409:7:11",
                "stateMutability": "nonpayable",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              }
            },
            "value": null,
            "visibility": "internal"
          },
          {
            "constant": false,
            "id": 5517,
            "name": "exchange_to_token",
            "nodeType": "VariableDeclaration",
            "scope": 5760,
            "src": "448:55:11",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
              "typeString": "mapping(address => address)"
            },
            "typeName": {
              "id": 5516,
              "keyType": {
                "id": 5514,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "457:7:11",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "448:28:11",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                "typeString": "mapping(address => address)"
              },
              "valueType": {
                "id": 5515,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "468:7:11",
                "stateMutability": "nonpayable",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              }
            },
            "value": null,
            "visibility": "internal"
          },
          {
            "constant": false,
            "id": 5521,
            "name": "id_to_token",
            "nodeType": "VariableDeclaration",
            "scope": 5760,
            "src": "507:49:11",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_uint256_$_t_address_$",
              "typeString": "mapping(uint256 => address)"
            },
            "typeName": {
              "id": 5520,
              "keyType": {
                "id": 5518,
                "name": "uint256",
                "nodeType": "ElementaryTypeName",
                "src": "516:7:11",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                }
              },
              "nodeType": "Mapping",
              "src": "507:28:11",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_uint256_$_t_address_$",
                "typeString": "mapping(uint256 => address)"
              },
              "valueType": {
                "id": 5519,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "527:7:11",
                "stateMutability": "nonpayable",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              }
            },
            "value": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 5546,
              "nodeType": "Block",
              "src": "734:140:11",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 5531,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 5527,
                          "name": "exchangeTemplate",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5507,
                          "src": "748:16:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 5529,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "776:1:11",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              }
                            ],
                            "id": 5528,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "768:7:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": "address"
                          },
                          "id": 5530,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "768:10:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "src": "748:30:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 5526,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5912,
                        5913
                      ],
                      "referencedDeclaration": 5912,
                      "src": "740:7:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                        "typeString": "function (bool) pure"
                      }
                    },
                    "id": 5532,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "740:39:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5533,
                  "nodeType": "ExpressionStatement",
                  "src": "740:39:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 5539,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 5535,
                          "name": "template",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5523,
                          "src": "813:8:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 5537,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "833:1:11",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              }
                            ],
                            "id": 5536,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "825:7:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": "address"
                          },
                          "id": 5538,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "825:10:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "src": "813:22:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 5534,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5912,
                        5913
                      ],
                      "referencedDeclaration": 5912,
                      "src": "805:7:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                        "typeString": "function (bool) pure"
                      }
                    },
                    "id": 5540,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "805:31:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5541,
                  "nodeType": "ExpressionStatement",
                  "src": "805:31:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 5544,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 5542,
                      "name": "exchangeTemplate",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5507,
                      "src": "842:16:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 5543,
                      "name": "template",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5523,
                      "src": "861:8:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "842:27:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 5545,
                  "nodeType": "ExpressionStatement",
                  "src": "842:27:11"
                }
              ]
            },
            "documentation": "*********************************|\n|         Factory Functions         |\n|__________________________________",
            "id": 5547,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "initializeFactory",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5524,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5523,
                  "name": "template",
                  "nodeType": "VariableDeclaration",
                  "scope": 5547,
                  "src": "709:16:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5522,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "709:7:11",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "708:18:11"
            },
            "returnParameters": {
              "id": 5525,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "734:0:11"
            },
            "scope": 5760,
            "src": "682:192:11",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 5638,
              "nodeType": "Block",
              "src": "942:512:11",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 5559,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 5555,
                          "name": "token",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5549,
                          "src": "956:5:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 5557,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "973:1:11",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              }
                            ],
                            "id": 5556,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "965:7:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": "address"
                          },
                          "id": 5558,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "965:10:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "src": "956:19:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 5554,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5912,
                        5913
                      ],
                      "referencedDeclaration": 5912,
                      "src": "948:7:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                        "typeString": "function (bool) pure"
                      }
                    },
                    "id": 5560,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "948:28:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5561,
                  "nodeType": "ExpressionStatement",
                  "src": "948:28:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 5567,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 5563,
                          "name": "exchangeTemplate",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5507,
                          "src": "990:16:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 5565,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1018:1:11",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              }
                            ],
                            "id": 5564,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "1010:7:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": "address"
                          },
                          "id": 5566,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1010:10:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "src": "990:30:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 5562,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5912,
                        5913
                      ],
                      "referencedDeclaration": 5912,
                      "src": "982:7:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                        "typeString": "function (bool) pure"
                      }
                    },
                    "id": 5568,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "982:39:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5569,
                  "nodeType": "ExpressionStatement",
                  "src": "982:39:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 5577,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 5571,
                            "name": "token_to_exchange",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5513,
                            "src": "1035:17:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                              "typeString": "mapping(address => address)"
                            }
                          },
                          "id": 5573,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 5572,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5549,
                            "src": "1053:5:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "1035:24:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 5575,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1071:1:11",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              }
                            ],
                            "id": 5574,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "1063:7:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": "address"
                          },
                          "id": 5576,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1063:10:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "src": "1035:38:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 5570,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5912,
                        5913
                      ],
                      "referencedDeclaration": 5912,
                      "src": "1027:7:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                        "typeString": "function (bool) pure"
                      }
                    },
                    "id": 5578,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1027:47:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5579,
                  "nodeType": "ExpressionStatement",
                  "src": "1027:47:11"
                },
                {
                  "assignments": [
                    5581
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 5581,
                      "name": "exchange",
                      "nodeType": "VariableDeclaration",
                      "scope": 5638,
                      "src": "1080:24:11",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_UniswapExchange_$5495",
                        "typeString": "contract UniswapExchange"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 5580,
                        "name": "UniswapExchange",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 5495,
                        "src": "1080:15:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_UniswapExchange_$5495",
                          "typeString": "contract UniswapExchange"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 5585,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 5583,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "NewExpression",
                      "src": "1107:19:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_creation_nonpayable$__$returns$_t_contract$_UniswapExchange_$5495_$",
                        "typeString": "function () returns (contract UniswapExchange)"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 5582,
                        "name": "UniswapExchange",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 5495,
                        "src": "1111:15:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_UniswapExchange_$5495",
                          "typeString": "contract UniswapExchange"
                        }
                      }
                    },
                    "id": 5584,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1107:21:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_UniswapExchange_$5495",
                      "typeString": "contract UniswapExchange"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1080:48:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 5589,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5549,
                        "src": "1149:5:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 5591,
                            "name": "this",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5947,
                            "src": "1164:4:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_UniswapFactory_$5760",
                              "typeString": "contract UniswapFactory"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_UniswapFactory_$5760",
                              "typeString": "contract UniswapFactory"
                            }
                          ],
                          "id": 5590,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "1156:7:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": "address"
                        },
                        "id": 5592,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1156:13:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 5586,
                        "name": "exchange",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5581,
                        "src": "1134:8:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_UniswapExchange_$5495",
                          "typeString": "contract UniswapExchange"
                        }
                      },
                      "id": 5588,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "setup",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3768,
                      "src": "1134:14:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$returns$__$",
                        "typeString": "function (address,address) external"
                      }
                    },
                    "id": 5593,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1134:36:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5594,
                  "nodeType": "ExpressionStatement",
                  "src": "1134:36:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 5601,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 5595,
                        "name": "token_to_exchange",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5513,
                        "src": "1176:17:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                          "typeString": "mapping(address => address)"
                        }
                      },
                      "id": 5597,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 5596,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5549,
                        "src": "1194:5:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "1176:24:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 5599,
                          "name": "exchange",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5581,
                          "src": "1211:8:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_UniswapExchange_$5495",
                            "typeString": "contract UniswapExchange"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_contract$_UniswapExchange_$5495",
                            "typeString": "contract UniswapExchange"
                          }
                        ],
                        "id": 5598,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "1203:7:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": "address"
                      },
                      "id": 5600,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "1203:17:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address_payable",
                        "typeString": "address payable"
                      }
                    },
                    "src": "1176:44:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 5602,
                  "nodeType": "ExpressionStatement",
                  "src": "1176:44:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 5609,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 5603,
                        "name": "exchange_to_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5517,
                        "src": "1226:17:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                          "typeString": "mapping(address => address)"
                        }
                      },
                      "id": 5607,
                      "indexExpression": {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 5605,
                            "name": "exchange",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5581,
                            "src": "1252:8:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_UniswapExchange_$5495",
                              "typeString": "contract UniswapExchange"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_UniswapExchange_$5495",
                              "typeString": "contract UniswapExchange"
                            }
                          ],
                          "id": 5604,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "1244:7:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": "address"
                        },
                        "id": 5606,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1244:17:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "1226:36:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 5608,
                      "name": "token",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5549,
                      "src": "1265:5:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "1226:44:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 5610,
                  "nodeType": "ExpressionStatement",
                  "src": "1226:44:11"
                },
                {
                  "assignments": [
                    5612
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 5612,
                      "name": "token_id",
                      "nodeType": "VariableDeclaration",
                      "scope": 5638,
                      "src": "1276:16:11",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 5611,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "1276:7:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 5616,
                  "initialValue": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 5615,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 5613,
                      "name": "tokenCount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5509,
                      "src": "1295:10:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "+",
                    "rightExpression": {
                      "argumentTypes": null,
                      "hexValue": "31",
                      "id": 5614,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "1308:1:11",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_1_by_1",
                        "typeString": "int_const 1"
                      },
                      "value": "1"
                    },
                    "src": "1295:14:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1276:33:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 5619,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 5617,
                      "name": "tokenCount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5509,
                      "src": "1315:10:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 5618,
                      "name": "token_id",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5612,
                      "src": "1328:8:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "1315:21:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 5620,
                  "nodeType": "ExpressionStatement",
                  "src": "1315:21:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 5625,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 5621,
                        "name": "id_to_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5521,
                        "src": "1342:11:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_uint256_$_t_address_$",
                          "typeString": "mapping(uint256 => address)"
                        }
                      },
                      "id": 5623,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 5622,
                        "name": "token_id",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5612,
                        "src": "1354:8:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "1342:21:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 5624,
                      "name": "token",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5549,
                      "src": "1366:5:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "1342:29:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 5626,
                  "nodeType": "ExpressionStatement",
                  "src": "1342:29:11"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 5628,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5549,
                        "src": "1394:5:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 5630,
                            "name": "exchange",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5581,
                            "src": "1409:8:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_UniswapExchange_$5495",
                              "typeString": "contract UniswapExchange"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_UniswapExchange_$5495",
                              "typeString": "contract UniswapExchange"
                            }
                          ],
                          "id": 5629,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "1401:7:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": "address"
                        },
                        "id": 5631,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1401:17:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 5627,
                      "name": "NewExchange",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5505,
                      "src": "1382:11:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$returns$__$",
                        "typeString": "function (address,address)"
                      }
                    },
                    "id": 5632,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1382:37:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5633,
                  "nodeType": "EmitStatement",
                  "src": "1377:42:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 5635,
                        "name": "exchange",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5581,
                        "src": "1440:8:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_UniswapExchange_$5495",
                          "typeString": "contract UniswapExchange"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_contract$_UniswapExchange_$5495",
                          "typeString": "contract UniswapExchange"
                        }
                      ],
                      "id": 5634,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "nodeType": "ElementaryTypeNameExpression",
                      "src": "1432:7:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_address_$",
                        "typeString": "type(address)"
                      },
                      "typeName": "address"
                    },
                    "id": 5636,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "typeConversion",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1432:17:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address_payable",
                      "typeString": "address payable"
                    }
                  },
                  "functionReturnParameters": 5553,
                  "id": 5637,
                  "nodeType": "Return",
                  "src": "1425:24:11"
                }
              ]
            },
            "documentation": null,
            "id": 5639,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "createExchange",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5550,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5549,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 5639,
                  "src": "902:13:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5548,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "902:7:11",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "901:15:11"
            },
            "returnParameters": {
              "id": 5553,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5552,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 5639,
                  "src": "933:7:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5551,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "933:7:11",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "932:9:11"
            },
            "scope": 5760,
            "src": "878:576:11",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 5722,
              "nodeType": "Block",
              "src": "1594:480:11",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 5653,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 5649,
                          "name": "token",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5643,
                          "src": "1608:5:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 5651,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1625:1:11",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              }
                            ],
                            "id": 5650,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "1617:7:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": "address"
                          },
                          "id": 5652,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1617:10:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "src": "1608:19:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 5648,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5912,
                        5913
                      ],
                      "referencedDeclaration": 5912,
                      "src": "1600:7:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                        "typeString": "function (bool) pure"
                      }
                    },
                    "id": 5654,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1600:28:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5655,
                  "nodeType": "ExpressionStatement",
                  "src": "1600:28:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 5663,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 5657,
                            "name": "token_to_exchange",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5513,
                            "src": "1642:17:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                              "typeString": "mapping(address => address)"
                            }
                          },
                          "id": 5659,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 5658,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5643,
                            "src": "1660:5:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "1642:24:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 5661,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1678:1:11",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              }
                            ],
                            "id": 5660,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "1670:7:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": "address"
                          },
                          "id": 5662,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1670:10:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "src": "1642:38:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 5656,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5912,
                        5913
                      ],
                      "referencedDeclaration": 5912,
                      "src": "1634:7:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                        "typeString": "function (bool) pure"
                      }
                    },
                    "id": 5664,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1634:47:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5665,
                  "nodeType": "ExpressionStatement",
                  "src": "1634:47:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 5675,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 5668,
                                  "name": "exchange",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 5641,
                                  "src": "1711:8:11",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  }
                                ],
                                "id": 5667,
                                "name": "UniswapExchange",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5495,
                                "src": "1695:15:11",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_contract$_UniswapExchange_$5495_$",
                                  "typeString": "type(contract UniswapExchange)"
                                }
                              },
                              "id": 5669,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "1695:25:11",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_UniswapExchange_$5495",
                                "typeString": "contract UniswapExchange"
                              }
                            },
                            "id": 5670,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "factoryAddress",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 5112,
                            "src": "1695:40:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$__$returns$_t_address_$",
                              "typeString": "function () view external returns (address)"
                            }
                          },
                          "id": 5671,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1695:42:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 5673,
                              "name": "this",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5947,
                              "src": "1749:4:11",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_UniswapFactory_$5760",
                                "typeString": "contract UniswapFactory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_UniswapFactory_$5760",
                                "typeString": "contract UniswapFactory"
                              }
                            ],
                            "id": 5672,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "1741:7:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": "address"
                          },
                          "id": 5674,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1741:13:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "src": "1695:59:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "65786368616e67652e666163746f727920646f6573206e6f74206d61746368",
                        "id": 5676,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1756:33:11",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_7342fc02c8f1d916b716cff977c36bcc5edd26634b4264bd942cca26352c0d54",
                          "typeString": "literal_string \"exchange.factory does not match\""
                        },
                        "value": "exchange.factory does not match"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_7342fc02c8f1d916b716cff977c36bcc5edd26634b4264bd942cca26352c0d54",
                          "typeString": "literal_string \"exchange.factory does not match\""
                        }
                      ],
                      "id": 5666,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5912,
                        5913
                      ],
                      "referencedDeclaration": 5913,
                      "src": "1687:7:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 5677,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1687:103:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5678,
                  "nodeType": "ExpressionStatement",
                  "src": "1687:103:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 5685,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 5679,
                        "name": "token_to_exchange",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5513,
                        "src": "1796:17:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                          "typeString": "mapping(address => address)"
                        }
                      },
                      "id": 5681,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 5680,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5643,
                        "src": "1814:5:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "1796:24:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 5683,
                          "name": "exchange",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5641,
                          "src": "1831:8:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        ],
                        "id": 5682,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "1823:7:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": "address"
                      },
                      "id": 5684,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "1823:17:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address_payable",
                        "typeString": "address payable"
                      }
                    },
                    "src": "1796:44:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 5686,
                  "nodeType": "ExpressionStatement",
                  "src": "1796:44:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 5693,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 5687,
                        "name": "exchange_to_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5517,
                        "src": "1846:17:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                          "typeString": "mapping(address => address)"
                        }
                      },
                      "id": 5691,
                      "indexExpression": {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 5689,
                            "name": "exchange",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5641,
                            "src": "1872:8:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          ],
                          "id": 5688,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "1864:7:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": "address"
                        },
                        "id": 5690,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1864:17:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "1846:36:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 5692,
                      "name": "token",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5643,
                      "src": "1885:5:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "1846:44:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 5694,
                  "nodeType": "ExpressionStatement",
                  "src": "1846:44:11"
                },
                {
                  "assignments": [
                    5696
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 5696,
                      "name": "token_id",
                      "nodeType": "VariableDeclaration",
                      "scope": 5722,
                      "src": "1896:16:11",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 5695,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "1896:7:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 5700,
                  "initialValue": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 5699,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 5697,
                      "name": "tokenCount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5509,
                      "src": "1915:10:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "+",
                    "rightExpression": {
                      "argumentTypes": null,
                      "hexValue": "31",
                      "id": 5698,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "1928:1:11",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_1_by_1",
                        "typeString": "int_const 1"
                      },
                      "value": "1"
                    },
                    "src": "1915:14:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1896:33:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 5703,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 5701,
                      "name": "tokenCount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5509,
                      "src": "1935:10:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 5702,
                      "name": "token_id",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5696,
                      "src": "1948:8:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "1935:21:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 5704,
                  "nodeType": "ExpressionStatement",
                  "src": "1935:21:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 5709,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 5705,
                        "name": "id_to_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5521,
                        "src": "1962:11:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_uint256_$_t_address_$",
                          "typeString": "mapping(uint256 => address)"
                        }
                      },
                      "id": 5707,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 5706,
                        "name": "token_id",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5696,
                        "src": "1974:8:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "1962:21:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 5708,
                      "name": "token",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5643,
                      "src": "1986:5:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "1962:29:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 5710,
                  "nodeType": "ExpressionStatement",
                  "src": "1962:29:11"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 5712,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5643,
                        "src": "2014:5:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 5714,
                            "name": "exchange",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5641,
                            "src": "2029:8:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          ],
                          "id": 5713,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "2021:7:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": "address"
                        },
                        "id": 5715,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "2021:17:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 5711,
                      "name": "NewExchange",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5505,
                      "src": "2002:11:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$returns$__$",
                        "typeString": "function (address,address)"
                      }
                    },
                    "id": 5716,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2002:37:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5717,
                  "nodeType": "EmitStatement",
                  "src": "1997:42:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 5719,
                        "name": "exchange",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5641,
                        "src": "2060:8:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 5718,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "nodeType": "ElementaryTypeNameExpression",
                      "src": "2052:7:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_address_$",
                        "typeString": "type(address)"
                      },
                      "typeName": "address"
                    },
                    "id": 5720,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "typeConversion",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2052:17:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address_payable",
                      "typeString": "address payable"
                    }
                  },
                  "functionReturnParameters": 5647,
                  "id": 5721,
                  "nodeType": "Return",
                  "src": "2045:24:11"
                }
              ]
            },
            "documentation": null,
            "id": 5723,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "registerExchange",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5644,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5641,
                  "name": "exchange",
                  "nodeType": "VariableDeclaration",
                  "scope": 5723,
                  "src": "1528:24:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address_payable",
                    "typeString": "address payable"
                  },
                  "typeName": {
                    "id": 5640,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1528:15:11",
                    "stateMutability": "payable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address_payable",
                      "typeString": "address payable"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5643,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 5723,
                  "src": "1554:13:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5642,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1554:7:11",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1527:41:11"
            },
            "returnParameters": {
              "id": 5647,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5646,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 5723,
                  "src": "1585:7:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5645,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1585:7:11",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1584:9:11"
            },
            "scope": 5760,
            "src": "1502:572:11",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 5734,
              "nodeType": "Block",
              "src": "2265:42:11",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 5730,
                      "name": "token_to_exchange",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5513,
                      "src": "2278:17:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                        "typeString": "mapping(address => address)"
                      }
                    },
                    "id": 5732,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 5731,
                      "name": "token",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5725,
                      "src": "2296:5:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "2278:24:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 5729,
                  "id": 5733,
                  "nodeType": "Return",
                  "src": "2271:31:11"
                }
              ]
            },
            "documentation": "*********************************|\n|         Getter Functions          |\n|__________________________________",
            "id": 5735,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getExchange",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5726,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5725,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 5735,
                  "src": "2220:13:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5724,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2220:7:11",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2219:15:11"
            },
            "returnParameters": {
              "id": 5729,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5728,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 5735,
                  "src": "2256:7:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5727,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2256:7:11",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2255:9:11"
            },
            "scope": 5760,
            "src": "2199:108:11",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 5746,
              "nodeType": "Block",
              "src": "2377:45:11",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 5742,
                      "name": "exchange_to_token",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5517,
                      "src": "2390:17:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                        "typeString": "mapping(address => address)"
                      }
                    },
                    "id": 5744,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 5743,
                      "name": "exchange",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5737,
                      "src": "2408:8:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "2390:27:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 5741,
                  "id": 5745,
                  "nodeType": "Return",
                  "src": "2383:34:11"
                }
              ]
            },
            "documentation": null,
            "id": 5747,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getToken",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5738,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5737,
                  "name": "exchange",
                  "nodeType": "VariableDeclaration",
                  "scope": 5747,
                  "src": "2329:16:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5736,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2329:7:11",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2328:18:11"
            },
            "returnParameters": {
              "id": 5741,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5740,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 5747,
                  "src": "2368:7:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5739,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2368:7:11",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2367:9:11"
            },
            "scope": 5760,
            "src": "2311:111:11",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 5758,
              "nodeType": "Block",
              "src": "2498:39:11",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 5754,
                      "name": "id_to_token",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5521,
                      "src": "2511:11:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_uint256_$_t_address_$",
                        "typeString": "mapping(uint256 => address)"
                      }
                    },
                    "id": 5756,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 5755,
                      "name": "token_id",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5749,
                      "src": "2523:8:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "2511:21:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 5753,
                  "id": 5757,
                  "nodeType": "Return",
                  "src": "2504:28:11"
                }
              ]
            },
            "documentation": null,
            "id": 5759,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getTokenWithId",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5750,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5749,
                  "name": "token_id",
                  "nodeType": "VariableDeclaration",
                  "scope": 5759,
                  "src": "2450:16:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 5748,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2450:7:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2449:18:11"
            },
            "returnParameters": {
              "id": 5753,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5752,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 5759,
                  "src": "2489:7:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5751,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2489:7:11",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2488:9:11"
            },
            "scope": 5760,
            "src": "2426:111:11",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          }
        ],
        "scope": 5761,
        "src": "104:2436:11"
      }
    ],
    "src": "0:2542:11"
  },
  "legacyAST": {
    "absolutePath": "/home/binyu/Desktop/Synthetix/prod/swap-solidity/contracts/uniswap/UniswapFactory.sol",
    "exportedSymbols": {
      "UniswapFactory": [
        5760
      ]
    },
    "id": 5761,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 5497,
        "literals": [
          "solidity",
          "^",
          "0.5",
          ".0"
        ],
        "nodeType": "PragmaDirective",
        "src": "0:23:11"
      },
      {
        "absolutePath": "/home/binyu/Desktop/Synthetix/prod/swap-solidity/contracts/uniswap/UniswapExchange.sol",
        "file": "./UniswapExchange.sol",
        "id": 5498,
        "nodeType": "ImportDirective",
        "scope": 5761,
        "sourceUnit": 5496,
        "src": "25:31:11",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "/home/binyu/Desktop/Synthetix/prod/swap-solidity/contracts/interfaces/IUniswapExchange.sol",
        "file": "../interfaces/IUniswapExchange.sol",
        "id": 5499,
        "nodeType": "ImportDirective",
        "scope": 5761,
        "sourceUnit": 409,
        "src": "57:44:11",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "baseContracts": [],
        "contractDependencies": [
          5495
        ],
        "contractKind": "contract",
        "documentation": null,
        "fullyImplemented": true,
        "id": 5760,
        "linearizedBaseContracts": [
          5760
        ],
        "name": "UniswapFactory",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "anonymous": false,
            "documentation": "*********************************|\n|       Events And Variables        |\n|__________________________________",
            "id": 5505,
            "name": "NewExchange",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 5504,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5501,
                  "indexed": true,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 5505,
                  "src": "272:21:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5500,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "272:7:11",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5503,
                  "indexed": true,
                  "name": "exchange",
                  "nodeType": "VariableDeclaration",
                  "scope": 5505,
                  "src": "295:24:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5502,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "295:7:11",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "271:49:11"
            },
            "src": "254:67:11"
          },
          {
            "constant": false,
            "id": 5507,
            "name": "exchangeTemplate",
            "nodeType": "VariableDeclaration",
            "scope": 5760,
            "src": "325:31:11",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_address",
              "typeString": "address"
            },
            "typeName": {
              "id": 5506,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "325:7:11",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "constant": false,
            "id": 5509,
            "name": "tokenCount",
            "nodeType": "VariableDeclaration",
            "scope": 5760,
            "src": "360:25:11",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 5508,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "360:7:11",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "constant": false,
            "id": 5513,
            "name": "token_to_exchange",
            "nodeType": "VariableDeclaration",
            "scope": 5760,
            "src": "389:55:11",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
              "typeString": "mapping(address => address)"
            },
            "typeName": {
              "id": 5512,
              "keyType": {
                "id": 5510,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "398:7:11",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "389:28:11",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                "typeString": "mapping(address => address)"
              },
              "valueType": {
                "id": 5511,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "409:7:11",
                "stateMutability": "nonpayable",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              }
            },
            "value": null,
            "visibility": "internal"
          },
          {
            "constant": false,
            "id": 5517,
            "name": "exchange_to_token",
            "nodeType": "VariableDeclaration",
            "scope": 5760,
            "src": "448:55:11",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
              "typeString": "mapping(address => address)"
            },
            "typeName": {
              "id": 5516,
              "keyType": {
                "id": 5514,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "457:7:11",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "448:28:11",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                "typeString": "mapping(address => address)"
              },
              "valueType": {
                "id": 5515,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "468:7:11",
                "stateMutability": "nonpayable",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              }
            },
            "value": null,
            "visibility": "internal"
          },
          {
            "constant": false,
            "id": 5521,
            "name": "id_to_token",
            "nodeType": "VariableDeclaration",
            "scope": 5760,
            "src": "507:49:11",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_uint256_$_t_address_$",
              "typeString": "mapping(uint256 => address)"
            },
            "typeName": {
              "id": 5520,
              "keyType": {
                "id": 5518,
                "name": "uint256",
                "nodeType": "ElementaryTypeName",
                "src": "516:7:11",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                }
              },
              "nodeType": "Mapping",
              "src": "507:28:11",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_uint256_$_t_address_$",
                "typeString": "mapping(uint256 => address)"
              },
              "valueType": {
                "id": 5519,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "527:7:11",
                "stateMutability": "nonpayable",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              }
            },
            "value": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 5546,
              "nodeType": "Block",
              "src": "734:140:11",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 5531,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 5527,
                          "name": "exchangeTemplate",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5507,
                          "src": "748:16:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 5529,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "776:1:11",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              }
                            ],
                            "id": 5528,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "768:7:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": "address"
                          },
                          "id": 5530,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "768:10:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "src": "748:30:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 5526,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5912,
                        5913
                      ],
                      "referencedDeclaration": 5912,
                      "src": "740:7:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                        "typeString": "function (bool) pure"
                      }
                    },
                    "id": 5532,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "740:39:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5533,
                  "nodeType": "ExpressionStatement",
                  "src": "740:39:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 5539,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 5535,
                          "name": "template",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5523,
                          "src": "813:8:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 5537,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "833:1:11",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              }
                            ],
                            "id": 5536,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "825:7:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": "address"
                          },
                          "id": 5538,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "825:10:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "src": "813:22:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 5534,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5912,
                        5913
                      ],
                      "referencedDeclaration": 5912,
                      "src": "805:7:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                        "typeString": "function (bool) pure"
                      }
                    },
                    "id": 5540,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "805:31:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5541,
                  "nodeType": "ExpressionStatement",
                  "src": "805:31:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 5544,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 5542,
                      "name": "exchangeTemplate",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5507,
                      "src": "842:16:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 5543,
                      "name": "template",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5523,
                      "src": "861:8:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "842:27:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 5545,
                  "nodeType": "ExpressionStatement",
                  "src": "842:27:11"
                }
              ]
            },
            "documentation": "*********************************|\n|         Factory Functions         |\n|__________________________________",
            "id": 5547,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "initializeFactory",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5524,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5523,
                  "name": "template",
                  "nodeType": "VariableDeclaration",
                  "scope": 5547,
                  "src": "709:16:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5522,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "709:7:11",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "708:18:11"
            },
            "returnParameters": {
              "id": 5525,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "734:0:11"
            },
            "scope": 5760,
            "src": "682:192:11",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 5638,
              "nodeType": "Block",
              "src": "942:512:11",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 5559,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 5555,
                          "name": "token",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5549,
                          "src": "956:5:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 5557,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "973:1:11",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              }
                            ],
                            "id": 5556,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "965:7:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": "address"
                          },
                          "id": 5558,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "965:10:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "src": "956:19:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 5554,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5912,
                        5913
                      ],
                      "referencedDeclaration": 5912,
                      "src": "948:7:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                        "typeString": "function (bool) pure"
                      }
                    },
                    "id": 5560,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "948:28:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5561,
                  "nodeType": "ExpressionStatement",
                  "src": "948:28:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 5567,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 5563,
                          "name": "exchangeTemplate",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5507,
                          "src": "990:16:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 5565,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1018:1:11",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              }
                            ],
                            "id": 5564,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "1010:7:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": "address"
                          },
                          "id": 5566,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1010:10:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "src": "990:30:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 5562,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5912,
                        5913
                      ],
                      "referencedDeclaration": 5912,
                      "src": "982:7:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                        "typeString": "function (bool) pure"
                      }
                    },
                    "id": 5568,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "982:39:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5569,
                  "nodeType": "ExpressionStatement",
                  "src": "982:39:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 5577,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 5571,
                            "name": "token_to_exchange",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5513,
                            "src": "1035:17:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                              "typeString": "mapping(address => address)"
                            }
                          },
                          "id": 5573,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 5572,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5549,
                            "src": "1053:5:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "1035:24:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 5575,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1071:1:11",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              }
                            ],
                            "id": 5574,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "1063:7:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": "address"
                          },
                          "id": 5576,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1063:10:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "src": "1035:38:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 5570,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5912,
                        5913
                      ],
                      "referencedDeclaration": 5912,
                      "src": "1027:7:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                        "typeString": "function (bool) pure"
                      }
                    },
                    "id": 5578,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1027:47:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5579,
                  "nodeType": "ExpressionStatement",
                  "src": "1027:47:11"
                },
                {
                  "assignments": [
                    5581
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 5581,
                      "name": "exchange",
                      "nodeType": "VariableDeclaration",
                      "scope": 5638,
                      "src": "1080:24:11",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_UniswapExchange_$5495",
                        "typeString": "contract UniswapExchange"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 5580,
                        "name": "UniswapExchange",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 5495,
                        "src": "1080:15:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_UniswapExchange_$5495",
                          "typeString": "contract UniswapExchange"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 5585,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 5583,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "NewExpression",
                      "src": "1107:19:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_creation_nonpayable$__$returns$_t_contract$_UniswapExchange_$5495_$",
                        "typeString": "function () returns (contract UniswapExchange)"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 5582,
                        "name": "UniswapExchange",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 5495,
                        "src": "1111:15:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_UniswapExchange_$5495",
                          "typeString": "contract UniswapExchange"
                        }
                      }
                    },
                    "id": 5584,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1107:21:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_UniswapExchange_$5495",
                      "typeString": "contract UniswapExchange"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1080:48:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 5589,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5549,
                        "src": "1149:5:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 5591,
                            "name": "this",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5947,
                            "src": "1164:4:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_UniswapFactory_$5760",
                              "typeString": "contract UniswapFactory"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_UniswapFactory_$5760",
                              "typeString": "contract UniswapFactory"
                            }
                          ],
                          "id": 5590,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "1156:7:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": "address"
                        },
                        "id": 5592,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1156:13:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 5586,
                        "name": "exchange",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5581,
                        "src": "1134:8:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_UniswapExchange_$5495",
                          "typeString": "contract UniswapExchange"
                        }
                      },
                      "id": 5588,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "setup",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3768,
                      "src": "1134:14:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$returns$__$",
                        "typeString": "function (address,address) external"
                      }
                    },
                    "id": 5593,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1134:36:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5594,
                  "nodeType": "ExpressionStatement",
                  "src": "1134:36:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 5601,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 5595,
                        "name": "token_to_exchange",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5513,
                        "src": "1176:17:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                          "typeString": "mapping(address => address)"
                        }
                      },
                      "id": 5597,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 5596,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5549,
                        "src": "1194:5:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "1176:24:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 5599,
                          "name": "exchange",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5581,
                          "src": "1211:8:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_UniswapExchange_$5495",
                            "typeString": "contract UniswapExchange"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_contract$_UniswapExchange_$5495",
                            "typeString": "contract UniswapExchange"
                          }
                        ],
                        "id": 5598,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "1203:7:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": "address"
                      },
                      "id": 5600,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "1203:17:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address_payable",
                        "typeString": "address payable"
                      }
                    },
                    "src": "1176:44:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 5602,
                  "nodeType": "ExpressionStatement",
                  "src": "1176:44:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 5609,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 5603,
                        "name": "exchange_to_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5517,
                        "src": "1226:17:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                          "typeString": "mapping(address => address)"
                        }
                      },
                      "id": 5607,
                      "indexExpression": {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 5605,
                            "name": "exchange",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5581,
                            "src": "1252:8:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_UniswapExchange_$5495",
                              "typeString": "contract UniswapExchange"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_UniswapExchange_$5495",
                              "typeString": "contract UniswapExchange"
                            }
                          ],
                          "id": 5604,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "1244:7:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": "address"
                        },
                        "id": 5606,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1244:17:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "1226:36:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 5608,
                      "name": "token",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5549,
                      "src": "1265:5:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "1226:44:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 5610,
                  "nodeType": "ExpressionStatement",
                  "src": "1226:44:11"
                },
                {
                  "assignments": [
                    5612
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 5612,
                      "name": "token_id",
                      "nodeType": "VariableDeclaration",
                      "scope": 5638,
                      "src": "1276:16:11",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 5611,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "1276:7:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 5616,
                  "initialValue": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 5615,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 5613,
                      "name": "tokenCount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5509,
                      "src": "1295:10:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "+",
                    "rightExpression": {
                      "argumentTypes": null,
                      "hexValue": "31",
                      "id": 5614,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "1308:1:11",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_1_by_1",
                        "typeString": "int_const 1"
                      },
                      "value": "1"
                    },
                    "src": "1295:14:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1276:33:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 5619,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 5617,
                      "name": "tokenCount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5509,
                      "src": "1315:10:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 5618,
                      "name": "token_id",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5612,
                      "src": "1328:8:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "1315:21:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 5620,
                  "nodeType": "ExpressionStatement",
                  "src": "1315:21:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 5625,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 5621,
                        "name": "id_to_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5521,
                        "src": "1342:11:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_uint256_$_t_address_$",
                          "typeString": "mapping(uint256 => address)"
                        }
                      },
                      "id": 5623,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 5622,
                        "name": "token_id",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5612,
                        "src": "1354:8:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "1342:21:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 5624,
                      "name": "token",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5549,
                      "src": "1366:5:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "1342:29:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 5626,
                  "nodeType": "ExpressionStatement",
                  "src": "1342:29:11"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 5628,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5549,
                        "src": "1394:5:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 5630,
                            "name": "exchange",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5581,
                            "src": "1409:8:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_UniswapExchange_$5495",
                              "typeString": "contract UniswapExchange"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_UniswapExchange_$5495",
                              "typeString": "contract UniswapExchange"
                            }
                          ],
                          "id": 5629,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "1401:7:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": "address"
                        },
                        "id": 5631,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1401:17:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 5627,
                      "name": "NewExchange",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5505,
                      "src": "1382:11:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$returns$__$",
                        "typeString": "function (address,address)"
                      }
                    },
                    "id": 5632,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1382:37:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5633,
                  "nodeType": "EmitStatement",
                  "src": "1377:42:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 5635,
                        "name": "exchange",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5581,
                        "src": "1440:8:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_UniswapExchange_$5495",
                          "typeString": "contract UniswapExchange"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_contract$_UniswapExchange_$5495",
                          "typeString": "contract UniswapExchange"
                        }
                      ],
                      "id": 5634,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "nodeType": "ElementaryTypeNameExpression",
                      "src": "1432:7:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_address_$",
                        "typeString": "type(address)"
                      },
                      "typeName": "address"
                    },
                    "id": 5636,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "typeConversion",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1432:17:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address_payable",
                      "typeString": "address payable"
                    }
                  },
                  "functionReturnParameters": 5553,
                  "id": 5637,
                  "nodeType": "Return",
                  "src": "1425:24:11"
                }
              ]
            },
            "documentation": null,
            "id": 5639,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "createExchange",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5550,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5549,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 5639,
                  "src": "902:13:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5548,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "902:7:11",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "901:15:11"
            },
            "returnParameters": {
              "id": 5553,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5552,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 5639,
                  "src": "933:7:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5551,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "933:7:11",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "932:9:11"
            },
            "scope": 5760,
            "src": "878:576:11",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 5722,
              "nodeType": "Block",
              "src": "1594:480:11",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 5653,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 5649,
                          "name": "token",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5643,
                          "src": "1608:5:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 5651,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1625:1:11",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              }
                            ],
                            "id": 5650,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "1617:7:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": "address"
                          },
                          "id": 5652,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1617:10:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "src": "1608:19:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 5648,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5912,
                        5913
                      ],
                      "referencedDeclaration": 5912,
                      "src": "1600:7:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                        "typeString": "function (bool) pure"
                      }
                    },
                    "id": 5654,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1600:28:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5655,
                  "nodeType": "ExpressionStatement",
                  "src": "1600:28:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 5663,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 5657,
                            "name": "token_to_exchange",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5513,
                            "src": "1642:17:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                              "typeString": "mapping(address => address)"
                            }
                          },
                          "id": 5659,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 5658,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5643,
                            "src": "1660:5:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "1642:24:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 5661,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1678:1:11",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              }
                            ],
                            "id": 5660,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "1670:7:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": "address"
                          },
                          "id": 5662,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1670:10:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "src": "1642:38:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 5656,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5912,
                        5913
                      ],
                      "referencedDeclaration": 5912,
                      "src": "1634:7:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                        "typeString": "function (bool) pure"
                      }
                    },
                    "id": 5664,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1634:47:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5665,
                  "nodeType": "ExpressionStatement",
                  "src": "1634:47:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 5675,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 5668,
                                  "name": "exchange",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 5641,
                                  "src": "1711:8:11",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  }
                                ],
                                "id": 5667,
                                "name": "UniswapExchange",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5495,
                                "src": "1695:15:11",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_contract$_UniswapExchange_$5495_$",
                                  "typeString": "type(contract UniswapExchange)"
                                }
                              },
                              "id": 5669,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "1695:25:11",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_UniswapExchange_$5495",
                                "typeString": "contract UniswapExchange"
                              }
                            },
                            "id": 5670,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "factoryAddress",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 5112,
                            "src": "1695:40:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$__$returns$_t_address_$",
                              "typeString": "function () view external returns (address)"
                            }
                          },
                          "id": 5671,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1695:42:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 5673,
                              "name": "this",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5947,
                              "src": "1749:4:11",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_UniswapFactory_$5760",
                                "typeString": "contract UniswapFactory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_UniswapFactory_$5760",
                                "typeString": "contract UniswapFactory"
                              }
                            ],
                            "id": 5672,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "1741:7:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": "address"
                          },
                          "id": 5674,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1741:13:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "src": "1695:59:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "65786368616e67652e666163746f727920646f6573206e6f74206d61746368",
                        "id": 5676,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1756:33:11",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_7342fc02c8f1d916b716cff977c36bcc5edd26634b4264bd942cca26352c0d54",
                          "typeString": "literal_string \"exchange.factory does not match\""
                        },
                        "value": "exchange.factory does not match"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_7342fc02c8f1d916b716cff977c36bcc5edd26634b4264bd942cca26352c0d54",
                          "typeString": "literal_string \"exchange.factory does not match\""
                        }
                      ],
                      "id": 5666,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5912,
                        5913
                      ],
                      "referencedDeclaration": 5913,
                      "src": "1687:7:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 5677,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1687:103:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5678,
                  "nodeType": "ExpressionStatement",
                  "src": "1687:103:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 5685,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 5679,
                        "name": "token_to_exchange",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5513,
                        "src": "1796:17:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                          "typeString": "mapping(address => address)"
                        }
                      },
                      "id": 5681,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 5680,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5643,
                        "src": "1814:5:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "1796:24:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 5683,
                          "name": "exchange",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5641,
                          "src": "1831:8:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        ],
                        "id": 5682,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "1823:7:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": "address"
                      },
                      "id": 5684,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "1823:17:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address_payable",
                        "typeString": "address payable"
                      }
                    },
                    "src": "1796:44:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 5686,
                  "nodeType": "ExpressionStatement",
                  "src": "1796:44:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 5693,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 5687,
                        "name": "exchange_to_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5517,
                        "src": "1846:17:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                          "typeString": "mapping(address => address)"
                        }
                      },
                      "id": 5691,
                      "indexExpression": {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 5689,
                            "name": "exchange",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5641,
                            "src": "1872:8:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          ],
                          "id": 5688,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "1864:7:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": "address"
                        },
                        "id": 5690,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1864:17:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "1846:36:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 5692,
                      "name": "token",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5643,
                      "src": "1885:5:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "1846:44:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 5694,
                  "nodeType": "ExpressionStatement",
                  "src": "1846:44:11"
                },
                {
                  "assignments": [
                    5696
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 5696,
                      "name": "token_id",
                      "nodeType": "VariableDeclaration",
                      "scope": 5722,
                      "src": "1896:16:11",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 5695,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "1896:7:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 5700,
                  "initialValue": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 5699,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 5697,
                      "name": "tokenCount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5509,
                      "src": "1915:10:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "+",
                    "rightExpression": {
                      "argumentTypes": null,
                      "hexValue": "31",
                      "id": 5698,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "1928:1:11",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_1_by_1",
                        "typeString": "int_const 1"
                      },
                      "value": "1"
                    },
                    "src": "1915:14:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1896:33:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 5703,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 5701,
                      "name": "tokenCount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5509,
                      "src": "1935:10:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 5702,
                      "name": "token_id",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5696,
                      "src": "1948:8:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "1935:21:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 5704,
                  "nodeType": "ExpressionStatement",
                  "src": "1935:21:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 5709,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 5705,
                        "name": "id_to_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5521,
                        "src": "1962:11:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_uint256_$_t_address_$",
                          "typeString": "mapping(uint256 => address)"
                        }
                      },
                      "id": 5707,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 5706,
                        "name": "token_id",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5696,
                        "src": "1974:8:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "1962:21:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 5708,
                      "name": "token",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5643,
                      "src": "1986:5:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "1962:29:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 5710,
                  "nodeType": "ExpressionStatement",
                  "src": "1962:29:11"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 5712,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5643,
                        "src": "2014:5:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 5714,
                            "name": "exchange",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5641,
                            "src": "2029:8:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          ],
                          "id": 5713,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "2021:7:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": "address"
                        },
                        "id": 5715,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "2021:17:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 5711,
                      "name": "NewExchange",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5505,
                      "src": "2002:11:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$returns$__$",
                        "typeString": "function (address,address)"
                      }
                    },
                    "id": 5716,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2002:37:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5717,
                  "nodeType": "EmitStatement",
                  "src": "1997:42:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 5719,
                        "name": "exchange",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5641,
                        "src": "2060:8:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 5718,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "nodeType": "ElementaryTypeNameExpression",
                      "src": "2052:7:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_address_$",
                        "typeString": "type(address)"
                      },
                      "typeName": "address"
                    },
                    "id": 5720,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "typeConversion",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2052:17:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address_payable",
                      "typeString": "address payable"
                    }
                  },
                  "functionReturnParameters": 5647,
                  "id": 5721,
                  "nodeType": "Return",
                  "src": "2045:24:11"
                }
              ]
            },
            "documentation": null,
            "id": 5723,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "registerExchange",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5644,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5641,
                  "name": "exchange",
                  "nodeType": "VariableDeclaration",
                  "scope": 5723,
                  "src": "1528:24:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address_payable",
                    "typeString": "address payable"
                  },
                  "typeName": {
                    "id": 5640,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1528:15:11",
                    "stateMutability": "payable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address_payable",
                      "typeString": "address payable"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5643,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 5723,
                  "src": "1554:13:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5642,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1554:7:11",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1527:41:11"
            },
            "returnParameters": {
              "id": 5647,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5646,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 5723,
                  "src": "1585:7:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5645,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1585:7:11",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1584:9:11"
            },
            "scope": 5760,
            "src": "1502:572:11",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 5734,
              "nodeType": "Block",
              "src": "2265:42:11",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 5730,
                      "name": "token_to_exchange",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5513,
                      "src": "2278:17:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                        "typeString": "mapping(address => address)"
                      }
                    },
                    "id": 5732,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 5731,
                      "name": "token",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5725,
                      "src": "2296:5:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "2278:24:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 5729,
                  "id": 5733,
                  "nodeType": "Return",
                  "src": "2271:31:11"
                }
              ]
            },
            "documentation": "*********************************|\n|         Getter Functions          |\n|__________________________________",
            "id": 5735,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getExchange",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5726,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5725,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 5735,
                  "src": "2220:13:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5724,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2220:7:11",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2219:15:11"
            },
            "returnParameters": {
              "id": 5729,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5728,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 5735,
                  "src": "2256:7:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5727,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2256:7:11",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2255:9:11"
            },
            "scope": 5760,
            "src": "2199:108:11",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 5746,
              "nodeType": "Block",
              "src": "2377:45:11",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 5742,
                      "name": "exchange_to_token",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5517,
                      "src": "2390:17:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                        "typeString": "mapping(address => address)"
                      }
                    },
                    "id": 5744,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 5743,
                      "name": "exchange",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5737,
                      "src": "2408:8:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "2390:27:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 5741,
                  "id": 5745,
                  "nodeType": "Return",
                  "src": "2383:34:11"
                }
              ]
            },
            "documentation": null,
            "id": 5747,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getToken",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5738,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5737,
                  "name": "exchange",
                  "nodeType": "VariableDeclaration",
                  "scope": 5747,
                  "src": "2329:16:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5736,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2329:7:11",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2328:18:11"
            },
            "returnParameters": {
              "id": 5741,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5740,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 5747,
                  "src": "2368:7:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5739,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2368:7:11",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2367:9:11"
            },
            "scope": 5760,
            "src": "2311:111:11",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 5758,
              "nodeType": "Block",
              "src": "2498:39:11",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 5754,
                      "name": "id_to_token",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5521,
                      "src": "2511:11:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_uint256_$_t_address_$",
                        "typeString": "mapping(uint256 => address)"
                      }
                    },
                    "id": 5756,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 5755,
                      "name": "token_id",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5749,
                      "src": "2523:8:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "2511:21:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 5753,
                  "id": 5757,
                  "nodeType": "Return",
                  "src": "2504:28:11"
                }
              ]
            },
            "documentation": null,
            "id": 5759,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getTokenWithId",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5750,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5749,
                  "name": "token_id",
                  "nodeType": "VariableDeclaration",
                  "scope": 5759,
                  "src": "2450:16:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 5748,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2450:7:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2449:18:11"
            },
            "returnParameters": {
              "id": 5753,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5752,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 5759,
                  "src": "2489:7:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5751,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2489:7:11",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2488:9:11"
            },
            "scope": 5760,
            "src": "2426:111:11",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          }
        ],
        "scope": 5761,
        "src": "104:2436:11"
      }
    ],
    "src": "0:2542:11"
  },
  "compiler": {
    "name": "solc",
    "version": "0.5.8+commit.1f148fe1.Emscripten.clang"
  },
  "networks": {},
  "schemaVersion": "2.0.1",
  "updatedAt": "2020-05-03T00:37:19.469Z"
}