{
    "schemaVersion": "2.0.0",
    "contractName": "Coordinator",
    "compilerOutput": {
        "abi": [
            {
                "inputs": [
                    {
                        "internalType": "address",
                        "name": "exchange",
                        "type": "address"
                    },
                    {
                        "internalType": "uint256",
                        "name": "chainId",
                        "type": "uint256"
                    }
                ],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "constructor"
            },
            {
                "payable": true,
                "stateMutability": "payable",
                "type": "fallback"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "EIP712_COORDINATOR_APPROVAL_SCHEMA_HASH",
                "outputs": [
                    {
                        "internalType": "bytes32",
                        "name": "",
                        "type": "bytes32"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "EIP712_COORDINATOR_DOMAIN_HASH",
                "outputs": [
                    {
                        "internalType": "bytes32",
                        "name": "",
                        "type": "bytes32"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "EIP712_COORDINATOR_DOMAIN_NAME",
                "outputs": [
                    {
                        "internalType": "string",
                        "name": "",
                        "type": "string"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "EIP712_COORDINATOR_DOMAIN_VERSION",
                "outputs": [
                    {
                        "internalType": "string",
                        "name": "",
                        "type": "string"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "EIP712_EXCHANGE_DOMAIN_HASH",
                "outputs": [
                    {
                        "internalType": "bytes32",
                        "name": "",
                        "type": "bytes32"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    {
                        "components": [
                            {
                                "internalType": "uint256",
                                "name": "salt",
                                "type": "uint256"
                            },
                            {
                                "internalType": "uint256",
                                "name": "expirationTimeSeconds",
                                "type": "uint256"
                            },
                            {
                                "internalType": "uint256",
                                "name": "gasPrice",
                                "type": "uint256"
                            },
                            {
                                "internalType": "address",
                                "name": "signerAddress",
                                "type": "address"
                            },
                            {
                                "internalType": "bytes",
                                "name": "data",
                                "type": "bytes"
                            }
                        ],
                        "internalType": "struct LibZeroExTransaction.ZeroExTransaction",
                        "name": "transaction",
                        "type": "tuple"
                    },
                    {
                        "internalType": "address",
                        "name": "txOrigin",
                        "type": "address"
                    },
                    {
                        "internalType": "bytes",
                        "name": "transactionSignature",
                        "type": "bytes"
                    },
                    {
                        "internalType": "bytes[]",
                        "name": "approvalSignatures",
                        "type": "bytes[]"
                    }
                ],
                "name": "assertValidCoordinatorApprovals",
                "outputs": [],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    {
                        "internalType": "bytes",
                        "name": "data",
                        "type": "bytes"
                    }
                ],
                "name": "decodeOrdersFromFillData",
                "outputs": [
                    {
                        "components": [
                            {
                                "internalType": "address",
                                "name": "makerAddress",
                                "type": "address"
                            },
                            {
                                "internalType": "address",
                                "name": "takerAddress",
                                "type": "address"
                            },
                            {
                                "internalType": "address",
                                "name": "feeRecipientAddress",
                                "type": "address"
                            },
                            {
                                "internalType": "address",
                                "name": "senderAddress",
                                "type": "address"
                            },
                            {
                                "internalType": "uint256",
                                "name": "makerAssetAmount",
                                "type": "uint256"
                            },
                            {
                                "internalType": "uint256",
                                "name": "takerAssetAmount",
                                "type": "uint256"
                            },
                            {
                                "internalType": "uint256",
                                "name": "makerFee",
                                "type": "uint256"
                            },
                            {
                                "internalType": "uint256",
                                "name": "takerFee",
                                "type": "uint256"
                            },
                            {
                                "internalType": "uint256",
                                "name": "expirationTimeSeconds",
                                "type": "uint256"
                            },
                            {
                                "internalType": "uint256",
                                "name": "salt",
                                "type": "uint256"
                            },
                            {
                                "internalType": "bytes",
                                "name": "makerAssetData",
                                "type": "bytes"
                            },
                            {
                                "internalType": "bytes",
                                "name": "takerAssetData",
                                "type": "bytes"
                            },
                            {
                                "internalType": "bytes",
                                "name": "makerFeeAssetData",
                                "type": "bytes"
                            },
                            {
                                "internalType": "bytes",
                                "name": "takerFeeAssetData",
                                "type": "bytes"
                            }
                        ],
                        "internalType": "struct LibOrder.Order[]",
                        "name": "orders",
                        "type": "tuple[]"
                    }
                ],
                "payable": false,
                "stateMutability": "pure",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "components": [
                            {
                                "internalType": "uint256",
                                "name": "salt",
                                "type": "uint256"
                            },
                            {
                                "internalType": "uint256",
                                "name": "expirationTimeSeconds",
                                "type": "uint256"
                            },
                            {
                                "internalType": "uint256",
                                "name": "gasPrice",
                                "type": "uint256"
                            },
                            {
                                "internalType": "address",
                                "name": "signerAddress",
                                "type": "address"
                            },
                            {
                                "internalType": "bytes",
                                "name": "data",
                                "type": "bytes"
                            }
                        ],
                        "internalType": "struct LibZeroExTransaction.ZeroExTransaction",
                        "name": "transaction",
                        "type": "tuple"
                    },
                    {
                        "internalType": "address",
                        "name": "txOrigin",
                        "type": "address"
                    },
                    {
                        "internalType": "bytes",
                        "name": "transactionSignature",
                        "type": "bytes"
                    },
                    {
                        "internalType": "bytes[]",
                        "name": "approvalSignatures",
                        "type": "bytes[]"
                    }
                ],
                "name": "executeTransaction",
                "outputs": [],
                "payable": true,
                "stateMutability": "payable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    {
                        "components": [
                            {
                                "internalType": "address",
                                "name": "txOrigin",
                                "type": "address"
                            },
                            {
                                "internalType": "bytes32",
                                "name": "transactionHash",
                                "type": "bytes32"
                            },
                            {
                                "internalType": "bytes",
                                "name": "transactionSignature",
                                "type": "bytes"
                            }
                        ],
                        "internalType": "struct LibCoordinatorApproval.CoordinatorApproval",
                        "name": "approval",
                        "type": "tuple"
                    }
                ],
                "name": "getCoordinatorApprovalHash",
                "outputs": [
                    {
                        "internalType": "bytes32",
                        "name": "approvalHash",
                        "type": "bytes32"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    {
                        "internalType": "bytes32",
                        "name": "hash",
                        "type": "bytes32"
                    },
                    {
                        "internalType": "bytes",
                        "name": "signature",
                        "type": "bytes"
                    }
                ],
                "name": "getSignerAddress",
                "outputs": [
                    {
                        "internalType": "address",
                        "name": "signerAddress",
                        "type": "address"
                    }
                ],
                "payable": false,
                "stateMutability": "pure",
                "type": "function"
            }
        ],
        "devdoc": {
            "methods": {
                "assertValidCoordinatorApprovals((uint256,uint256,uint256,address,bytes),address,bytes,bytes[])": {
                    "details": "Validates that the 0x transaction has been approved by all of the feeRecipients      that correspond to each order in the transaction's Exchange calldata.",
                    "params": {
                        "approvalSignatures": "Array of signatures that correspond to the feeRecipients of each        order in the transaction's Exchange calldata.",
                        "transaction": "0x transaction containing salt, signerAddress, and data.",
                        "transactionSignature": "Proof that the transaction has been signed by the signer.",
                        "txOrigin": "Required signer of Ethereum transaction calling this function."
                    }
                },
                "constructor": {
                    "params": {
                        "chainId": "Chain ID of the network this contract is deployed on.",
                        "exchange": "Address of the 0x Exchange contract."
                    }
                },
                "decodeOrdersFromFillData(bytes)": {
                    "details": "Decodes the orders from Exchange calldata representing any fill method.",
                    "params": {
                        "data": "Exchange calldata representing a fill method."
                    },
                    "return": "orders The orders from the Exchange calldata."
                },
                "executeTransaction((uint256,uint256,uint256,address,bytes),address,bytes,bytes[])": {
                    "details": "Executes a 0x transaction that has been signed by the feeRecipients that correspond to      each order in the transaction's Exchange calldata.",
                    "params": {
                        "approvalSignatures": "Array of signatures that correspond to the feeRecipients of each        order in the transaction's Exchange calldata.",
                        "transaction": "0x transaction containing salt, signerAddress, and data.",
                        "transactionSignature": "Proof that the transaction has been signed by the signer.",
                        "txOrigin": "Required signer of Ethereum transaction calling this function."
                    }
                },
                "getCoordinatorApprovalHash((address,bytes32,bytes))": {
                    "details": "Calculates the EIP712 hash of the Coordinator approval mesasage using the domain      separator of this contract.",
                    "params": {
                        "approval": "Coordinator approval message containing the transaction hash, and transaction        signature."
                    },
                    "return": "approvalHash EIP712 hash of the Coordinator approval message with the domain         separator of this contract."
                },
                "getSignerAddress(bytes32,bytes)": {
                    "details": "Recovers the address of a signer given a hash and signature.",
                    "params": {
                        "hash": "Any 32 byte hash.",
                        "signature": "Proof that the hash has been signed by signer."
                    },
                    "return": "signerAddress Address of the signer."
                }
            }
        },
        "evm": {
            "bytecode": {
                "linkReferences": {},
                "object": "0x60806040526002805460ff191690553480156200001b57600080fd5b5060405162002051380380620020518339810160408190526200003e91620001bf565b81818181600080309050620000b36040518060400160405280601781526020017f30782050726f746f636f6c20436f6f7264696e61746f72000000000000000000815250604051806040016040528060058152602001640332e302e360dc1b81525085846200016860201b62001dae1760201c565b6000908155925050506001600160a01b03821615620000d35781620000d5565b305b9050620001306040518060400160405280600b81526020016a0c1e08141c9bdd1bd8dbdb60aa1b815250604051806040016040528060058152602001640332e302e360dc1b81525085846200016860201b62001dae1760201c565b6001555050600280546001600160a01b03909316620100000262010000600160b01b03199093169290921790915550620001f9915050565b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a0902090565b60008060408385031215620001d2578182fd5b82516001600160a01b0381168114620001e9578283fd5b6020939093015192949293505050565b611e4880620002096000396000f3fe6080604052600436106100b15760003560e01c8063da4fe07411610069578063ee55b9681161004e578063ee55b9681461018a578063fb6961cc146101b7578063fdd059a5146101cc576100b1565b8063da4fe07414610162578063e1c7157814610175576100b1565b806389fab5b71161009a57806389fab5b714610109578063b2562b7a1461012b578063c26cfecd14610140576100b1565b80630f7d8e39146100b357806352813679146100e9575b005b3480156100bf57600080fd5b506100d36100ce3660046116c1565b6101ec565b6040516100e09190611a14565b60405180910390f35b3480156100f557600080fd5b506100b1610104366004611888565b610455565b34801561011557600080fd5b5061011e610482565b6040516100e09190611c40565b34801561013757600080fd5b5061011e6104bb565b34801561014c57600080fd5b506101556104f4565b6040516100e09190611ba1565b6100b1610170366004611888565b6104fa565b34801561018157600080fd5b506101556105e8565b34801561019657600080fd5b506101aa6101a5366004611706565b61060c565b6040516100e09190611a35565b3480156101c357600080fd5b50610155610ac0565b3480156101d857600080fd5b506101556101e7366004611774565b610ac6565b80516000908061020a5761020a61020560008686610ad9565b610b7e565b60008360018551038151811061021c57fe5b016020015160f81c90506008811061023d5761023d61020560018787610ad9565b60008160ff16600881111561024e57fe5b9050600081600881111561025e57fe5b14156102785761027361020560028888610ad9565b61043c565b600181600881111561028657fe5b141561029b5761027361020560038888610ad9565b60028160088111156102a957fe5b141561038557826042146102c6576102c661020560008888610ad9565b6000856000815181106102d557fe5b016020015160f81c905060006102f287600163ffffffff610b8616565b9050600061030788602163ffffffff610b8616565b90506001898484846040516000815260200160405260405161032c9493929190611bce565b6020604051602081039080840390855afa15801561034e573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00151975061044f9650505050505050565b600381600881111561039357fe5b141561043c57826042146103b0576103b061020560008888610ad9565b6000856000815181106103bf57fe5b016020015160f81c905060006103dc87600163ffffffff610b8616565b905060006103f188602163ffffffff610b8616565b905060018960405160200161040691906119e3565b604051602081830303815290604052805190602001208484846040516000815260200160405260405161032c9493929190611bce565b61044b61020560018888610ad9565b5050505b92915050565b6060610464856080015161060c565b80519091501561047b5761047b8582868686610bb0565b5050505050565b6040518060400160405280601781526020017f30782050726f746f636f6c20436f6f7264696e61746f7200000000000000000081525081565b6040518060400160405280600581526020017f332e302e3000000000000000000000000000000000000000000000000000000081525081565b60015481565b61050684848484610455565b6002546040517f2280c9100000000000000000000000000000000000000000000000000000000081526201000090910473ffffffffffffffffffffffffffffffffffffffff1690632280c9109034906105659088908790600401611c53565b6000604051808303818588803b15801561057e57600080fd5b505af1158015610592573d6000803e3d6000fd5b50505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526105d99190810190611741565b506105e2610d5d565b50505050565b7fa6511c04ca44625d50986f8c36bedc09366207a17b96e347094053a9f850716881565b60606000610620838263ffffffff610d7316565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167f9b44d5560000000000000000000000000000000000000000000000000000000014806106b357507fffffffff0000000000000000000000000000000000000000000000000000000081167fe14b58c400000000000000000000000000000000000000000000000000000000145b1561073c576106c06112e5565b83516106d690859060049063ffffffff610dbf16565b8060200190516106e991908101906117fe565b604080516001808252818301909252919250816020015b6107086112e5565b815260200190600190039081610700579050509250808360008151811061072b57fe5b602002602001018190525050610aba565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f9694a4020000000000000000000000000000000000000000000000000000000014806107cd57507fffffffff0000000000000000000000000000000000000000000000000000000081167f8ea8dfe400000000000000000000000000000000000000000000000000000000145b8061081957507fffffffff0000000000000000000000000000000000000000000000000000000081167fbeee2e1400000000000000000000000000000000000000000000000000000000145b8061086557507fffffffff0000000000000000000000000000000000000000000000000000000081167f78d29ac100000000000000000000000000000000000000000000000000000000145b806108b157507fffffffff0000000000000000000000000000000000000000000000000000000081167f8bc8efb300000000000000000000000000000000000000000000000000000000145b806108fd57507fffffffff0000000000000000000000000000000000000000000000000000000081167f369da09900000000000000000000000000000000000000000000000000000000145b8061094957507fffffffff0000000000000000000000000000000000000000000000000000000081167fa6c3bf3300000000000000000000000000000000000000000000000000000000145b1561097e57825161096490849060049063ffffffff610dbf16565b8060200190516109779190810190611635565b9150610aba565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f88ec79fb000000000000000000000000000000000000000000000000000000001480610a0f57507fffffffff0000000000000000000000000000000000000000000000000000000081167fb718e29200000000000000000000000000000000000000000000000000000000145b15610aba57610a1c6112e5565b610a246112e5565b8451610a3a90869060049063ffffffff610dbf16565b806020019051610a4d9190810190611831565b60408051600280825260608201909252929450909250816020015b610a706112e5565b815260200190600190039081610a685790505093508184600081518110610a9357fe5b60200260200101819052508084600181518110610aac57fe5b602002602001018190525050505b50919050565b60005481565b600061044f610ad483610e46565b610e99565b606063779c522360e01b848484604051602401610af893929190611c0e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b60008160200183511015610ba757610ba76102056005855185602001610ea7565b50016020015190565b3273ffffffffffffffffffffffffffffffffffffffff841614610bd957610bd961020584610ec6565b6000610be786600154610f65565b60408051600080825260208201909252845192935091905b818114610c9057610c0e6113ac565b60405180606001604052808973ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018881525090506000610c4c82610ac6565b90506000610c6d82898681518110610c6057fe5b60200260200101516101ec565b9050610c7f868263ffffffff610f7916565b95505060019092019150610bff9050565b50610ca1823263ffffffff610f7916565b875190925060005b818114610d5157600073ffffffffffffffffffffffffffffffffffffffff16898281518110610cd457fe5b60200260200101516060015173ffffffffffffffffffffffffffffffffffffffff161415610d0157610d49565b6000898281518110610d0f57fe5b60200260200101516040015190506000610d32828761101b90919063ffffffff16565b905080610d4657610d466102058884611053565b50505b600101610ca9565b50505050505050505050565b610d656110f5565b610d7157610d71611103565b565b60008160040183511015610d9457610d946102056003855185600401610ea7565b5001602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b606081831115610dd857610dd861020560008585610ea7565b8351821115610df157610df16102056001848751610ea7565b8282036040519080825280601f01601f191660200182016040528015610e1e576020820181803883390190505b509050610e3f610e2d8261113c565b84610e378761113c565b018351611142565b9392505050565b604081810151825160209384015182519285019290922083517fa6511c04ca44625d50986f8c36bedc09366207a17b96e347094053a9f85071688152948501919091529183015260608201526080902090565b600061044f60005483611206565b6060632800659560e01b848484604051602401610af893929190611bec565b606063a458d7ff60e01b82604051602401610ee19190611a14565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b6000610e3f82610f7485611240565b611206565b815160405160609184906020808202808401820192910182851015610fa557610fa561020586856112c8565b82851115610fbf57610fb8858583611142565b8497508793505b60018201915060208101905080840192508294508188528460405286886001840381518110610fea57fe5b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015250959695505050505050565b60006020835102602084018181018192505b8083101561044b5782518086141561104757600194508193505b5060208301925061102d565b606063d789b64060e01b8383604051602401611070929190611baa565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905092915050565b600254610100900460ff1690565b47801561113957604051339082156108fc029083906000818181858888f19350505050158015611137573d6000803e3d6000fd5b505b50565b60200190565b602081101561116c576001816020036101000a038019835116818551168082178652505050611201565b8282141561117957611201565b828211156111b35760208103905080820181840181515b828510156111ab578451865260209586019590940193611190565b905250611201565b60208103905080820181840183515b818612156111fc57825182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe092830192909101906111c2565b855250505b505050565b6040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b608081810151825160208085015160408087015160609788015186519685019690962082517fec69816980a3a3ca4554410e60253953e9ff375ba4536a98adfa15cc71541508815294850195909552908301919091529481019490945273ffffffffffffffffffffffffffffffffffffffff9091169183019190915260a082015260c0902090565b6060635fc8372260e01b8383604051602401611070929190611cc9565b604051806101c00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001606081526020016060815260200160608152602001606081525090565b6040805160608082018352600080835260208301529181019190915290565b803561044f81611d8c565b805161044f81611d8c565b600082601f8301126113f1578081fd5b81356114046113ff82611cfe565b611cd7565b8181529150602080830190840160005b838110156114415761142c876020843589010161144b565b83526020928301929190910190600101611414565b5050505092915050565b600082601f83011261145b578081fd5b81356114696113ff82611d1e565b915080825283602082850101111561148057600080fd5b8060208401602084013760009082016020015292915050565b600082601f8301126114a9578081fd5b81516114b76113ff82611d1e565b91508082528360208285010111156114ce57600080fd5b6114df816020840160208601611d60565b5092915050565b60006101c08083850312156114f9578182fd5b61150281611cd7565b91505061150f83836113d6565b815261151e83602084016113d6565b602082015261153083604084016113d6565b604082015261154283606084016113d6565b60608201526080820151608082015260a082015160a082015260c082015160c082015260e082015160e08201526101008083015181830152506101208083015181830152506101408083015167ffffffffffffffff808211156115a457600080fd5b6115b086838701611499565b838501526101609250828501519150808211156115cc57600080fd5b6115d886838701611499565b838501526101809250828501519150808211156115f457600080fd5b61160086838701611499565b838501526101a092508285015191508082111561161c57600080fd5b5061162985828601611499565b82840152505092915050565b60006020808385031215611647578182fd5b825167ffffffffffffffff81111561165d578283fd5b80840185601f82011261166e578384fd5b8051915061167e6113ff83611cfe565b82815283810190828501865b858110156116b3576116a18a8884518801016114e6565b8452928601929086019060010161168a565b509098975050505050505050565b600080604083850312156116d3578081fd5b82359150602083013567ffffffffffffffff8111156116f0578182fd5b6116fc8582860161144b565b9150509250929050565b600060208284031215611717578081fd5b813567ffffffffffffffff81111561172d578182fd5b6117398482850161144b565b949350505050565b600060208284031215611752578081fd5b815167ffffffffffffffff811115611768578182fd5b61173984828501611499565b600060208284031215611785578081fd5b813567ffffffffffffffff8082111561179c578283fd5b818401606081870312156117ae578384fd5b6117b86060611cd7565b925080356117c581611d8c565b8352602081810135908401526040810135828111156117e2578485fd5b6117ee8782840161144b565b6040850152509195945050505050565b60006020828403121561180f578081fd5b815167ffffffffffffffff811115611825578182fd5b611739848285016114e6565b60008060408385031215611843578182fd5b825167ffffffffffffffff8082111561185a578384fd5b611866868387016114e6565b9350602085015191508082111561187b578283fd5b506116fc858286016114e6565b6000806000806080858703121561189d578182fd5b843567ffffffffffffffff808211156118b4578384fd5b81870160a0818a0312156118c6578485fd5b6118d060a0611cd7565b92508035835260208101356020840152604081013560408401526118f789606083016113cb565b606084015260808101358281111561190d578586fd5b6119198a82840161144b565b6080850152505081955061193088602089016113cb565b94506040870135915080821115611945578384fd5b6119518883890161144b565b93506060870135915080821115611966578283fd5b50611973878288016113e1565b91505092959194509250565b73ffffffffffffffffffffffffffffffffffffffff169052565b600081518084526119b1816020860160208601611d60565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6000602080830181845280855180835260408601915060408482028701019250838701855b82811015611b94577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845281516101c0611a9987835161197f565b87820151611aa98989018261197f565b506040820151611abc604089018261197f565b506060820151611acf606089018261197f565b506080820151608088015260a082015160a088015260c082015160c088015260e082015160e08801526101008083015181890152506101208083015181890152506101408083015182828a0152611b28838a0182611999565b915050610160915081830151888203838a0152611b458282611999565b9250505061018080830151888303828a0152611b618382611999565b9150506101a0915081830151888203838a0152611b7e8282611999565b9850505094870194505090850190600101611a5a565b5092979650505050505050565b90815260200190565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b6060810160088510611bfa57fe5b938152602081019290925260409091015290565b600060048510611c1a57fe5b84825283602083015260606040830152611c376060830184611999565b95945050505050565b600060208252610e3f6020830184611999565b60006040825283516040830152602084015160608301526040840151608083015273ffffffffffffffffffffffffffffffffffffffff60608501511660a0830152608084015160a060c0840152611cad60e0840182611999565b8381036020850152611cbf8186611999565b9695505050505050565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715611cf657600080fd5b604052919050565b600067ffffffffffffffff821115611d14578081fd5b5060209081020190565b600067ffffffffffffffff821115611d34578081fd5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b83811015611d7b578181015183820152602001611d63565b838111156105e25750506000910152565b73ffffffffffffffffffffffffffffffffffffffff8116811461113957600080fd5b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a090209056fea365627a7a723158208cc6ef9b1174a10beabaaa35e73d7ac5808e8ccb2b413ac457bbec7f01bd88156c6578706572696d656e74616cf564736f6c63430005110040",
                "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE CALLVALUE DUP1 ISZERO PUSH3 0x1B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x2051 CODESIZE SUB DUP1 PUSH3 0x2051 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH3 0x3E SWAP2 PUSH3 0x1BF JUMP JUMPDEST DUP2 DUP2 DUP2 DUP2 PUSH1 0x0 DUP1 ADDRESS SWAP1 POP PUSH3 0xB3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x17 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x30782050726F746F636F6C20436F6F7264696E61746F72000000000000000000 DUP2 MSTORE POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH5 0x332E302E3 PUSH1 0xDC SHL DUP2 MSTORE POP DUP6 DUP5 PUSH3 0x168 PUSH1 0x20 SHL PUSH3 0x1DAE OR PUSH1 0x20 SHR JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 SSTORE SWAP3 POP POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND ISZERO PUSH3 0xD3 JUMPI DUP2 PUSH3 0xD5 JUMP JUMPDEST ADDRESS JUMPDEST SWAP1 POP PUSH3 0x130 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0xB DUP2 MSTORE PUSH1 0x20 ADD PUSH11 0xC1E08141C9BDD1BD8DBDB PUSH1 0xAA SHL DUP2 MSTORE POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH5 0x332E302E3 PUSH1 0xDC SHL DUP2 MSTORE POP DUP6 DUP5 PUSH3 0x168 PUSH1 0x20 SHL PUSH3 0x1DAE OR PUSH1 0x20 SHR JUMP JUMPDEST PUSH1 0x1 SSTORE POP POP PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP4 AND PUSH3 0x10000 MUL PUSH3 0x10000 PUSH1 0x1 PUSH1 0xB0 SHL SUB NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 SSTORE POP PUSH3 0x1F9 SWAP2 POP POP JUMP JUMPDEST DUP4 MLOAD PUSH1 0x20 SWAP5 DUP6 ADD KECCAK256 DUP4 MLOAD SWAP4 DUP6 ADD SWAP4 SWAP1 SWAP4 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F DUP2 MSTORE SWAP6 DUP7 ADD SWAP5 SWAP1 SWAP5 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH3 0x1D2 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH3 0x1E9 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD MLOAD SWAP3 SWAP5 SWAP3 SWAP4 POP POP POP JUMP JUMPDEST PUSH2 0x1E48 DUP1 PUSH3 0x209 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xB1 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xDA4FE074 GT PUSH2 0x69 JUMPI DUP1 PUSH4 0xEE55B968 GT PUSH2 0x4E JUMPI DUP1 PUSH4 0xEE55B968 EQ PUSH2 0x18A JUMPI DUP1 PUSH4 0xFB6961CC EQ PUSH2 0x1B7 JUMPI DUP1 PUSH4 0xFDD059A5 EQ PUSH2 0x1CC JUMPI PUSH2 0xB1 JUMP JUMPDEST DUP1 PUSH4 0xDA4FE074 EQ PUSH2 0x162 JUMPI DUP1 PUSH4 0xE1C71578 EQ PUSH2 0x175 JUMPI PUSH2 0xB1 JUMP JUMPDEST DUP1 PUSH4 0x89FAB5B7 GT PUSH2 0x9A JUMPI DUP1 PUSH4 0x89FAB5B7 EQ PUSH2 0x109 JUMPI DUP1 PUSH4 0xB2562B7A EQ PUSH2 0x12B JUMPI DUP1 PUSH4 0xC26CFECD EQ PUSH2 0x140 JUMPI PUSH2 0xB1 JUMP JUMPDEST DUP1 PUSH4 0xF7D8E39 EQ PUSH2 0xB3 JUMPI DUP1 PUSH4 0x52813679 EQ PUSH2 0xE9 JUMPI JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xBF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0xCE CALLDATASIZE PUSH1 0x4 PUSH2 0x16C1 JUMP JUMPDEST PUSH2 0x1EC JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xE0 SWAP2 SWAP1 PUSH2 0x1A14 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB1 PUSH2 0x104 CALLDATASIZE PUSH1 0x4 PUSH2 0x1888 JUMP JUMPDEST PUSH2 0x455 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x115 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11E PUSH2 0x482 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xE0 SWAP2 SWAP1 PUSH2 0x1C40 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x137 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11E PUSH2 0x4BB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x14C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x155 PUSH2 0x4F4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xE0 SWAP2 SWAP1 PUSH2 0x1BA1 JUMP JUMPDEST PUSH2 0xB1 PUSH2 0x170 CALLDATASIZE PUSH1 0x4 PUSH2 0x1888 JUMP JUMPDEST PUSH2 0x4FA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x181 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x155 PUSH2 0x5E8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x196 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AA PUSH2 0x1A5 CALLDATASIZE PUSH1 0x4 PUSH2 0x1706 JUMP JUMPDEST PUSH2 0x60C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xE0 SWAP2 SWAP1 PUSH2 0x1A35 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x155 PUSH2 0xAC0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1D8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x155 PUSH2 0x1E7 CALLDATASIZE PUSH1 0x4 PUSH2 0x1774 JUMP JUMPDEST PUSH2 0xAC6 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 DUP1 PUSH2 0x20A JUMPI PUSH2 0x20A PUSH2 0x205 PUSH1 0x0 DUP7 DUP7 PUSH2 0xAD9 JUMP JUMPDEST PUSH2 0xB7E JUMP JUMPDEST PUSH1 0x0 DUP4 PUSH1 0x1 DUP6 MLOAD SUB DUP2 MLOAD DUP2 LT PUSH2 0x21C JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 SHR SWAP1 POP PUSH1 0x8 DUP2 LT PUSH2 0x23D JUMPI PUSH2 0x23D PUSH2 0x205 PUSH1 0x1 DUP8 DUP8 PUSH2 0xAD9 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0xFF AND PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x24E JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x25E JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x278 JUMPI PUSH2 0x273 PUSH2 0x205 PUSH1 0x2 DUP9 DUP9 PUSH2 0xAD9 JUMP JUMPDEST PUSH2 0x43C JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x286 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x29B JUMPI PUSH2 0x273 PUSH2 0x205 PUSH1 0x3 DUP9 DUP9 PUSH2 0xAD9 JUMP JUMPDEST PUSH1 0x2 DUP2 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x2A9 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x385 JUMPI DUP3 PUSH1 0x42 EQ PUSH2 0x2C6 JUMPI PUSH2 0x2C6 PUSH2 0x205 PUSH1 0x0 DUP9 DUP9 PUSH2 0xAD9 JUMP JUMPDEST PUSH1 0x0 DUP6 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x2D5 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 SHR SWAP1 POP PUSH1 0x0 PUSH2 0x2F2 DUP8 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0xB86 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x307 DUP9 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0xB86 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x1 DUP10 DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x32C SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1BCE JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x34E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD SWAP8 POP PUSH2 0x44F SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x3 DUP2 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x393 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x43C JUMPI DUP3 PUSH1 0x42 EQ PUSH2 0x3B0 JUMPI PUSH2 0x3B0 PUSH2 0x205 PUSH1 0x0 DUP9 DUP9 PUSH2 0xAD9 JUMP JUMPDEST PUSH1 0x0 DUP6 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x3BF JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 SHR SWAP1 POP PUSH1 0x0 PUSH2 0x3DC DUP8 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0xB86 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x3F1 DUP9 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0xB86 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x1 DUP10 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x406 SWAP2 SWAP1 PUSH2 0x19E3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x32C SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1BCE JUMP JUMPDEST PUSH2 0x44B PUSH2 0x205 PUSH1 0x1 DUP9 DUP9 PUSH2 0xAD9 JUMP JUMPDEST POP POP POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x464 DUP6 PUSH1 0x80 ADD MLOAD PUSH2 0x60C JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x47B JUMPI PUSH2 0x47B DUP6 DUP3 DUP7 DUP7 DUP7 PUSH2 0xBB0 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x17 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x30782050726F746F636F6C20436F6F7264696E61746F72000000000000000000 DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x332E302E30000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x1 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x506 DUP5 DUP5 DUP5 DUP5 PUSH2 0x455 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x40 MLOAD PUSH32 0x2280C91000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH3 0x10000 SWAP1 SWAP2 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x2280C910 SWAP1 CALLVALUE SWAP1 PUSH2 0x565 SWAP1 DUP9 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x1C53 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x57E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x592 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP3 ADD PUSH1 0x40 MSTORE PUSH2 0x5D9 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1741 JUMP JUMPDEST POP PUSH2 0x5E2 PUSH2 0xD5D JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH32 0xA6511C04CA44625D50986F8C36BEDC09366207A17B96E347094053A9F8507168 DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x620 DUP4 DUP3 PUSH4 0xFFFFFFFF PUSH2 0xD73 AND JUMP JUMPDEST SWAP1 POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x9B44D55600000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0x6B3 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xE14B58C400000000000000000000000000000000000000000000000000000000 EQ JUMPDEST ISZERO PUSH2 0x73C JUMPI PUSH2 0x6C0 PUSH2 0x12E5 JUMP JUMPDEST DUP4 MLOAD PUSH2 0x6D6 SWAP1 DUP6 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0xDBF AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x6E9 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x17FE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE SWAP2 SWAP3 POP DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0x708 PUSH2 0x12E5 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x700 JUMPI SWAP1 POP POP SWAP3 POP DUP1 DUP4 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x72B JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP POP PUSH2 0xABA JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x9694A40200000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0x7CD JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x8EA8DFE400000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x819 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xBEEE2E1400000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x865 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x78D29AC100000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x8B1 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x8BC8EFB300000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x8FD JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x369DA09900000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x949 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xA6C3BF3300000000000000000000000000000000000000000000000000000000 EQ JUMPDEST ISZERO PUSH2 0x97E JUMPI DUP3 MLOAD PUSH2 0x964 SWAP1 DUP5 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0xDBF AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x977 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1635 JUMP JUMPDEST SWAP2 POP PUSH2 0xABA JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x88EC79FB00000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0xA0F JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xB718E29200000000000000000000000000000000000000000000000000000000 EQ JUMPDEST ISZERO PUSH2 0xABA JUMPI PUSH2 0xA1C PUSH2 0x12E5 JUMP JUMPDEST PUSH2 0xA24 PUSH2 0x12E5 JUMP JUMPDEST DUP5 MLOAD PUSH2 0xA3A SWAP1 DUP7 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0xDBF AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0xA4D SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1831 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x2 DUP1 DUP3 MSTORE PUSH1 0x60 DUP3 ADD SWAP1 SWAP3 MSTORE SWAP3 SWAP5 POP SWAP1 SWAP3 POP DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0xA70 PUSH2 0x12E5 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0xA68 JUMPI SWAP1 POP POP SWAP4 POP DUP2 DUP5 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0xA93 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP DUP1 DUP5 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0xAAC JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP POP POP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x44F PUSH2 0xAD4 DUP4 PUSH2 0xE46 JUMP JUMPDEST PUSH2 0xE99 JUMP JUMPDEST PUSH1 0x60 PUSH4 0x779C5223 PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0xAF8 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1C0E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH2 0xBA7 JUMPI PUSH2 0xBA7 PUSH2 0x205 PUSH1 0x5 DUP6 MLOAD DUP6 PUSH1 0x20 ADD PUSH2 0xEA7 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST ORIGIN PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND EQ PUSH2 0xBD9 JUMPI PUSH2 0xBD9 PUSH2 0x205 DUP5 PUSH2 0xEC6 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBE7 DUP7 PUSH1 0x1 SLOAD PUSH2 0xF65 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 SWAP3 MSTORE DUP5 MLOAD SWAP3 SWAP4 POP SWAP2 SWAP1 JUMPDEST DUP2 DUP2 EQ PUSH2 0xC90 JUMPI PUSH2 0xC0E PUSH2 0x13AC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP7 DUP2 MSTORE PUSH1 0x20 ADD DUP9 DUP2 MSTORE POP SWAP1 POP PUSH1 0x0 PUSH2 0xC4C DUP3 PUSH2 0xAC6 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xC6D DUP3 DUP10 DUP7 DUP2 MLOAD DUP2 LT PUSH2 0xC60 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x1EC JUMP JUMPDEST SWAP1 POP PUSH2 0xC7F DUP7 DUP3 PUSH4 0xFFFFFFFF PUSH2 0xF79 AND JUMP JUMPDEST SWAP6 POP POP PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 POP PUSH2 0xBFF SWAP1 POP JUMP JUMPDEST POP PUSH2 0xCA1 DUP3 ORIGIN PUSH4 0xFFFFFFFF PUSH2 0xF79 AND JUMP JUMPDEST DUP8 MLOAD SWAP1 SWAP3 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0xD51 JUMPI PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP10 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0xCD4 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xD01 JUMPI PUSH2 0xD49 JUMP JUMPDEST PUSH1 0x0 DUP10 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0xD0F JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 ADD MLOAD SWAP1 POP PUSH1 0x0 PUSH2 0xD32 DUP3 DUP8 PUSH2 0x101B SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP DUP1 PUSH2 0xD46 JUMPI PUSH2 0xD46 PUSH2 0x205 DUP9 DUP5 PUSH2 0x1053 JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x1 ADD PUSH2 0xCA9 JUMP JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0xD65 PUSH2 0x10F5 JUMP JUMPDEST PUSH2 0xD71 JUMPI PUSH2 0xD71 PUSH2 0x1103 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 ADD DUP4 MLOAD LT ISZERO PUSH2 0xD94 JUMPI PUSH2 0xD94 PUSH2 0x205 PUSH1 0x3 DUP6 MLOAD DUP6 PUSH1 0x4 ADD PUSH2 0xEA7 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 DUP4 GT ISZERO PUSH2 0xDD8 JUMPI PUSH2 0xDD8 PUSH2 0x205 PUSH1 0x0 DUP6 DUP6 PUSH2 0xEA7 JUMP JUMPDEST DUP4 MLOAD DUP3 GT ISZERO PUSH2 0xDF1 JUMPI PUSH2 0xDF1 PUSH2 0x205 PUSH1 0x1 DUP5 DUP8 MLOAD PUSH2 0xEA7 JUMP JUMPDEST DUP3 DUP3 SUB PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xE1E JUMPI PUSH1 0x20 DUP3 ADD DUP2 DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH2 0xE3F PUSH2 0xE2D DUP3 PUSH2 0x113C JUMP JUMPDEST DUP5 PUSH2 0xE37 DUP8 PUSH2 0x113C JUMP JUMPDEST ADD DUP4 MLOAD PUSH2 0x1142 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 DUP2 ADD MLOAD DUP3 MLOAD PUSH1 0x20 SWAP4 DUP5 ADD MLOAD DUP3 MLOAD SWAP3 DUP6 ADD SWAP3 SWAP1 SWAP3 KECCAK256 DUP4 MLOAD PUSH32 0xA6511C04CA44625D50986F8C36BEDC09366207A17B96E347094053A9F8507168 DUP2 MSTORE SWAP5 DUP6 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP2 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x44F PUSH1 0x0 SLOAD DUP4 PUSH2 0x1206 JUMP JUMPDEST PUSH1 0x60 PUSH4 0x28006595 PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0xAF8 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1BEC JUMP JUMPDEST PUSH1 0x60 PUSH4 0xA458D7FF PUSH1 0xE0 SHL DUP3 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0xEE1 SWAP2 SWAP1 PUSH2 0x1A14 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE3F DUP3 PUSH2 0xF74 DUP6 PUSH2 0x1240 JUMP JUMPDEST PUSH2 0x1206 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x40 MLOAD PUSH1 0x60 SWAP2 DUP5 SWAP1 PUSH1 0x20 DUP1 DUP3 MUL DUP1 DUP5 ADD DUP3 ADD SWAP3 SWAP2 ADD DUP3 DUP6 LT ISZERO PUSH2 0xFA5 JUMPI PUSH2 0xFA5 PUSH2 0x205 DUP7 DUP6 PUSH2 0x12C8 JUMP JUMPDEST DUP3 DUP6 GT ISZERO PUSH2 0xFBF JUMPI PUSH2 0xFB8 DUP6 DUP6 DUP4 PUSH2 0x1142 JUMP JUMPDEST DUP5 SWAP8 POP DUP8 SWAP4 POP JUMPDEST PUSH1 0x1 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP1 DUP5 ADD SWAP3 POP DUP3 SWAP5 POP DUP2 DUP9 MSTORE DUP5 PUSH1 0x40 MSTORE DUP7 DUP9 PUSH1 0x1 DUP5 SUB DUP2 MLOAD DUP2 LT PUSH2 0xFEA JUMPI INVALID JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x20 SWAP3 DUP4 MUL SWAP2 SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE POP SWAP6 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP4 MLOAD MUL PUSH1 0x20 DUP5 ADD DUP2 DUP2 ADD DUP2 SWAP3 POP JUMPDEST DUP1 DUP4 LT ISZERO PUSH2 0x44B JUMPI DUP3 MLOAD DUP1 DUP7 EQ ISZERO PUSH2 0x1047 JUMPI PUSH1 0x1 SWAP5 POP DUP2 SWAP4 POP JUMPDEST POP PUSH1 0x20 DUP4 ADD SWAP3 POP PUSH2 0x102D JUMP JUMPDEST PUSH1 0x60 PUSH4 0xD789B640 PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1070 SWAP3 SWAP2 SWAP1 PUSH2 0x1BAA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND SWAP1 JUMP JUMPDEST SELFBALANCE DUP1 ISZERO PUSH2 0x1139 JUMPI PUSH1 0x40 MLOAD CALLER SWAP1 DUP3 ISZERO PUSH2 0x8FC MUL SWAP1 DUP4 SWAP1 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x1137 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP JUMPDEST POP JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x116C JUMPI PUSH1 0x1 DUP2 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP4 MLOAD AND DUP2 DUP6 MLOAD AND DUP1 DUP3 OR DUP7 MSTORE POP POP POP PUSH2 0x1201 JUMP JUMPDEST DUP3 DUP3 EQ ISZERO PUSH2 0x1179 JUMPI PUSH2 0x1201 JUMP JUMPDEST DUP3 DUP3 GT ISZERO PUSH2 0x11B3 JUMPI PUSH1 0x20 DUP2 SUB SWAP1 POP DUP1 DUP3 ADD DUP2 DUP5 ADD DUP2 MLOAD JUMPDEST DUP3 DUP6 LT ISZERO PUSH2 0x11AB JUMPI DUP5 MLOAD DUP7 MSTORE PUSH1 0x20 SWAP6 DUP7 ADD SWAP6 SWAP1 SWAP5 ADD SWAP4 PUSH2 0x1190 JUMP JUMPDEST SWAP1 MSTORE POP PUSH2 0x1201 JUMP JUMPDEST PUSH1 0x20 DUP2 SUB SWAP1 POP DUP1 DUP3 ADD DUP2 DUP5 ADD DUP4 MLOAD JUMPDEST DUP2 DUP7 SLT ISZERO PUSH2 0x11FC JUMPI DUP3 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x11C2 JUMP JUMPDEST DUP6 MSTORE POP POP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x2 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x22 DUP3 ADD MSTORE PUSH1 0x42 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x80 DUP2 DUP2 ADD MLOAD DUP3 MLOAD PUSH1 0x20 DUP1 DUP6 ADD MLOAD PUSH1 0x40 DUP1 DUP8 ADD MLOAD PUSH1 0x60 SWAP8 DUP9 ADD MLOAD DUP7 MLOAD SWAP7 DUP6 ADD SWAP7 SWAP1 SWAP7 KECCAK256 DUP3 MLOAD PUSH32 0xEC69816980A3A3CA4554410E60253953E9FF375BA4536A98ADFA15CC71541508 DUP2 MSTORE SWAP5 DUP6 ADD SWAP6 SWAP1 SWAP6 MSTORE SWAP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP5 DUP2 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH4 0x5FC83722 PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1070 SWAP3 SWAP2 SWAP1 PUSH2 0x1CC9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH2 0x1C0 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP1 DUP3 ADD DUP4 MSTORE PUSH1 0x0 DUP1 DUP4 MSTORE PUSH1 0x20 DUP4 ADD MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH2 0x44F DUP2 PUSH2 0x1D8C JUMP JUMPDEST DUP1 MLOAD PUSH2 0x44F DUP2 PUSH2 0x1D8C JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x13F1 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1404 PUSH2 0x13FF DUP3 PUSH2 0x1CFE JUMP JUMPDEST PUSH2 0x1CD7 JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 ADD PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1441 JUMPI PUSH2 0x142C DUP8 PUSH1 0x20 DUP5 CALLDATALOAD DUP10 ADD ADD PUSH2 0x144B JUMP JUMPDEST DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1414 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x145B JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1469 PUSH2 0x13FF DUP3 PUSH2 0x1D1E JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x1480 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP5 ADD CALLDATACOPY PUSH1 0x0 SWAP1 DUP3 ADD PUSH1 0x20 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x14A9 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x14B7 PUSH2 0x13FF DUP3 PUSH2 0x1D1E JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x14CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x14DF DUP2 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x1D60 JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1C0 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x14F9 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x1502 DUP2 PUSH2 0x1CD7 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x150F DUP4 DUP4 PUSH2 0x13D6 JUMP JUMPDEST DUP2 MSTORE PUSH2 0x151E DUP4 PUSH1 0x20 DUP5 ADD PUSH2 0x13D6 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x1530 DUP4 PUSH1 0x40 DUP5 ADD PUSH2 0x13D6 JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x1542 DUP4 PUSH1 0x60 DUP5 ADD PUSH2 0x13D6 JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 DUP3 ADD MLOAD PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 DUP3 ADD MLOAD PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 DUP3 ADD MLOAD PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xE0 DUP3 ADD MLOAD PUSH1 0xE0 DUP3 ADD MSTORE PUSH2 0x100 DUP1 DUP4 ADD MLOAD DUP2 DUP4 ADD MSTORE POP PUSH2 0x120 DUP1 DUP4 ADD MLOAD DUP2 DUP4 ADD MSTORE POP PUSH2 0x140 DUP1 DUP4 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x15A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x15B0 DUP7 DUP4 DUP8 ADD PUSH2 0x1499 JUMP JUMPDEST DUP4 DUP6 ADD MSTORE PUSH2 0x160 SWAP3 POP DUP3 DUP6 ADD MLOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x15CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x15D8 DUP7 DUP4 DUP8 ADD PUSH2 0x1499 JUMP JUMPDEST DUP4 DUP6 ADD MSTORE PUSH2 0x180 SWAP3 POP DUP3 DUP6 ADD MLOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x15F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1600 DUP7 DUP4 DUP8 ADD PUSH2 0x1499 JUMP JUMPDEST DUP4 DUP6 ADD MSTORE PUSH2 0x1A0 SWAP3 POP DUP3 DUP6 ADD MLOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x161C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1629 DUP6 DUP3 DUP7 ADD PUSH2 0x1499 JUMP JUMPDEST DUP3 DUP5 ADD MSTORE POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1647 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x165D JUMPI DUP3 DUP4 REVERT JUMPDEST DUP1 DUP5 ADD DUP6 PUSH1 0x1F DUP3 ADD SLT PUSH2 0x166E JUMPI DUP4 DUP5 REVERT JUMPDEST DUP1 MLOAD SWAP2 POP PUSH2 0x167E PUSH2 0x13FF DUP4 PUSH2 0x1CFE JUMP JUMPDEST DUP3 DUP2 MSTORE DUP4 DUP2 ADD SWAP1 DUP3 DUP6 ADD DUP7 JUMPDEST DUP6 DUP2 LT ISZERO PUSH2 0x16B3 JUMPI PUSH2 0x16A1 DUP11 DUP9 DUP5 MLOAD DUP9 ADD ADD PUSH2 0x14E6 JUMP JUMPDEST DUP5 MSTORE SWAP3 DUP7 ADD SWAP3 SWAP1 DUP7 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x168A JUMP JUMPDEST POP SWAP1 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x16D3 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP3 CALLDATALOAD SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x16F0 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x16FC DUP6 DUP3 DUP7 ADD PUSH2 0x144B JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1717 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x172D JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x1739 DUP5 DUP3 DUP6 ADD PUSH2 0x144B JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1752 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1768 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x1739 DUP5 DUP3 DUP6 ADD PUSH2 0x1499 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1785 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x179C JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP5 ADD PUSH1 0x60 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x17AE JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x17B8 PUSH1 0x60 PUSH2 0x1CD7 JUMP JUMPDEST SWAP3 POP DUP1 CALLDATALOAD PUSH2 0x17C5 DUP2 PUSH2 0x1D8C JUMP JUMPDEST DUP4 MSTORE PUSH1 0x20 DUP2 DUP2 ADD CALLDATALOAD SWAP1 DUP5 ADD MSTORE PUSH1 0x40 DUP2 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0x17E2 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x17EE DUP8 DUP3 DUP5 ADD PUSH2 0x144B JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MSTORE POP SWAP2 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x180F JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1825 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x1739 DUP5 DUP3 DUP6 ADD PUSH2 0x14E6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1843 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x185A JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x1866 DUP7 DUP4 DUP8 ADD PUSH2 0x14E6 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD MLOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x187B JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x16FC DUP6 DUP3 DUP7 ADD PUSH2 0x14E6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x189D JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x18B4 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP8 ADD PUSH1 0xA0 DUP2 DUP11 SUB SLT ISZERO PUSH2 0x18C6 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x18D0 PUSH1 0xA0 PUSH2 0x1CD7 JUMP JUMPDEST SWAP3 POP DUP1 CALLDATALOAD DUP4 MSTORE PUSH1 0x20 DUP2 ADD CALLDATALOAD PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP2 ADD CALLDATALOAD PUSH1 0x40 DUP5 ADD MSTORE PUSH2 0x18F7 DUP10 PUSH1 0x60 DUP4 ADD PUSH2 0x13CB JUMP JUMPDEST PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x80 DUP2 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0x190D JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH2 0x1919 DUP11 DUP3 DUP5 ADD PUSH2 0x144B JUMP JUMPDEST PUSH1 0x80 DUP6 ADD MSTORE POP POP DUP2 SWAP6 POP PUSH2 0x1930 DUP9 PUSH1 0x20 DUP10 ADD PUSH2 0x13CB JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1945 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x1951 DUP9 DUP4 DUP10 ADD PUSH2 0x144B JUMP JUMPDEST SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1966 JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x1973 DUP8 DUP3 DUP9 ADD PUSH2 0x13E1 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x19B1 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x1D60 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE PUSH1 0x1C DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x3C ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 ADD DUP2 DUP5 MSTORE DUP1 DUP6 MLOAD DUP1 DUP4 MSTORE PUSH1 0x40 DUP7 ADD SWAP2 POP PUSH1 0x40 DUP5 DUP3 MUL DUP8 ADD ADD SWAP3 POP DUP4 DUP8 ADD DUP6 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x1B94 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 DUP9 DUP7 SUB ADD DUP5 MSTORE DUP2 MLOAD PUSH2 0x1C0 PUSH2 0x1A99 DUP8 DUP4 MLOAD PUSH2 0x197F JUMP JUMPDEST DUP8 DUP3 ADD MLOAD PUSH2 0x1AA9 DUP10 DUP10 ADD DUP3 PUSH2 0x197F JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x1ABC PUSH1 0x40 DUP10 ADD DUP3 PUSH2 0x197F JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH2 0x1ACF PUSH1 0x60 DUP10 ADD DUP3 PUSH2 0x197F JUMP JUMPDEST POP PUSH1 0x80 DUP3 ADD MLOAD PUSH1 0x80 DUP9 ADD MSTORE PUSH1 0xA0 DUP3 ADD MLOAD PUSH1 0xA0 DUP9 ADD MSTORE PUSH1 0xC0 DUP3 ADD MLOAD PUSH1 0xC0 DUP9 ADD MSTORE PUSH1 0xE0 DUP3 ADD MLOAD PUSH1 0xE0 DUP9 ADD MSTORE PUSH2 0x100 DUP1 DUP4 ADD MLOAD DUP2 DUP10 ADD MSTORE POP PUSH2 0x120 DUP1 DUP4 ADD MLOAD DUP2 DUP10 ADD MSTORE POP PUSH2 0x140 DUP1 DUP4 ADD MLOAD DUP3 DUP3 DUP11 ADD MSTORE PUSH2 0x1B28 DUP4 DUP11 ADD DUP3 PUSH2 0x1999 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x160 SWAP2 POP DUP2 DUP4 ADD MLOAD DUP9 DUP3 SUB DUP4 DUP11 ADD MSTORE PUSH2 0x1B45 DUP3 DUP3 PUSH2 0x1999 JUMP JUMPDEST SWAP3 POP POP POP PUSH2 0x180 DUP1 DUP4 ADD MLOAD DUP9 DUP4 SUB DUP3 DUP11 ADD MSTORE PUSH2 0x1B61 DUP4 DUP3 PUSH2 0x1999 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x1A0 SWAP2 POP DUP2 DUP4 ADD MLOAD DUP9 DUP3 SUB DUP4 DUP11 ADD MSTORE PUSH2 0x1B7E DUP3 DUP3 PUSH2 0x1999 JUMP JUMPDEST SWAP9 POP POP POP SWAP5 DUP8 ADD SWAP5 POP POP SWAP1 DUP6 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1A5A JUMP JUMPDEST POP SWAP3 SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP2 DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH1 0x8 DUP6 LT PUSH2 0x1BFA JUMPI INVALID JUMPDEST SWAP4 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x4 DUP6 LT PUSH2 0x1C1A JUMPI INVALID JUMPDEST DUP5 DUP3 MSTORE DUP4 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x60 PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x1C37 PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x1999 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0xE3F PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x1999 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 MSTORE DUP4 MLOAD PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x20 DUP5 ADD MLOAD PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x80 DUP4 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x60 DUP6 ADD MLOAD AND PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0x80 DUP5 ADD MLOAD PUSH1 0xA0 PUSH1 0xC0 DUP5 ADD MSTORE PUSH2 0x1CAD PUSH1 0xE0 DUP5 ADD DUP3 PUSH2 0x1999 JUMP JUMPDEST DUP4 DUP2 SUB PUSH1 0x20 DUP6 ADD MSTORE PUSH2 0x1CBF DUP2 DUP7 PUSH2 0x1999 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x1CF6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1D14 JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1D34 JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1D7B JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1D63 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x5E2 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x1139 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 MLOAD PUSH1 0x20 SWAP5 DUP6 ADD KECCAK256 DUP4 MLOAD SWAP4 DUP6 ADD SWAP4 SWAP1 SWAP4 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F DUP2 MSTORE SWAP6 DUP7 ADD SWAP5 SWAP1 SWAP5 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 SWAP1 KECCAK256 SWAP1 JUMP INVALID LOG3 PUSH6 0x627A7A723158 KECCAK256 DUP13 0xC6 0xEF SWAP12 GT PUSH21 0xA10BEABAAA35E73D7AC5808E8CCB2B413AC457BBEC PUSH32 0x1BD88156C6578706572696D656E74616CF564736F6C63430005110040000000 ",
                "sourceMap": "964:487:0:-;;;744:28:32;;;-1:-1:-1;;744:28:32;;;1242:207:0;5:2:-1;;;;30:1;27;20:12;5:2;1242:207:0;;;;;;;;;;;;;;;;;;;;;1326:8;1424:7;1326:8;1424:7;1388:1;;1573:4:10;1469:156;;1668:186;1708:30;;;;;;;;;;;;;;;;;1752:33;;;;;;;;;;;;;-1:-1:-1;;;1752:33:10;;;1799:7;1820:24;1668:26;;;;;:186;;:::i;:::-;1635:30;:219;;;:30;-1:-1:-1;;;;;;;;1512:46:34;;;:97;;1577:32;1512:97;;;1569:4;1512:97;1477:132;;1649:182;1689:28;;;;;;;;;;;;;-1:-1:-1;;;1689:28:34;;;1731:31;;;;;;;;;;;;;-1:-1:-1;;;1731:31:34;;;1776:7;1797:24;1649:26;;;;;:182;;:::i;:::-;1619:27;:212;-1:-1:-1;;942:8:7;:34;;-1:-1:-1;;;;;942:34:7;;;;;-1:-1:-1;;;;;;942:34:7;;;;;;;;;;-1:-1:-1;964:487:0;;-1:-1:-1;;964:487:0;1285:1263:27;1997:11;;1992:2;1982:13;;;1972:37;2069:14;;2051:16;;;2041:43;;;;2158:2;2152:9;;962:66;2213:26;;2259:15;;;2252:33;;;;2305:15;;;2298:36;;;;2366:2;2354:15;;2347:32;2411:3;2399:16;;2392:43;2505:3;2487:22;;;1285:1263::o;287:399:-1:-;;;419:2;407:9;398:7;394:23;390:32;387:2;;;-1:-1;;425:12;387:2;83:13;;-1:-1;;;;;853:54;;1057:35;;1047:2;;-1:-1;;1096:12;1047:2;588;638:22;;;;224:13;477:74;;224:13;;-1:-1;;;381:305;;964:487:0;;;;;;"
            },
            "deployedBytecode": {
                "linkReferences": {},
                "object": "0x6080604052600436106100b15760003560e01c8063da4fe07411610069578063ee55b9681161004e578063ee55b9681461018a578063fb6961cc146101b7578063fdd059a5146101cc576100b1565b8063da4fe07414610162578063e1c7157814610175576100b1565b806389fab5b71161009a57806389fab5b714610109578063b2562b7a1461012b578063c26cfecd14610140576100b1565b80630f7d8e39146100b357806352813679146100e9575b005b3480156100bf57600080fd5b506100d36100ce3660046116c1565b6101ec565b6040516100e09190611a14565b60405180910390f35b3480156100f557600080fd5b506100b1610104366004611888565b610455565b34801561011557600080fd5b5061011e610482565b6040516100e09190611c40565b34801561013757600080fd5b5061011e6104bb565b34801561014c57600080fd5b506101556104f4565b6040516100e09190611ba1565b6100b1610170366004611888565b6104fa565b34801561018157600080fd5b506101556105e8565b34801561019657600080fd5b506101aa6101a5366004611706565b61060c565b6040516100e09190611a35565b3480156101c357600080fd5b50610155610ac0565b3480156101d857600080fd5b506101556101e7366004611774565b610ac6565b80516000908061020a5761020a61020560008686610ad9565b610b7e565b60008360018551038151811061021c57fe5b016020015160f81c90506008811061023d5761023d61020560018787610ad9565b60008160ff16600881111561024e57fe5b9050600081600881111561025e57fe5b14156102785761027361020560028888610ad9565b61043c565b600181600881111561028657fe5b141561029b5761027361020560038888610ad9565b60028160088111156102a957fe5b141561038557826042146102c6576102c661020560008888610ad9565b6000856000815181106102d557fe5b016020015160f81c905060006102f287600163ffffffff610b8616565b9050600061030788602163ffffffff610b8616565b90506001898484846040516000815260200160405260405161032c9493929190611bce565b6020604051602081039080840390855afa15801561034e573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00151975061044f9650505050505050565b600381600881111561039357fe5b141561043c57826042146103b0576103b061020560008888610ad9565b6000856000815181106103bf57fe5b016020015160f81c905060006103dc87600163ffffffff610b8616565b905060006103f188602163ffffffff610b8616565b905060018960405160200161040691906119e3565b604051602081830303815290604052805190602001208484846040516000815260200160405260405161032c9493929190611bce565b61044b61020560018888610ad9565b5050505b92915050565b6060610464856080015161060c565b80519091501561047b5761047b8582868686610bb0565b5050505050565b6040518060400160405280601781526020017f30782050726f746f636f6c20436f6f7264696e61746f7200000000000000000081525081565b6040518060400160405280600581526020017f332e302e3000000000000000000000000000000000000000000000000000000081525081565b60015481565b61050684848484610455565b6002546040517f2280c9100000000000000000000000000000000000000000000000000000000081526201000090910473ffffffffffffffffffffffffffffffffffffffff1690632280c9109034906105659088908790600401611c53565b6000604051808303818588803b15801561057e57600080fd5b505af1158015610592573d6000803e3d6000fd5b50505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526105d99190810190611741565b506105e2610d5d565b50505050565b7fa6511c04ca44625d50986f8c36bedc09366207a17b96e347094053a9f850716881565b60606000610620838263ffffffff610d7316565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167f9b44d5560000000000000000000000000000000000000000000000000000000014806106b357507fffffffff0000000000000000000000000000000000000000000000000000000081167fe14b58c400000000000000000000000000000000000000000000000000000000145b1561073c576106c06112e5565b83516106d690859060049063ffffffff610dbf16565b8060200190516106e991908101906117fe565b604080516001808252818301909252919250816020015b6107086112e5565b815260200190600190039081610700579050509250808360008151811061072b57fe5b602002602001018190525050610aba565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f9694a4020000000000000000000000000000000000000000000000000000000014806107cd57507fffffffff0000000000000000000000000000000000000000000000000000000081167f8ea8dfe400000000000000000000000000000000000000000000000000000000145b8061081957507fffffffff0000000000000000000000000000000000000000000000000000000081167fbeee2e1400000000000000000000000000000000000000000000000000000000145b8061086557507fffffffff0000000000000000000000000000000000000000000000000000000081167f78d29ac100000000000000000000000000000000000000000000000000000000145b806108b157507fffffffff0000000000000000000000000000000000000000000000000000000081167f8bc8efb300000000000000000000000000000000000000000000000000000000145b806108fd57507fffffffff0000000000000000000000000000000000000000000000000000000081167f369da09900000000000000000000000000000000000000000000000000000000145b8061094957507fffffffff0000000000000000000000000000000000000000000000000000000081167fa6c3bf3300000000000000000000000000000000000000000000000000000000145b1561097e57825161096490849060049063ffffffff610dbf16565b8060200190516109779190810190611635565b9150610aba565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f88ec79fb000000000000000000000000000000000000000000000000000000001480610a0f57507fffffffff0000000000000000000000000000000000000000000000000000000081167fb718e29200000000000000000000000000000000000000000000000000000000145b15610aba57610a1c6112e5565b610a246112e5565b8451610a3a90869060049063ffffffff610dbf16565b806020019051610a4d9190810190611831565b60408051600280825260608201909252929450909250816020015b610a706112e5565b815260200190600190039081610a685790505093508184600081518110610a9357fe5b60200260200101819052508084600181518110610aac57fe5b602002602001018190525050505b50919050565b60005481565b600061044f610ad483610e46565b610e99565b606063779c522360e01b848484604051602401610af893929190611c0e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b60008160200183511015610ba757610ba76102056005855185602001610ea7565b50016020015190565b3273ffffffffffffffffffffffffffffffffffffffff841614610bd957610bd961020584610ec6565b6000610be786600154610f65565b60408051600080825260208201909252845192935091905b818114610c9057610c0e6113ac565b60405180606001604052808973ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018881525090506000610c4c82610ac6565b90506000610c6d82898681518110610c6057fe5b60200260200101516101ec565b9050610c7f868263ffffffff610f7916565b95505060019092019150610bff9050565b50610ca1823263ffffffff610f7916565b875190925060005b818114610d5157600073ffffffffffffffffffffffffffffffffffffffff16898281518110610cd457fe5b60200260200101516060015173ffffffffffffffffffffffffffffffffffffffff161415610d0157610d49565b6000898281518110610d0f57fe5b60200260200101516040015190506000610d32828761101b90919063ffffffff16565b905080610d4657610d466102058884611053565b50505b600101610ca9565b50505050505050505050565b610d656110f5565b610d7157610d71611103565b565b60008160040183511015610d9457610d946102056003855185600401610ea7565b5001602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b606081831115610dd857610dd861020560008585610ea7565b8351821115610df157610df16102056001848751610ea7565b8282036040519080825280601f01601f191660200182016040528015610e1e576020820181803883390190505b509050610e3f610e2d8261113c565b84610e378761113c565b018351611142565b9392505050565b604081810151825160209384015182519285019290922083517fa6511c04ca44625d50986f8c36bedc09366207a17b96e347094053a9f85071688152948501919091529183015260608201526080902090565b600061044f60005483611206565b6060632800659560e01b848484604051602401610af893929190611bec565b606063a458d7ff60e01b82604051602401610ee19190611a14565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b6000610e3f82610f7485611240565b611206565b815160405160609184906020808202808401820192910182851015610fa557610fa561020586856112c8565b82851115610fbf57610fb8858583611142565b8497508793505b60018201915060208101905080840192508294508188528460405286886001840381518110610fea57fe5b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015250959695505050505050565b60006020835102602084018181018192505b8083101561044b5782518086141561104757600194508193505b5060208301925061102d565b606063d789b64060e01b8383604051602401611070929190611baa565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905092915050565b600254610100900460ff1690565b47801561113957604051339082156108fc029083906000818181858888f19350505050158015611137573d6000803e3d6000fd5b505b50565b60200190565b602081101561116c576001816020036101000a038019835116818551168082178652505050611201565b8282141561117957611201565b828211156111b35760208103905080820181840181515b828510156111ab578451865260209586019590940193611190565b905250611201565b60208103905080820181840183515b818612156111fc57825182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe092830192909101906111c2565b855250505b505050565b6040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b608081810151825160208085015160408087015160609788015186519685019690962082517fec69816980a3a3ca4554410e60253953e9ff375ba4536a98adfa15cc71541508815294850195909552908301919091529481019490945273ffffffffffffffffffffffffffffffffffffffff9091169183019190915260a082015260c0902090565b6060635fc8372260e01b8383604051602401611070929190611cc9565b604051806101c00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001606081526020016060815260200160608152602001606081525090565b6040805160608082018352600080835260208301529181019190915290565b803561044f81611d8c565b805161044f81611d8c565b600082601f8301126113f1578081fd5b81356114046113ff82611cfe565b611cd7565b8181529150602080830190840160005b838110156114415761142c876020843589010161144b565b83526020928301929190910190600101611414565b5050505092915050565b600082601f83011261145b578081fd5b81356114696113ff82611d1e565b915080825283602082850101111561148057600080fd5b8060208401602084013760009082016020015292915050565b600082601f8301126114a9578081fd5b81516114b76113ff82611d1e565b91508082528360208285010111156114ce57600080fd5b6114df816020840160208601611d60565b5092915050565b60006101c08083850312156114f9578182fd5b61150281611cd7565b91505061150f83836113d6565b815261151e83602084016113d6565b602082015261153083604084016113d6565b604082015261154283606084016113d6565b60608201526080820151608082015260a082015160a082015260c082015160c082015260e082015160e08201526101008083015181830152506101208083015181830152506101408083015167ffffffffffffffff808211156115a457600080fd5b6115b086838701611499565b838501526101609250828501519150808211156115cc57600080fd5b6115d886838701611499565b838501526101809250828501519150808211156115f457600080fd5b61160086838701611499565b838501526101a092508285015191508082111561161c57600080fd5b5061162985828601611499565b82840152505092915050565b60006020808385031215611647578182fd5b825167ffffffffffffffff81111561165d578283fd5b80840185601f82011261166e578384fd5b8051915061167e6113ff83611cfe565b82815283810190828501865b858110156116b3576116a18a8884518801016114e6565b8452928601929086019060010161168a565b509098975050505050505050565b600080604083850312156116d3578081fd5b82359150602083013567ffffffffffffffff8111156116f0578182fd5b6116fc8582860161144b565b9150509250929050565b600060208284031215611717578081fd5b813567ffffffffffffffff81111561172d578182fd5b6117398482850161144b565b949350505050565b600060208284031215611752578081fd5b815167ffffffffffffffff811115611768578182fd5b61173984828501611499565b600060208284031215611785578081fd5b813567ffffffffffffffff8082111561179c578283fd5b818401606081870312156117ae578384fd5b6117b86060611cd7565b925080356117c581611d8c565b8352602081810135908401526040810135828111156117e2578485fd5b6117ee8782840161144b565b6040850152509195945050505050565b60006020828403121561180f578081fd5b815167ffffffffffffffff811115611825578182fd5b611739848285016114e6565b60008060408385031215611843578182fd5b825167ffffffffffffffff8082111561185a578384fd5b611866868387016114e6565b9350602085015191508082111561187b578283fd5b506116fc858286016114e6565b6000806000806080858703121561189d578182fd5b843567ffffffffffffffff808211156118b4578384fd5b81870160a0818a0312156118c6578485fd5b6118d060a0611cd7565b92508035835260208101356020840152604081013560408401526118f789606083016113cb565b606084015260808101358281111561190d578586fd5b6119198a82840161144b565b6080850152505081955061193088602089016113cb565b94506040870135915080821115611945578384fd5b6119518883890161144b565b93506060870135915080821115611966578283fd5b50611973878288016113e1565b91505092959194509250565b73ffffffffffffffffffffffffffffffffffffffff169052565b600081518084526119b1816020860160208601611d60565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6000602080830181845280855180835260408601915060408482028701019250838701855b82811015611b94577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845281516101c0611a9987835161197f565b87820151611aa98989018261197f565b506040820151611abc604089018261197f565b506060820151611acf606089018261197f565b506080820151608088015260a082015160a088015260c082015160c088015260e082015160e08801526101008083015181890152506101208083015181890152506101408083015182828a0152611b28838a0182611999565b915050610160915081830151888203838a0152611b458282611999565b9250505061018080830151888303828a0152611b618382611999565b9150506101a0915081830151888203838a0152611b7e8282611999565b9850505094870194505090850190600101611a5a565b5092979650505050505050565b90815260200190565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b6060810160088510611bfa57fe5b938152602081019290925260409091015290565b600060048510611c1a57fe5b84825283602083015260606040830152611c376060830184611999565b95945050505050565b600060208252610e3f6020830184611999565b60006040825283516040830152602084015160608301526040840151608083015273ffffffffffffffffffffffffffffffffffffffff60608501511660a0830152608084015160a060c0840152611cad60e0840182611999565b8381036020850152611cbf8186611999565b9695505050505050565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715611cf657600080fd5b604052919050565b600067ffffffffffffffff821115611d14578081fd5b5060209081020190565b600067ffffffffffffffff821115611d34578081fd5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b83811015611d7b578181015183820152602001611d63565b838111156105e25750506000910152565b73ffffffffffffffffffffffffffffffffffffffff8116811461113957600080fd5b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a090209056fea365627a7a723158208cc6ef9b1174a10beabaaa35e73d7ac5808e8ccb2b413ac457bbec7f01bd88156c6578706572696d656e74616cf564736f6c63430005110040",
                "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xB1 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xDA4FE074 GT PUSH2 0x69 JUMPI DUP1 PUSH4 0xEE55B968 GT PUSH2 0x4E JUMPI DUP1 PUSH4 0xEE55B968 EQ PUSH2 0x18A JUMPI DUP1 PUSH4 0xFB6961CC EQ PUSH2 0x1B7 JUMPI DUP1 PUSH4 0xFDD059A5 EQ PUSH2 0x1CC JUMPI PUSH2 0xB1 JUMP JUMPDEST DUP1 PUSH4 0xDA4FE074 EQ PUSH2 0x162 JUMPI DUP1 PUSH4 0xE1C71578 EQ PUSH2 0x175 JUMPI PUSH2 0xB1 JUMP JUMPDEST DUP1 PUSH4 0x89FAB5B7 GT PUSH2 0x9A JUMPI DUP1 PUSH4 0x89FAB5B7 EQ PUSH2 0x109 JUMPI DUP1 PUSH4 0xB2562B7A EQ PUSH2 0x12B JUMPI DUP1 PUSH4 0xC26CFECD EQ PUSH2 0x140 JUMPI PUSH2 0xB1 JUMP JUMPDEST DUP1 PUSH4 0xF7D8E39 EQ PUSH2 0xB3 JUMPI DUP1 PUSH4 0x52813679 EQ PUSH2 0xE9 JUMPI JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xBF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0xCE CALLDATASIZE PUSH1 0x4 PUSH2 0x16C1 JUMP JUMPDEST PUSH2 0x1EC JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xE0 SWAP2 SWAP1 PUSH2 0x1A14 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB1 PUSH2 0x104 CALLDATASIZE PUSH1 0x4 PUSH2 0x1888 JUMP JUMPDEST PUSH2 0x455 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x115 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11E PUSH2 0x482 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xE0 SWAP2 SWAP1 PUSH2 0x1C40 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x137 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11E PUSH2 0x4BB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x14C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x155 PUSH2 0x4F4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xE0 SWAP2 SWAP1 PUSH2 0x1BA1 JUMP JUMPDEST PUSH2 0xB1 PUSH2 0x170 CALLDATASIZE PUSH1 0x4 PUSH2 0x1888 JUMP JUMPDEST PUSH2 0x4FA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x181 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x155 PUSH2 0x5E8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x196 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AA PUSH2 0x1A5 CALLDATASIZE PUSH1 0x4 PUSH2 0x1706 JUMP JUMPDEST PUSH2 0x60C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xE0 SWAP2 SWAP1 PUSH2 0x1A35 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x155 PUSH2 0xAC0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1D8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x155 PUSH2 0x1E7 CALLDATASIZE PUSH1 0x4 PUSH2 0x1774 JUMP JUMPDEST PUSH2 0xAC6 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 DUP1 PUSH2 0x20A JUMPI PUSH2 0x20A PUSH2 0x205 PUSH1 0x0 DUP7 DUP7 PUSH2 0xAD9 JUMP JUMPDEST PUSH2 0xB7E JUMP JUMPDEST PUSH1 0x0 DUP4 PUSH1 0x1 DUP6 MLOAD SUB DUP2 MLOAD DUP2 LT PUSH2 0x21C JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 SHR SWAP1 POP PUSH1 0x8 DUP2 LT PUSH2 0x23D JUMPI PUSH2 0x23D PUSH2 0x205 PUSH1 0x1 DUP8 DUP8 PUSH2 0xAD9 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0xFF AND PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x24E JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x25E JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x278 JUMPI PUSH2 0x273 PUSH2 0x205 PUSH1 0x2 DUP9 DUP9 PUSH2 0xAD9 JUMP JUMPDEST PUSH2 0x43C JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x286 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x29B JUMPI PUSH2 0x273 PUSH2 0x205 PUSH1 0x3 DUP9 DUP9 PUSH2 0xAD9 JUMP JUMPDEST PUSH1 0x2 DUP2 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x2A9 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x385 JUMPI DUP3 PUSH1 0x42 EQ PUSH2 0x2C6 JUMPI PUSH2 0x2C6 PUSH2 0x205 PUSH1 0x0 DUP9 DUP9 PUSH2 0xAD9 JUMP JUMPDEST PUSH1 0x0 DUP6 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x2D5 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 SHR SWAP1 POP PUSH1 0x0 PUSH2 0x2F2 DUP8 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0xB86 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x307 DUP9 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0xB86 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x1 DUP10 DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x32C SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1BCE JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x34E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD SWAP8 POP PUSH2 0x44F SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x3 DUP2 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x393 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x43C JUMPI DUP3 PUSH1 0x42 EQ PUSH2 0x3B0 JUMPI PUSH2 0x3B0 PUSH2 0x205 PUSH1 0x0 DUP9 DUP9 PUSH2 0xAD9 JUMP JUMPDEST PUSH1 0x0 DUP6 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x3BF JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 SHR SWAP1 POP PUSH1 0x0 PUSH2 0x3DC DUP8 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0xB86 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x3F1 DUP9 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0xB86 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x1 DUP10 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x406 SWAP2 SWAP1 PUSH2 0x19E3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x32C SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1BCE JUMP JUMPDEST PUSH2 0x44B PUSH2 0x205 PUSH1 0x1 DUP9 DUP9 PUSH2 0xAD9 JUMP JUMPDEST POP POP POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x464 DUP6 PUSH1 0x80 ADD MLOAD PUSH2 0x60C JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x47B JUMPI PUSH2 0x47B DUP6 DUP3 DUP7 DUP7 DUP7 PUSH2 0xBB0 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x17 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x30782050726F746F636F6C20436F6F7264696E61746F72000000000000000000 DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x332E302E30000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x1 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x506 DUP5 DUP5 DUP5 DUP5 PUSH2 0x455 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x40 MLOAD PUSH32 0x2280C91000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH3 0x10000 SWAP1 SWAP2 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x2280C910 SWAP1 CALLVALUE SWAP1 PUSH2 0x565 SWAP1 DUP9 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x1C53 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x57E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x592 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP3 ADD PUSH1 0x40 MSTORE PUSH2 0x5D9 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1741 JUMP JUMPDEST POP PUSH2 0x5E2 PUSH2 0xD5D JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH32 0xA6511C04CA44625D50986F8C36BEDC09366207A17B96E347094053A9F8507168 DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x620 DUP4 DUP3 PUSH4 0xFFFFFFFF PUSH2 0xD73 AND JUMP JUMPDEST SWAP1 POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x9B44D55600000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0x6B3 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xE14B58C400000000000000000000000000000000000000000000000000000000 EQ JUMPDEST ISZERO PUSH2 0x73C JUMPI PUSH2 0x6C0 PUSH2 0x12E5 JUMP JUMPDEST DUP4 MLOAD PUSH2 0x6D6 SWAP1 DUP6 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0xDBF AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x6E9 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x17FE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE SWAP2 SWAP3 POP DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0x708 PUSH2 0x12E5 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x700 JUMPI SWAP1 POP POP SWAP3 POP DUP1 DUP4 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x72B JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP POP PUSH2 0xABA JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x9694A40200000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0x7CD JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x8EA8DFE400000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x819 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xBEEE2E1400000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x865 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x78D29AC100000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x8B1 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x8BC8EFB300000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x8FD JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x369DA09900000000000000000000000000000000000000000000000000000000 EQ JUMPDEST DUP1 PUSH2 0x949 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xA6C3BF3300000000000000000000000000000000000000000000000000000000 EQ JUMPDEST ISZERO PUSH2 0x97E JUMPI DUP3 MLOAD PUSH2 0x964 SWAP1 DUP5 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0xDBF AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x977 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1635 JUMP JUMPDEST SWAP2 POP PUSH2 0xABA JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x88EC79FB00000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0xA0F JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xB718E29200000000000000000000000000000000000000000000000000000000 EQ JUMPDEST ISZERO PUSH2 0xABA JUMPI PUSH2 0xA1C PUSH2 0x12E5 JUMP JUMPDEST PUSH2 0xA24 PUSH2 0x12E5 JUMP JUMPDEST DUP5 MLOAD PUSH2 0xA3A SWAP1 DUP7 SWAP1 PUSH1 0x4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0xDBF AND JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0xA4D SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1831 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x2 DUP1 DUP3 MSTORE PUSH1 0x60 DUP3 ADD SWAP1 SWAP3 MSTORE SWAP3 SWAP5 POP SWAP1 SWAP3 POP DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0xA70 PUSH2 0x12E5 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0xA68 JUMPI SWAP1 POP POP SWAP4 POP DUP2 DUP5 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0xA93 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP DUP1 DUP5 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0xAAC JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP POP POP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x44F PUSH2 0xAD4 DUP4 PUSH2 0xE46 JUMP JUMPDEST PUSH2 0xE99 JUMP JUMPDEST PUSH1 0x60 PUSH4 0x779C5223 PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0xAF8 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1C0E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH2 0xBA7 JUMPI PUSH2 0xBA7 PUSH2 0x205 PUSH1 0x5 DUP6 MLOAD DUP6 PUSH1 0x20 ADD PUSH2 0xEA7 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST ORIGIN PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND EQ PUSH2 0xBD9 JUMPI PUSH2 0xBD9 PUSH2 0x205 DUP5 PUSH2 0xEC6 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBE7 DUP7 PUSH1 0x1 SLOAD PUSH2 0xF65 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 SWAP3 MSTORE DUP5 MLOAD SWAP3 SWAP4 POP SWAP2 SWAP1 JUMPDEST DUP2 DUP2 EQ PUSH2 0xC90 JUMPI PUSH2 0xC0E PUSH2 0x13AC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP7 DUP2 MSTORE PUSH1 0x20 ADD DUP9 DUP2 MSTORE POP SWAP1 POP PUSH1 0x0 PUSH2 0xC4C DUP3 PUSH2 0xAC6 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xC6D DUP3 DUP10 DUP7 DUP2 MLOAD DUP2 LT PUSH2 0xC60 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x1EC JUMP JUMPDEST SWAP1 POP PUSH2 0xC7F DUP7 DUP3 PUSH4 0xFFFFFFFF PUSH2 0xF79 AND JUMP JUMPDEST SWAP6 POP POP PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 POP PUSH2 0xBFF SWAP1 POP JUMP JUMPDEST POP PUSH2 0xCA1 DUP3 ORIGIN PUSH4 0xFFFFFFFF PUSH2 0xF79 AND JUMP JUMPDEST DUP8 MLOAD SWAP1 SWAP3 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0xD51 JUMPI PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP10 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0xCD4 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xD01 JUMPI PUSH2 0xD49 JUMP JUMPDEST PUSH1 0x0 DUP10 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0xD0F JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 ADD MLOAD SWAP1 POP PUSH1 0x0 PUSH2 0xD32 DUP3 DUP8 PUSH2 0x101B SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP DUP1 PUSH2 0xD46 JUMPI PUSH2 0xD46 PUSH2 0x205 DUP9 DUP5 PUSH2 0x1053 JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x1 ADD PUSH2 0xCA9 JUMP JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0xD65 PUSH2 0x10F5 JUMP JUMPDEST PUSH2 0xD71 JUMPI PUSH2 0xD71 PUSH2 0x1103 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 ADD DUP4 MLOAD LT ISZERO PUSH2 0xD94 JUMPI PUSH2 0xD94 PUSH2 0x205 PUSH1 0x3 DUP6 MLOAD DUP6 PUSH1 0x4 ADD PUSH2 0xEA7 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 DUP4 GT ISZERO PUSH2 0xDD8 JUMPI PUSH2 0xDD8 PUSH2 0x205 PUSH1 0x0 DUP6 DUP6 PUSH2 0xEA7 JUMP JUMPDEST DUP4 MLOAD DUP3 GT ISZERO PUSH2 0xDF1 JUMPI PUSH2 0xDF1 PUSH2 0x205 PUSH1 0x1 DUP5 DUP8 MLOAD PUSH2 0xEA7 JUMP JUMPDEST DUP3 DUP3 SUB PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xE1E JUMPI PUSH1 0x20 DUP3 ADD DUP2 DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH2 0xE3F PUSH2 0xE2D DUP3 PUSH2 0x113C JUMP JUMPDEST DUP5 PUSH2 0xE37 DUP8 PUSH2 0x113C JUMP JUMPDEST ADD DUP4 MLOAD PUSH2 0x1142 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 DUP2 ADD MLOAD DUP3 MLOAD PUSH1 0x20 SWAP4 DUP5 ADD MLOAD DUP3 MLOAD SWAP3 DUP6 ADD SWAP3 SWAP1 SWAP3 KECCAK256 DUP4 MLOAD PUSH32 0xA6511C04CA44625D50986F8C36BEDC09366207A17B96E347094053A9F8507168 DUP2 MSTORE SWAP5 DUP6 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP2 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x44F PUSH1 0x0 SLOAD DUP4 PUSH2 0x1206 JUMP JUMPDEST PUSH1 0x60 PUSH4 0x28006595 PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0xAF8 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1BEC JUMP JUMPDEST PUSH1 0x60 PUSH4 0xA458D7FF PUSH1 0xE0 SHL DUP3 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0xEE1 SWAP2 SWAP1 PUSH2 0x1A14 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE3F DUP3 PUSH2 0xF74 DUP6 PUSH2 0x1240 JUMP JUMPDEST PUSH2 0x1206 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x40 MLOAD PUSH1 0x60 SWAP2 DUP5 SWAP1 PUSH1 0x20 DUP1 DUP3 MUL DUP1 DUP5 ADD DUP3 ADD SWAP3 SWAP2 ADD DUP3 DUP6 LT ISZERO PUSH2 0xFA5 JUMPI PUSH2 0xFA5 PUSH2 0x205 DUP7 DUP6 PUSH2 0x12C8 JUMP JUMPDEST DUP3 DUP6 GT ISZERO PUSH2 0xFBF JUMPI PUSH2 0xFB8 DUP6 DUP6 DUP4 PUSH2 0x1142 JUMP JUMPDEST DUP5 SWAP8 POP DUP8 SWAP4 POP JUMPDEST PUSH1 0x1 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP1 DUP5 ADD SWAP3 POP DUP3 SWAP5 POP DUP2 DUP9 MSTORE DUP5 PUSH1 0x40 MSTORE DUP7 DUP9 PUSH1 0x1 DUP5 SUB DUP2 MLOAD DUP2 LT PUSH2 0xFEA JUMPI INVALID JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x20 SWAP3 DUP4 MUL SWAP2 SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE POP SWAP6 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP4 MLOAD MUL PUSH1 0x20 DUP5 ADD DUP2 DUP2 ADD DUP2 SWAP3 POP JUMPDEST DUP1 DUP4 LT ISZERO PUSH2 0x44B JUMPI DUP3 MLOAD DUP1 DUP7 EQ ISZERO PUSH2 0x1047 JUMPI PUSH1 0x1 SWAP5 POP DUP2 SWAP4 POP JUMPDEST POP PUSH1 0x20 DUP4 ADD SWAP3 POP PUSH2 0x102D JUMP JUMPDEST PUSH1 0x60 PUSH4 0xD789B640 PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1070 SWAP3 SWAP2 SWAP1 PUSH2 0x1BAA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND SWAP1 JUMP JUMPDEST SELFBALANCE DUP1 ISZERO PUSH2 0x1139 JUMPI PUSH1 0x40 MLOAD CALLER SWAP1 DUP3 ISZERO PUSH2 0x8FC MUL SWAP1 DUP4 SWAP1 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x1137 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP JUMPDEST POP JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x116C JUMPI PUSH1 0x1 DUP2 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP4 MLOAD AND DUP2 DUP6 MLOAD AND DUP1 DUP3 OR DUP7 MSTORE POP POP POP PUSH2 0x1201 JUMP JUMPDEST DUP3 DUP3 EQ ISZERO PUSH2 0x1179 JUMPI PUSH2 0x1201 JUMP JUMPDEST DUP3 DUP3 GT ISZERO PUSH2 0x11B3 JUMPI PUSH1 0x20 DUP2 SUB SWAP1 POP DUP1 DUP3 ADD DUP2 DUP5 ADD DUP2 MLOAD JUMPDEST DUP3 DUP6 LT ISZERO PUSH2 0x11AB JUMPI DUP5 MLOAD DUP7 MSTORE PUSH1 0x20 SWAP6 DUP7 ADD SWAP6 SWAP1 SWAP5 ADD SWAP4 PUSH2 0x1190 JUMP JUMPDEST SWAP1 MSTORE POP PUSH2 0x1201 JUMP JUMPDEST PUSH1 0x20 DUP2 SUB SWAP1 POP DUP1 DUP3 ADD DUP2 DUP5 ADD DUP4 MLOAD JUMPDEST DUP2 DUP7 SLT ISZERO PUSH2 0x11FC JUMPI DUP3 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x11C2 JUMP JUMPDEST DUP6 MSTORE POP POP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x2 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x22 DUP3 ADD MSTORE PUSH1 0x42 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x80 DUP2 DUP2 ADD MLOAD DUP3 MLOAD PUSH1 0x20 DUP1 DUP6 ADD MLOAD PUSH1 0x40 DUP1 DUP8 ADD MLOAD PUSH1 0x60 SWAP8 DUP9 ADD MLOAD DUP7 MLOAD SWAP7 DUP6 ADD SWAP7 SWAP1 SWAP7 KECCAK256 DUP3 MLOAD PUSH32 0xEC69816980A3A3CA4554410E60253953E9FF375BA4536A98ADFA15CC71541508 DUP2 MSTORE SWAP5 DUP6 ADD SWAP6 SWAP1 SWAP6 MSTORE SWAP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP5 DUP2 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH4 0x5FC83722 PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1070 SWAP3 SWAP2 SWAP1 PUSH2 0x1CC9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH2 0x1C0 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP1 DUP3 ADD DUP4 MSTORE PUSH1 0x0 DUP1 DUP4 MSTORE PUSH1 0x20 DUP4 ADD MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH2 0x44F DUP2 PUSH2 0x1D8C JUMP JUMPDEST DUP1 MLOAD PUSH2 0x44F DUP2 PUSH2 0x1D8C JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x13F1 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1404 PUSH2 0x13FF DUP3 PUSH2 0x1CFE JUMP JUMPDEST PUSH2 0x1CD7 JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 ADD PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1441 JUMPI PUSH2 0x142C DUP8 PUSH1 0x20 DUP5 CALLDATALOAD DUP10 ADD ADD PUSH2 0x144B JUMP JUMPDEST DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1414 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x145B JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1469 PUSH2 0x13FF DUP3 PUSH2 0x1D1E JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x1480 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP5 ADD CALLDATACOPY PUSH1 0x0 SWAP1 DUP3 ADD PUSH1 0x20 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x14A9 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x14B7 PUSH2 0x13FF DUP3 PUSH2 0x1D1E JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x14CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x14DF DUP2 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x1D60 JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1C0 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x14F9 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x1502 DUP2 PUSH2 0x1CD7 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x150F DUP4 DUP4 PUSH2 0x13D6 JUMP JUMPDEST DUP2 MSTORE PUSH2 0x151E DUP4 PUSH1 0x20 DUP5 ADD PUSH2 0x13D6 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x1530 DUP4 PUSH1 0x40 DUP5 ADD PUSH2 0x13D6 JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x1542 DUP4 PUSH1 0x60 DUP5 ADD PUSH2 0x13D6 JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 DUP3 ADD MLOAD PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 DUP3 ADD MLOAD PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 DUP3 ADD MLOAD PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xE0 DUP3 ADD MLOAD PUSH1 0xE0 DUP3 ADD MSTORE PUSH2 0x100 DUP1 DUP4 ADD MLOAD DUP2 DUP4 ADD MSTORE POP PUSH2 0x120 DUP1 DUP4 ADD MLOAD DUP2 DUP4 ADD MSTORE POP PUSH2 0x140 DUP1 DUP4 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x15A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x15B0 DUP7 DUP4 DUP8 ADD PUSH2 0x1499 JUMP JUMPDEST DUP4 DUP6 ADD MSTORE PUSH2 0x160 SWAP3 POP DUP3 DUP6 ADD MLOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x15CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x15D8 DUP7 DUP4 DUP8 ADD PUSH2 0x1499 JUMP JUMPDEST DUP4 DUP6 ADD MSTORE PUSH2 0x180 SWAP3 POP DUP3 DUP6 ADD MLOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x15F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1600 DUP7 DUP4 DUP8 ADD PUSH2 0x1499 JUMP JUMPDEST DUP4 DUP6 ADD MSTORE PUSH2 0x1A0 SWAP3 POP DUP3 DUP6 ADD MLOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x161C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1629 DUP6 DUP3 DUP7 ADD PUSH2 0x1499 JUMP JUMPDEST DUP3 DUP5 ADD MSTORE POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1647 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x165D JUMPI DUP3 DUP4 REVERT JUMPDEST DUP1 DUP5 ADD DUP6 PUSH1 0x1F DUP3 ADD SLT PUSH2 0x166E JUMPI DUP4 DUP5 REVERT JUMPDEST DUP1 MLOAD SWAP2 POP PUSH2 0x167E PUSH2 0x13FF DUP4 PUSH2 0x1CFE JUMP JUMPDEST DUP3 DUP2 MSTORE DUP4 DUP2 ADD SWAP1 DUP3 DUP6 ADD DUP7 JUMPDEST DUP6 DUP2 LT ISZERO PUSH2 0x16B3 JUMPI PUSH2 0x16A1 DUP11 DUP9 DUP5 MLOAD DUP9 ADD ADD PUSH2 0x14E6 JUMP JUMPDEST DUP5 MSTORE SWAP3 DUP7 ADD SWAP3 SWAP1 DUP7 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x168A JUMP JUMPDEST POP SWAP1 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x16D3 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP3 CALLDATALOAD SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x16F0 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x16FC DUP6 DUP3 DUP7 ADD PUSH2 0x144B JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1717 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x172D JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x1739 DUP5 DUP3 DUP6 ADD PUSH2 0x144B JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1752 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1768 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x1739 DUP5 DUP3 DUP6 ADD PUSH2 0x1499 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1785 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x179C JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP5 ADD PUSH1 0x60 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x17AE JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x17B8 PUSH1 0x60 PUSH2 0x1CD7 JUMP JUMPDEST SWAP3 POP DUP1 CALLDATALOAD PUSH2 0x17C5 DUP2 PUSH2 0x1D8C JUMP JUMPDEST DUP4 MSTORE PUSH1 0x20 DUP2 DUP2 ADD CALLDATALOAD SWAP1 DUP5 ADD MSTORE PUSH1 0x40 DUP2 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0x17E2 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x17EE DUP8 DUP3 DUP5 ADD PUSH2 0x144B JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MSTORE POP SWAP2 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x180F JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1825 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x1739 DUP5 DUP3 DUP6 ADD PUSH2 0x14E6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1843 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x185A JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x1866 DUP7 DUP4 DUP8 ADD PUSH2 0x14E6 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD MLOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x187B JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x16FC DUP6 DUP3 DUP7 ADD PUSH2 0x14E6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x189D JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x18B4 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP8 ADD PUSH1 0xA0 DUP2 DUP11 SUB SLT ISZERO PUSH2 0x18C6 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x18D0 PUSH1 0xA0 PUSH2 0x1CD7 JUMP JUMPDEST SWAP3 POP DUP1 CALLDATALOAD DUP4 MSTORE PUSH1 0x20 DUP2 ADD CALLDATALOAD PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP2 ADD CALLDATALOAD PUSH1 0x40 DUP5 ADD MSTORE PUSH2 0x18F7 DUP10 PUSH1 0x60 DUP4 ADD PUSH2 0x13CB JUMP JUMPDEST PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x80 DUP2 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0x190D JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH2 0x1919 DUP11 DUP3 DUP5 ADD PUSH2 0x144B JUMP JUMPDEST PUSH1 0x80 DUP6 ADD MSTORE POP POP DUP2 SWAP6 POP PUSH2 0x1930 DUP9 PUSH1 0x20 DUP10 ADD PUSH2 0x13CB JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1945 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x1951 DUP9 DUP4 DUP10 ADD PUSH2 0x144B JUMP JUMPDEST SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1966 JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x1973 DUP8 DUP3 DUP9 ADD PUSH2 0x13E1 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x19B1 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x1D60 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE PUSH1 0x1C DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x3C ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 ADD DUP2 DUP5 MSTORE DUP1 DUP6 MLOAD DUP1 DUP4 MSTORE PUSH1 0x40 DUP7 ADD SWAP2 POP PUSH1 0x40 DUP5 DUP3 MUL DUP8 ADD ADD SWAP3 POP DUP4 DUP8 ADD DUP6 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x1B94 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 DUP9 DUP7 SUB ADD DUP5 MSTORE DUP2 MLOAD PUSH2 0x1C0 PUSH2 0x1A99 DUP8 DUP4 MLOAD PUSH2 0x197F JUMP JUMPDEST DUP8 DUP3 ADD MLOAD PUSH2 0x1AA9 DUP10 DUP10 ADD DUP3 PUSH2 0x197F JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x1ABC PUSH1 0x40 DUP10 ADD DUP3 PUSH2 0x197F JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH2 0x1ACF PUSH1 0x60 DUP10 ADD DUP3 PUSH2 0x197F JUMP JUMPDEST POP PUSH1 0x80 DUP3 ADD MLOAD PUSH1 0x80 DUP9 ADD MSTORE PUSH1 0xA0 DUP3 ADD MLOAD PUSH1 0xA0 DUP9 ADD MSTORE PUSH1 0xC0 DUP3 ADD MLOAD PUSH1 0xC0 DUP9 ADD MSTORE PUSH1 0xE0 DUP3 ADD MLOAD PUSH1 0xE0 DUP9 ADD MSTORE PUSH2 0x100 DUP1 DUP4 ADD MLOAD DUP2 DUP10 ADD MSTORE POP PUSH2 0x120 DUP1 DUP4 ADD MLOAD DUP2 DUP10 ADD MSTORE POP PUSH2 0x140 DUP1 DUP4 ADD MLOAD DUP3 DUP3 DUP11 ADD MSTORE PUSH2 0x1B28 DUP4 DUP11 ADD DUP3 PUSH2 0x1999 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x160 SWAP2 POP DUP2 DUP4 ADD MLOAD DUP9 DUP3 SUB DUP4 DUP11 ADD MSTORE PUSH2 0x1B45 DUP3 DUP3 PUSH2 0x1999 JUMP JUMPDEST SWAP3 POP POP POP PUSH2 0x180 DUP1 DUP4 ADD MLOAD DUP9 DUP4 SUB DUP3 DUP11 ADD MSTORE PUSH2 0x1B61 DUP4 DUP3 PUSH2 0x1999 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x1A0 SWAP2 POP DUP2 DUP4 ADD MLOAD DUP9 DUP3 SUB DUP4 DUP11 ADD MSTORE PUSH2 0x1B7E DUP3 DUP3 PUSH2 0x1999 JUMP JUMPDEST SWAP9 POP POP POP SWAP5 DUP8 ADD SWAP5 POP POP SWAP1 DUP6 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1A5A JUMP JUMPDEST POP SWAP3 SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP2 DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH1 0x8 DUP6 LT PUSH2 0x1BFA JUMPI INVALID JUMPDEST SWAP4 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x4 DUP6 LT PUSH2 0x1C1A JUMPI INVALID JUMPDEST DUP5 DUP3 MSTORE DUP4 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x60 PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x1C37 PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x1999 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0xE3F PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x1999 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 MSTORE DUP4 MLOAD PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x20 DUP5 ADD MLOAD PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x80 DUP4 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x60 DUP6 ADD MLOAD AND PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0x80 DUP5 ADD MLOAD PUSH1 0xA0 PUSH1 0xC0 DUP5 ADD MSTORE PUSH2 0x1CAD PUSH1 0xE0 DUP5 ADD DUP3 PUSH2 0x1999 JUMP JUMPDEST DUP4 DUP2 SUB PUSH1 0x20 DUP6 ADD MSTORE PUSH2 0x1CBF DUP2 DUP7 PUSH2 0x1999 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x1CF6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1D14 JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1D34 JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1D7B JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1D63 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x5E2 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x1139 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 MLOAD PUSH1 0x20 SWAP5 DUP6 ADD KECCAK256 DUP4 MLOAD SWAP4 DUP6 ADD SWAP4 SWAP1 SWAP4 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F DUP2 MSTORE SWAP6 DUP7 ADD SWAP5 SWAP1 SWAP5 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 SWAP1 KECCAK256 SWAP1 JUMP INVALID LOG3 PUSH6 0x627A7A723158 KECCAK256 DUP13 0xC6 0xEF SWAP12 GT PUSH21 0xA10BEABAAA35E73D7AC5808E8CCB2B413AC457BBEC PUSH32 0x1BD88156C6578706572696D656E74616CF564736F6C63430005110040000000 ",
                "sourceMap": "964:487:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1175:4116:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1175:4116:3;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;2207:815:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2207:815:1;;;;;;;;:::i;760:81:10:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;760:81:10;;;:::i;:::-;;;;;;;;903:66;;8:9:-1;5:2;;;30:1;27;20:12;5:2;903:66:10;;;:::i;1066:42:34:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1066:42:34;;;:::i;:::-;;;;;;;;1900:654:2;;;;;;;;;:::i;1020:140:8:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1020:140:8;;;:::i;3241:2026:1:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3241:2026:1;;;;;;;;:::i;:::-;;;;;;;;1096:45:10;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1096:45:10;;;:::i;1894:270:8:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1894:270:8;;;;;;;;:::i;1175:4116:3:-;1347:16;;1284:21;;1377:20;1373:253;;1413:202;1435:179;1492:59;1569:4;1591:9;1435:39;:179::i;:::-;1413:21;:202::i;:::-;1690:22;1721:9;1750:1;1731:9;:16;:20;1721:31;;;;;;;;;;;;;;;-1:-1:-1;1835:29:3;1809:56;;1805:286;;1881:199;1903:176;1960:56;2034:4;2056:9;1903:39;:176::i;1881:199::-;2101:27;2145:16;2131:31;;;;;;;;;;2101:61;-1:-1:-1;2512:21:3;2495:13;:38;;;;;;;;;2491:2298;;;2549:195;2571:172;2628:52;2698:4;2720:9;2571:39;:172::i;2549:195::-;2491:2298;;;3026:21;3009:13;:38;;;;;;;;;3005:1784;;;3063:195;3085:172;3142:52;3212:4;3234:9;3085:39;:172::i;3005:1784::-;3331:20;3314:13;:37;;;;;;;;;3310:1479;;;3371:15;3390:2;3371:21;3367:278;;3412:218;3434:195;3495:59;3576:4;3602:9;3434:39;:195::i;3412:218::-;3658:7;3674:9;3684:1;3674:12;;;;;;;;;;;;;;;-1:-1:-1;3701:9:3;3713:24;:9;3735:1;3713:24;:21;:24;:::i;:::-;3701:36;-1:-1:-1;3751:9:3;3763:25;:9;3785:2;3763:25;:21;:25;:::i;:::-;3751:37;;3818:102;3845:4;3867:1;3886;3905;3818:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;3818:102:3;;;;;;-1:-1:-1;3934:20:3;;-1:-1:-1;;;;;;;3934:20:3;3310:1479;4031:21;4014:13;:38;;;;;;;;;4010:779;;;4072:15;4091:2;4072:21;4068:278;;4113:218;4135:195;4196:59;4277:4;4303:9;4135:39;:195::i;4113:218::-;4359:7;4375:9;4385:1;4375:12;;;;;;;;;;;;;;;-1:-1:-1;4402:9:3;4414:24;:9;4436:1;4414:24;:21;:24;:::i;:::-;4402:36;-1:-1:-1;4452:9:3;4464:25;:9;4486:2;4464:25;:21;:25;:::i;:::-;4452:37;;4519:225;4650:4;4556:116;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;4556:116:3;;;4546:127;;;;;;4691:1;4710;4729;4519:225;;;;;;;;;;;;;;;;;;;4010:779;5101:183;5123:160;5176:56;5246:4;5264:9;5123:39;:160::i;5101:183::-;1175:4116;;;;;;;;:::o;2207:815:1:-;2554:30;2587:42;2612:11;:16;;;2587:24;:42::i;:::-;2700:13;;2554:75;;-1:-1:-1;2700:17:1;2696:320;;2801:204;2856:11;2885:6;2909:8;2935:20;2973:18;2801:37;:204::i;:::-;2207:815;;;;;:::o;760:81:10:-;;;;;;;;;;;;;;;;;;;:::o;903:66::-;;;;;;;;;;;;;;;;;;;:::o;1066:42:34:-;;;;:::o;1900:654:2:-;2268:154;2313:11;2338:8;2360:20;2394:18;2268:31;:154::i;:::-;2468:8;;:79;;;;;:8;;;;;;;:27;;2502:9;;2468:79;;2513:11;;2526:20;;2468:79;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2468:79:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2468:79:2;;;;;;;39:16:-1;36:1;17:17;2:54;101:4;2468:79:2;80:15:-1;;;97:9;76:31;65:43;;120:4;113:20;2468:79:2;;;;;;;;;;862:32:33;:30;:32::i;:::-;1900:654:2;;;;:::o;1020:140:8:-;1094:66;1020:140;:::o;3241:2026:1:-;3339:30;3385:15;3403:18;:4;3385:15;3403:18;:15;:18;:::i;:::-;3385:36;-1:-1:-1;3448:52:1;;;3460:40;3448:52;;:126;;-1:-1:-1;3516:58:1;;;3528:46;3516:58;3448:126;3431:1807;;;3635:27;;:::i;:::-;3708:11;;3694:26;;3708:4;;3705:1;;3694:26;:10;:26;:::i;:::-;3666:102;;;;;;;;;;;;;;3791:23;;;3812:1;3791:23;;;;;;;;;3634:134;;-1:-1:-1;3791:23:1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;3782:32;;3840:5;3828:6;3835:1;3828:9;;;;;;;;;;;;;:17;;;;3431:1807;;;;3879:58;;;3891:46;3879:58;;:139;;-1:-1:-1;3953:65:1;;;3965:53;3953:65;3879:139;:219;;;-1:-1:-1;4034:64:1;;;4046:52;4034:64;3879:219;:300;;;-1:-1:-1;4114:65:1;;;4126:53;4114:65;3879:300;:384;;;-1:-1:-1;4195:68:1;;;4207:56;4195:68;3879:384;:466;;;-1:-1:-1;4279:66:1;;;4291:54;4279:66;3879:466;:551;;;-1:-1:-1;4361:69:1;;;4373:57;4361:69;3879:551;3862:1376;;;4579:11;;4565:26;;4579:4;;4576:1;;4565:26;:10;:26;:::i;:::-;4537:104;;;;;;;;;;;;;;4526:115;;3862:1376;;;4675:54;;;4687:42;4675:54;;:139;;-1:-1:-1;4745:69:1;;;4757:57;4745:69;4675:139;4658:580;;;4884:31;;:::i;:::-;4917:32;;:::i;:::-;4995:11;;4981:26;;4995:4;;4992:1;;4981:26;:10;:26;:::i;:::-;4953:118;;;;;;;;;;;;;;5133:23;;;5154:1;5133:23;;;;;;;;;4883:188;;-1:-1:-1;4883:188:1;;-1:-1:-1;5133:23:1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;5124:32;;5182:9;5170:6;5177:1;5170:9;;;;;;;;;;;;;:21;;;;5217:10;5205:6;5212:1;5205:9;;;;;;;;;;;;;:22;;;;4658:580;;;-1:-1:-1;3241:2026:1;;;:::o;1096:45:10:-;;;;:::o;1894:270:8:-;2012:20;2063:65;2093:34;2118:8;2093:24;:34::i;:::-;2063:29;:65::i;1252:346:9:-;1422:12;885:10;1493:24;;1531:9;1554:4;1572:9;1457:134;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;1457:134:9;;;49:4:-1;25:18;;61:17;;1457:134:9;182:15:-1;1457:134:9;;;;179:29:-1;;;;160:49;;;1457:134:9;-1:-1:-1;1252:346:9;;;;;:::o;1511:170:29:-;1654:9;1648:16;1641:4;1630:9;1626:20;1619:46;14133:679:25;14254:14;14299:5;14307:2;14299:10;14288:1;:8;:21;14284:297;;;14325:245;14347:222;14409:92;14519:1;:8;14545:5;14553:2;14545:10;14347:44;:222::i;14325:245::-;-1:-1:-1;14759:13:25;14661:2;14759:13;14753:20;;14133:679::o;5820:2489:1:-;6219:9;:21;;;;6215:128;;6256:76;6278:53;6322:8;6278:43;:53::i;6256:76::-;6384:23;6410:79;6448:11;6461:27;;6410:37;:79::i;:::-;6592:16;;;6606:1;6592:16;;;;;;;;;6646:25;;6384:105;;-1:-1:-1;6592:16:1;6646:25;6681:716;6706:16;6701:1;:21;6681:716;;6782:35;;:::i;:::-;6820:181;;;;;;;;6868:8;6820:181;;;;;;6911:15;6820:181;;;;6966:20;6820:181;;;6782:219;;7080:20;7103:36;7130:8;7103:26;:36::i;:::-;7080:59;;7153:29;7185:53;7202:12;7216:18;7235:1;7216:21;;;;;;;;;;;;;;7185:16;:53::i;:::-;7153:85;-1:-1:-1;7333:53:1;:23;7153:85;7333:53;:30;:53;:::i;:::-;7307:79;-1:-1:-1;;6724:3:1;;;;;-1:-1:-1;6681:716:1;;-1:-1:-1;6681:716:1;;-1:-1:-1;7509:41:1;:23;7540:9;7509:41;:30;:41;:::i;:::-;7584:13;;7483:67;;-1:-1:-1;7561:20:1;7607:696;7632:12;7627:1;:17;7607:696;;7778:1;7743:37;;:6;7750:1;7743:9;;;;;;;;;;;;;;:23;;;:37;;;7739:84;;;7800:8;;7739:84;7914:23;7940:6;7947:1;7940:9;;;;;;;;;;;;;;:29;;;7914:55;;7983:20;8006:49;8039:15;8006:23;:32;;:49;;;;:::i;:::-;7983:72;;8074:15;8069:224;;8109:169;8131:146;8207:15;8244;8131:54;:146::i;8109:169::-;7607:696;;;7646:3;;7607:696;;;;5820:2489;;;;;;;;;:::o;1292:155:33:-;1370:21;:19;:21::i;:::-;1365:76;;1407:23;:21;:23::i;:::-;1292:155::o;16814:871:25:-;16934:13;16978:5;16986:1;16978:9;16967:1;:8;:20;16963:290;;;17003:239;17025:216;17087:87;17192:1;:8;17218:5;17226:1;17218:9;17025:44;:216::i;17003:239::-;-1:-1:-1;17426:13:25;17329:2;17426:13;17420:20;17579:66;17567:79;;16814:871::o;6475:1101::-;6609:19;6789:2;6782:4;:9;6778:261;;;6807:221;6829:198;6891:80;6989:4;7011:2;6829:44;:198::i;6807:221::-;7057:1;:8;7052:2;:13;7048:271;;;7081:227;7103:204;7165:82;7265:2;7285:1;:8;7103:44;:204::i;7081:227::-;7411:4;7406:2;:9;7396:20;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;7396:20:25;87:34:-1;135:17;;-1:-1;7396:20:25;;7387:29;;7426:120;7447:23;:6;:21;:23::i;:::-;7505:4;7484:18;:1;:16;:18::i;:::-;:25;7523:6;:13;7426:7;:120::i;:::-;6475:1101;;;;;:::o;2498:1414:8:-;2752:29;;;;;2810:17;;2863:24;;;;;3341:27;;3310:29;;;3300:69;;;;3437:9;;1094:66;3460:26;;3554:15;;;3547:33;;;;3635:15;;;3628:40;2716:33;3723:15;;3716:49;3869:3;3851:22;;;2498:1414::o;2093:221:10:-;2199:14;2236:71;2264:30;;2296:10;2236:27;:71::i;1292:378:26:-;1480:12;1232:10;1551:37;;1602:9;1625:6;1645:8;1515:148;;;;;;;;;;;1604:258:9;1717:12;1023:10;1788:29;;1831:14;1752:103;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;1752:103:9;;;49:4:-1;25:18;;61:17;;1752:103:9;182:15:-1;1752:103:9;;;;179:29:-1;;;;160:49;;;1752:103:9;-1:-1:-1;1604:258:9;;;:::o;1921:441:39:-;2066:23;2207:116;2248:24;2286:27;:11;:25;:27::i;:::-;2207;:116::i;1161:2209:23:-;1509:19;;1658:4;1652:11;1280:16;;1509:12;;1581:2;:23;;;1747:45;;;;;;1509:19;1575:30;2130:31;;;2126:210;;;2177:148;2199:125;2264:10;2292:18;2199:47;:125::i;2177:148::-;2589:18;2576:10;:31;2572:273;;;2623:78;2640:10;2652:20;2674:26;2623:16;:78::i;:::-;2758:10;2742:26;;2809:12;2785:36;;2724:111;2913:1;2891:23;;;;2954:2;2924:32;;;;3010:26;2987:20;:49;2966:70;;3059:18;3046:31;;3169:18;3155:12;3148:40;3250:10;3244:4;3237:24;3319:15;3280:12;3314:1;3293:18;:22;3280:36;;;;;;;;:54;;;;:36;;;;;;;;;;;:54;-1:-1:-1;3351:12:23;;1161:2209;-1:-1:-1;;;;;;1161:2209:23:o;3609:1034::-;3721:12;3864:2;3849:12;3843:19;3839:28;3977:2;3963:12;3959:21;4089:12;4069:18;4065:37;4163:18;4155:26;;4150:453;4189:16;4186:1;4183:23;4150:453;;;4308:1;4302:8;4404:12;4396:6;4393:24;4390:2;;;4494:1;4483:12;;4555:16;4550:21;;4390:2;;4220;4217:1;4213:10;4208:15;;4150:453;;1868:345:9;2026:12;1192:10;2097:41;;2152:15;2181;2061:145;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;2061:145:9;;;49:4:-1;25:18;;61:17;;2061:145:9;182:15:-1;2061:145:9;;;;179:29:-1;;;;160:49;;;2061:145:9;-1:-1:-1;1868:345:9;;;;:::o;1884:128:33:-;1989:16;;;;;;;;1884:128::o;1453:189::-;1535:21;1570:11;;1566:70;;1597:28;;:10;;:28;;;;;1617:7;;1597:28;;;;1617:7;1597:10;:28;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1597:28:33;1566:70;1453:189;:::o;1403:228:25:-;1582:2;1571:14;;1403:228::o;1870:4297::-;2020:2;2011:6;:11;2007:4154;;;2309:1;2299:6;2295:2;2291:15;2286:3;2282:25;2278:33;2360:4;2356:9;2347:6;2341:13;2337:29;2409:4;2402;2396:11;2392:22;2450:1;2447;2444:8;2438:4;2431:22;;;;2248:219;;;2571:4;2561:6;:14;2557:59;;;2595:7;;2557:59;3305:4;3296:6;:13;3292:2859;;;3631:2;3623:6;3619:15;3609:25;;3679:6;3671;3667:19;3729:6;3723:4;3719:17;4036:4;4030:11;4304:198;4322:4;4314:6;4311:16;4304:198;;;4370:13;;4357:27;;4431:2;4467:13;;;;4419:15;;;;4304:198;;;4571:18;;-1:-1:-1;3338:1269:25;;;4852:2;4844:6;4840:15;4830:25;;4900:6;4892;4888:19;4950:6;4944:4;4940:17;5260:6;5254:13;5839:191;5856:4;5850;5846:15;5839:191;;;5904:11;;5891:25;;5949:13;;;;;5995;;;;5839:191;;;6100:19;;-1:-1:-1;;4654:1483:25;1870:4297;;;:::o;2889:890:27:-;3318:2;3312:9;3350:66;3335:82;;3467:1;3455:14;;3448:40;;;;3585:2;3573:15;;3566:35;3737:2;3719:21;;;2889:890::o;2542:1786:39:-;2769:16;;;;;2810;;2868:33;;;;;2930:20;;;;;2749:17;2984:25;;;;3417:11;;3402:13;;;3392:37;;;;3497:9;;1160:66;3520:26;;3647:15;;;3640:29;;;;3757:15;;;3750:46;;;;3884:15;;;3877:33;;;;4035:42;4016:62;;;3998:16;;;3991:88;;;;4129:3;4117:16;;4110:34;4285:3;4267:22;;;2542:1786::o;842:324:24:-;990:12;782:10;1061:32;;1107:10;1131:18;1025:134;;;;;;;;;;964:487:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;964:487:0;;;;;;;;;;;;;;;:::o;5:130:-1:-;72:20;;97:33;72:20;97:33;;142:134;220:13;;238:33;220:13;238:33;;299:693;;421:3;414:4;406:6;402:17;398:27;388:2;;-1:-1;;429:12;388:2;476:6;463:20;498:85;513:69;575:6;513:69;;;498:85;;;611:21;;;489:94;-1:-1;655:4;668:14;;;;643:17;;763:1;748:238;773:6;770:1;767:13;748:238;;;880:42;918:3;655:4;856:3;843:17;647:6;831:30;;880:42;;;868:55;;655:4;937:14;;;;965;;;;;795:1;788:9;748:238;;;752:14;;;;381:611;;;;;1913:432;;2010:3;2003:4;1995:6;1991:17;1987:27;1977:2;;-1:-1;;2018:12;1977:2;2065:6;2052:20;2087:60;2102:44;2139:6;2102:44;;2087:60;2078:69;;2167:6;2160:5;2153:21;2271:3;2203:4;2262:6;2195;2253:16;;2250:25;2247:2;;;2288:1;;2278:12;2247:2;29918:6;2203:4;2195:6;2191:17;2203:4;2229:5;2225:16;29895:30;29974:1;29956:16;;;2203:4;29956:16;29949:27;2229:5;1970:375;-1:-1;;1970:375;2354:434;;2462:3;2455:4;2447:6;2443:17;2439:27;2429:2;;-1:-1;;2470:12;2429:2;2510:6;2504:13;2532:60;2547:44;2584:6;2547:44;;2532:60;2523:69;;2612:6;2605:5;2598:21;2716:3;2648:4;2707:6;2640;2698:16;;2695:25;2692:2;;;2733:1;;2723:12;2692:2;2743:39;2775:6;2648:4;2674:5;2670:16;2648:4;2640:6;2636:17;2743:39;;;;2422:366;;;;;4531:2851;;4650:6;;4638:9;4633:3;4629:19;4625:32;4622:2;;;-1:-1;;4660:12;4622:2;4688:22;4650:6;4688:22;;;4679:31;;;4800:60;4856:3;4832:22;4800:60;;;4782:16;4775:86;4963:60;5019:3;4930:2;4999:9;4995:22;4963:60;;;4930:2;4949:5;4945:16;4938:86;5133:60;5189:3;5100:2;5169:9;5165:22;5133:60;;;5100:2;5119:5;5115:16;5108:86;5297:60;5353:3;5264:2;5333:9;5329:22;5297:60;;;5264:2;5283:5;5279:16;5272:86;5431:3;5501:9;5497:22;8694:13;5431:3;5451:5;5447:16;5440:86;5599:3;5669:9;5665:22;8694:13;5599:3;5619:5;5615:16;5608:86;5759:3;5829:9;5825:22;8694:13;5759:3;5779:5;5775:16;5768:86;5919:3;5989:9;5985:22;8694:13;5919:3;5939:5;5935:16;5928:86;6092:3;;6164:9;6160:22;8694:13;6092:3;6112:5;6108:18;6101:88;;6250:3;;6322:9;6318:22;8694:13;6250:3;6270:5;6266:18;6259:88;;6439:3;;6428:9;6424:19;6418:26;6464:18;;6456:6;6453:30;6450:2;;;4768:1;;6486:12;6450:2;6533:65;6594:3;6585:6;6574:9;6570:22;6533:65;;;6439:3;6517:5;6513:18;6506:93;6691:3;;;;6680:9;6676:19;6670:26;6656:40;;6464:18;6708:6;6705:30;6702:2;;;4768:1;;6738:12;6702:2;6785:65;6846:3;6837:6;6826:9;6822:22;6785:65;;;6691:3;6769:5;6765:18;6758:93;6946:3;;;;6935:9;6931:19;6925:26;6911:40;;6464:18;6963:6;6960:30;6957:2;;;4768:1;;6993:12;6957:2;7040:65;7101:3;7092:6;7081:9;7077:22;7040:65;;;6946:3;7024:5;7020:18;7013:93;7201:3;;;;7190:9;7186:19;7180:26;7166:40;;6464:18;7218:6;7215:30;7212:2;;;4768:1;;7248:12;7212:2;;7295:65;7356:3;7347:6;7336:9;7332:22;7295:65;;;7201:3;7279:5;7275:18;7268:93;;;4616:2766;;;;;8757:422;;8912:2;;8900:9;8891:7;8887:23;8883:32;8880:2;;;-1:-1;;8918:12;8880:2;8969:17;8963:24;9007:18;8999:6;8996:30;8993:2;;;-1:-1;;9029:12;8993:2;9146:6;9135:9;9131:22;1175:3;1168:4;1160:6;1156:17;1152:27;1142:2;;-1:-1;;1183:12;1142:2;1223:6;1217:13;1203:27;;1245:95;1260:79;1332:6;1260:79;;1245:95;1368:21;;;1425:14;;;;1400:17;;;-1:-1;1505:256;1530:6;1527:1;1524:13;1505:256;;;1630:67;1693:3;8912:2;1606:3;1600:10;1404:6;1588:23;;1630:67;;;1618:80;;1712:14;;;;1740;;;;1552:1;1545:9;1505:256;;;-1:-1;9049:114;;8874:305;-1:-1;;;;;;;;8874:305;9186:470;;;9316:2;9304:9;9295:7;9291:23;9287:32;9284:2;;;-1:-1;;9322:12;9284:2;1855:6;1842:20;9374:63;;9502:2;9491:9;9487:18;9474:32;9526:18;9518:6;9515:30;9512:2;;;-1:-1;;9548:12;9512:2;9578:62;9632:7;9623:6;9612:9;9608:22;9578:62;;;9568:72;;;9278:378;;;;;;9663:345;;9776:2;9764:9;9755:7;9751:23;9747:32;9744:2;;;-1:-1;;9782:12;9744:2;9840:17;9827:31;9878:18;9870:6;9867:30;9864:2;;;-1:-1;;9900:12;9864:2;9930:62;9984:7;9975:6;9964:9;9960:22;9930:62;;;9920:72;9738:270;-1:-1;;;;9738:270;10015:360;;10139:2;10127:9;10118:7;10114:23;10110:32;10107:2;;;-1:-1;;10145:12;10107:2;10196:17;10190:24;10234:18;10226:6;10223:30;10220:2;;;-1:-1;;10256:12;10220:2;10286:73;10351:7;10342:6;10331:9;10327:22;10286:73;;10382:399;;10522:2;10510:9;10501:7;10497:23;10493:32;10490:2;;;-1:-1;;10528:12;10490:2;10586:17;10573:31;10624:18;;10616:6;10613:30;10610:2;;;-1:-1;;10646:12;10610:2;10748:6;10737:9;10733:22;3877:4;3865:9;3860:3;3856:19;3852:30;3849:2;;;-1:-1;;3885:12;3849:2;3913:20;3877:4;3913:20;;;3904:29;;85:6;72:20;97:33;124:5;97:33;;;3994:75;;10522:2;4195:22;;;1842:20;4156:16;;;4149:75;4329:2;4314:18;;4301:32;4342:30;;;4339:2;;;-1:-1;;4375:12;4339:2;4420:54;4470:3;4461:6;4450:9;4446:22;4420:54;;;4329:2;4402:16;;4395:80;-1:-1;4406:5;;10484:297;-1:-1;;;;;10484:297;10788:380;;10922:2;10910:9;10901:7;10897:23;10893:32;10890:2;;;-1:-1;;10928:12;10890:2;10979:17;10973:24;11017:18;11009:6;11006:30;11003:2;;;-1:-1;;11039:12;11003:2;11069:83;11144:7;11135:6;11124:9;11120:22;11069:83;;11175:633;;;11345:2;11333:9;11324:7;11320:23;11316:32;11313:2;;;-1:-1;;11351:12;11313:2;11402:17;11396:24;11440:18;;11432:6;11429:30;11426:2;;;-1:-1;;11462:12;11426:2;11492:83;11567:7;11558:6;11547:9;11543:22;11492:83;;;11482:93;;11633:2;11622:9;11618:18;11612:25;11598:39;;11440:18;11649:6;11646:30;11643:2;;;-1:-1;;11679:12;11643:2;;11709:83;11784:7;11775:6;11764:9;11760:22;11709:83;;11815:1023;;;;;12044:3;12032:9;12023:7;12019:23;12015:33;12012:2;;;-1:-1;;12051:12;12012:2;12109:17;12096:31;12147:18;;12139:6;12136:30;12133:2;;;-1:-1;;12169:12;12133:2;12270:6;12259:9;12255:22;7565:4;7553:9;7548:3;7544:19;7540:30;7537:2;;;-1:-1;;7573:12;7537:2;7601:20;7565:4;7601:20;;;7592:29;;7724:22;8546:20;7685:16;7678:75;7831:2;7889:9;7885:22;8546:20;7831:2;7850:5;7846:16;7839:75;7979:2;8037:9;8033:22;8546:20;7979:2;7998:5;7994:16;7987:75;8165:49;8210:3;8132:2;8190:9;8186:22;8165:49;;;8132:2;8151:5;8147:16;8140:75;12044:3;8293:9;8289:19;8276:33;12147:18;8321:6;8318:30;8315:2;;;-1:-1;;8351:12;8315:2;8396:54;8446:3;8437:6;8426:9;8422:22;8396:54;;;12044:3;8382:5;8378:16;8371:80;;;12189:98;;;12342:53;12387:7;7831:2;12367:9;12363:22;12342:53;;;12332:63;;7979:2;12449:9;12445:18;12432:32;12418:46;;12147:18;12476:6;12473:30;12470:2;;;-1:-1;;12506:12;12470:2;12536:62;12590:7;12581:6;12570:9;12566:22;12536:62;;;12526:72;;8132:2;12652:9;12648:18;12635:32;12621:46;;12147:18;12679:6;12676:30;12673:2;;;-1:-1;;12709:12;12673:2;;12739:83;12814:7;12805:6;12794:9;12790:22;12739:83;;;12729:93;;;12006:832;;;;;;;;13087:103;29272:42;29261:54;13148:37;;13142:48;14663:343;;14805:5;27264:12;27966:6;27961:3;27954:19;14898:52;14943:6;28003:4;27998:3;27994:14;28003:4;14924:5;14920:16;14898:52;;;30436:2;30416:14;30432:7;30412:28;14962:39;;;;28003:4;14962:39;;14753:253;-1:-1;;14753:253;20819:511;16352:66;16332:87;;16316:2;16438:12;;14455:37;;;;21293:12;;;21027:303;21337:213;29272:42;29261:54;;;;13148:37;;21455:2;21440:18;;21426:124;21557:437;;21763:2;;21752:9;21748:18;21763:2;21784:17;21777:47;21838:146;13626:5;27264:12;27966:6;27961:3;27954:19;27994:14;21752:9;27994:14;13638:112;;27994:14;21763:2;13807:6;13803:17;21752:9;13794:27;;13782:39;;21763:2;13911:5;27099:14;-1:-1;13950:387;13975:6;13972:1;13969:13;13950:387;;;14027:20;21752:9;14031:4;14027:20;;14022:3;14015:33;14082:6;14076:13;16650:6;16755:63;16803:14;16732:16;16726:23;16755:63;;;21763:2;16898:5;16894:16;16888:23;16917:63;21763:2;16969:3;16965:14;16951:12;16917:63;;;;27994:14;17067:5;17063:16;17057:23;17086:63;27994:14;17138:3;17134:14;17120:12;17086:63;;;;17237:4;17230:5;17226:16;17220:23;17249:63;17237:4;17301:3;17297:14;17283:12;17249:63;;;;17403:4;17396:5;17392:16;17386:23;17403:4;17467:3;17463:14;14455:37;17569:4;17562:5;17558:16;17552:23;17569:4;17633:3;17629:14;14455:37;17727:4;17720:5;17716:16;17710:23;17727:4;17791:3;17787:14;14455:37;17885:4;17878:5;17874:16;17868:23;17885:4;17949:3;17945:14;14455:37;18056:6;;18049:5;18045:18;18039:25;18056:6;18122:3;18118:16;14455:37;;18214:6;;18207:5;18203:18;18197:25;18214:6;18280:3;18276:16;14455:37;;18382:6;;18375:5;18371:18;18365:25;16650:6;18382;18414:3;18410:16;18403:40;18458:67;16650:6;16645:3;16641:16;18506:12;18458:67;;;18450:75;;;18620:6;;;;18613:5;18609:18;18603:25;18676:3;18670:4;18666:14;18620:6;18652:3;18648:16;18641:40;18696:67;18758:4;18744:12;18696:67;;;18688:75;;;;18861:6;;18854:5;18850:18;18844:25;18917:3;18911:4;18907:14;18861:6;18893:3;18889:16;18882:40;18937:67;18999:4;18985:12;18937:67;;;18929:75;;;19102:6;;;;19095:5;19091:18;19085:25;19158:3;19152:4;19148:14;19102:6;19134:3;19130:16;19123:40;19178:67;19240:4;19226:12;19178:67;;;14096:110;-1:-1;;;14316:14;;;;-1:-1;;27790:14;;;;13997:1;13990:9;13950:387;;;-1:-1;21830:154;;21734:260;-1:-1;;;;;;;21734:260;22001:213;14455:37;;;22119:2;22104:18;;22090:124;22221:324;14455:37;;;29272:42;29261:54;22531:2;22516:18;;13148:37;22367:2;22352:18;;22338:207;22552:539;14455:37;;;29477:4;29466:16;;;;22911:2;22896:18;;20772:35;22994:2;22979:18;;14455:37;23077:2;23062:18;;14455:37;22750:3;22735:19;;22721:370;23098:501;23305:2;23290:18;;30557:1;30547:12;;30537:2;;30563:9;30537:2;15439:83;;;23502:2;23487:18;;14455:37;;;;23585:2;23570:18;;;14455:37;23276:323;;23606:561;;30678:1;30671:5;30668:12;30658:2;;30684:9;30658:2;29777:47;15633:3;15626:71;14485:5;24004:2;23993:9;23989:18;14455:37;23819:2;24041;24030:9;24026:18;24019:48;24081:76;23819:2;23808:9;23804:18;24143:6;24081:76;;;24073:84;23790:377;-1:-1;;;;;23790:377;24174:293;;24308:2;24329:17;24322:47;24383:74;24308:2;24297:9;24293:18;24443:6;24383:74;;24474:596;;24708:2;24729:17;24722:47;19634:16;19628:23;24708:2;24697:9;24693:18;14455:37;19816:4;19809:5;19805:16;19799:23;19876:14;24697:9;19876:14;14455:37;24708:2;19967:5;19963:16;19957:23;20034:14;24697:9;20034:14;14455:37;29272:42;19876:14;20130:5;20126:16;20120:23;29261:54;19562:4;24697:9;20197:14;13148:37;20034:14;20284:5;20280:16;20274:23;19562:4;20317:14;24697:9;20317:14;20310:38;20363:67;19553:14;24697:9;19553:14;20411:12;20363:67;;;24959:9;24953:4;24949:20;19816:4;24933:9;24929:18;24922:48;24984:76;25055:4;25046:6;24984:76;;;24976:84;24679:391;-1:-1;;;;;;24679:391;25077:324;14455:37;;;25387:2;25372:18;;14455:37;25223:2;25208:18;;25194:207;25408:256;25470:2;25464:9;25496:17;;;25571:18;25556:34;;25592:22;;;25553:62;25550:2;;;25628:1;;25618:12;25550:2;25470;25637:22;25448:216;;-1:-1;25448:216;25671:309;;25835:18;25827:6;25824:30;25821:2;;;-1:-1;;25857:12;25821:2;-1:-1;25902:4;25890:17;;;25955:15;;25758:222;26313:317;;26452:18;26444:6;26441:30;26438:2;;;-1:-1;;26474:12;26438:2;-1:-1;26551:4;26528:17;26547:9;26524:33;26615:4;26605:15;;26375:255;29991:268;30056:1;30063:101;30077:6;30074:1;30071:13;30063:101;;;30144:11;;;30138:18;30125:11;;;30118:39;30099:2;30092:10;30063:101;;;30179:6;30176:1;30173:13;30170:2;;;-1:-1;;30056:1;30226:16;;30219:27;30040:219;30707:117;29272:42;30794:5;29261:54;30769:5;30766:35;30756:2;;30815:1;;30805:12;30750:74;1997:11:27;;1992:2;1982:13;;;1972:37;2069:14;;2051:16;;;2041:43;;;;2158:2;2152:9;;962:66;2213:26;;2259:15;;;2252:33;;;;2305:15;;;2298:36;;;;2366:2;2354:15;;2347:32;2411:3;2399:16;;2392:43;2505:3;2487:22;;;1285:1263::o"
            }
        }
    },
    "sourceTreeHashHex": "0x04c6ff8de62db66e61f962c617d761955a5235cc0990c23f1d2404feb0636aa6",
    "sources": {
        "./Coordinator.sol": {
            "id": 0,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibEIP712ExchangeDomain.sol\";\nimport \"./libs/LibConstants.sol\";\nimport \"./libs/LibEIP712CoordinatorDomain.sol\";\nimport \"./MixinSignatureValidator.sol\";\nimport \"./MixinCoordinatorApprovalVerifier.sol\";\nimport \"./MixinCoordinatorCore.sol\";\n\n\n// solhint-disable no-empty-blocks\ncontract Coordinator is\n    LibConstants,\n    MixinSignatureValidator,\n    MixinCoordinatorApprovalVerifier,\n    MixinCoordinatorCore\n{\n    /// @param exchange Address of the 0x Exchange contract.\n    /// @param chainId Chain ID of the network this contract is deployed on.\n    constructor (address exchange, uint256 chainId)\n        public\n        LibConstants(exchange)\n        LibEIP712CoordinatorDomain(chainId, address(0))\n        LibEIP712ExchangeDomain(chainId, exchange)\n    {}\n}\n"
        },
        "@0x/contracts-exchange-libs/contracts/src/LibEIP712ExchangeDomain.sol": {
            "id": 34,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibEIP712.sol\";\n\n\ncontract LibEIP712ExchangeDomain {\n\n    // EIP712 Exchange Domain Name value\n    string constant internal _EIP712_EXCHANGE_DOMAIN_NAME = \"0x Protocol\";\n\n    // EIP712 Exchange Domain Version value\n    string constant internal _EIP712_EXCHANGE_DOMAIN_VERSION = \"3.0.0\";\n\n    // solhint-disable var-name-mixedcase\n    /// @dev Hash of the EIP712 Domain Separator data\n    /// @return 0 Domain hash.\n    bytes32 public EIP712_EXCHANGE_DOMAIN_HASH;\n    // solhint-enable var-name-mixedcase\n\n    /// @param chainId Chain ID of the network this contract is deployed on.\n    /// @param verifyingContractAddressIfExists Address of the verifying contract (null if the address of this contract)\n    constructor (\n        uint256 chainId,\n        address verifyingContractAddressIfExists\n    )\n        public\n    {\n        address verifyingContractAddress = verifyingContractAddressIfExists == address(0) ? address(this) : verifyingContractAddressIfExists;\n        EIP712_EXCHANGE_DOMAIN_HASH = LibEIP712.hashEIP712Domain(\n            _EIP712_EXCHANGE_DOMAIN_NAME,\n            _EIP712_EXCHANGE_DOMAIN_VERSION,\n            chainId,\n            verifyingContractAddress\n        );\n    }\n}\n"
        },
        "@0x/contracts-utils/contracts/src/LibEIP712.sol": {
            "id": 27,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\nlibrary LibEIP712 {\n\n    // Hash of the EIP712 Domain Separator Schema\n    // keccak256(abi.encodePacked(\n    //     \"EIP712Domain(\",\n    //     \"string name,\",\n    //     \"string version,\",\n    //     \"uint256 chainId,\",\n    //     \"address verifyingContract\",\n    //     \")\"\n    // ))\n    bytes32 constant internal _EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH = 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f;\n\n    /// @dev Calculates a EIP712 domain separator.\n    /// @param name The EIP712 domain name.\n    /// @param version The EIP712 domain version.\n    /// @param verifyingContract The EIP712 verifying contract.\n    /// @return EIP712 domain separator.\n    function hashEIP712Domain(\n        string memory name,\n        string memory version,\n        uint256 chainId,\n        address verifyingContract\n    )\n        internal\n        pure\n        returns (bytes32 result)\n    {\n        bytes32 schemaHash = _EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH;\n\n        // Assembly for more efficient computing:\n        // keccak256(abi.encodePacked(\n        //     _EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH,\n        //     keccak256(bytes(name)),\n        //     keccak256(bytes(version)),\n        //     chainId,\n        //     uint256(verifyingContract)\n        // ))\n\n        assembly {\n            // Calculate hashes of dynamic data\n            let nameHash := keccak256(add(name, 32), mload(name))\n            let versionHash := keccak256(add(version, 32), mload(version))\n\n            // Load free memory pointer\n            let memPtr := mload(64)\n\n            // Store params in memory\n            mstore(memPtr, schemaHash)\n            mstore(add(memPtr, 32), nameHash)\n            mstore(add(memPtr, 64), versionHash)\n            mstore(add(memPtr, 96), chainId)\n            mstore(add(memPtr, 128), verifyingContract)\n\n            // Compute hash\n            result := keccak256(memPtr, 160)\n        }\n        return result;\n    }\n\n    /// @dev Calculates EIP712 encoding for a hash struct with a given domain hash.\n    /// @param eip712DomainHash Hash of the domain domain separator data, computed\n    ///                         with getDomainHash().\n    /// @param hashStruct The EIP712 hash struct.\n    /// @return EIP712 hash applied to the given EIP712 Domain.\n    function hashEIP712Message(bytes32 eip712DomainHash, bytes32 hashStruct)\n        internal\n        pure\n        returns (bytes32 result)\n    {\n        // Assembly for more efficient computing:\n        // keccak256(abi.encodePacked(\n        //     EIP191_HEADER,\n        //     EIP712_DOMAIN_HASH,\n        //     hashStruct\n        // ));\n\n        assembly {\n            // Load free memory pointer\n            let memPtr := mload(64)\n\n            mstore(memPtr, 0x1901000000000000000000000000000000000000000000000000000000000000)  // EIP191 header\n            mstore(add(memPtr, 2), eip712DomainHash)                                            // EIP712 domain hash\n            mstore(add(memPtr, 34), hashStruct)                                                 // Hash of struct\n\n            // Compute hash\n            result := keccak256(memPtr, 66)\n        }\n        return result;\n    }\n}\n"
        },
        "./libs/LibConstants.sol": {
            "id": 7,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-exchange/contracts/src/interfaces/ITransactions.sol\";\n\n\n// solhint-disable var-name-mixedcase\ncontract LibConstants {\n\n    // The 0x Exchange contract.\n    ITransactions internal EXCHANGE;\n\n    /// @param exchange Address of the 0x Exchange contract.\n    constructor (address exchange)\n        public\n    {\n        EXCHANGE = ITransactions(exchange);\n    }\n}\n"
        },
        "@0x/contracts-exchange/contracts/src/interfaces/ITransactions.sol": {
            "id": 20,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibZeroExTransaction.sol\";\n\n\ncontract ITransactions {\n\n    // TransactionExecution event is emitted when a ZeroExTransaction is executed.\n    event TransactionExecution(bytes32 indexed transactionHash);\n\n    /// @dev Executes an Exchange method call in the context of signer.\n    /// @param transaction 0x transaction containing salt, signerAddress, and data.\n    /// @param signature Proof that transaction has been signed by signer.\n    /// @return ABI encoded return data of the underlying Exchange function call.\n    function executeTransaction(\n        LibZeroExTransaction.ZeroExTransaction memory transaction,\n        bytes memory signature\n    )\n        public\n        payable\n        returns (bytes memory);\n\n    /// @dev Executes a batch of Exchange method calls in the context of signer(s).\n    /// @param transactions Array of 0x transactions containing salt, signerAddress, and data.\n    /// @param signatures Array of proofs that transactions have been signed by signer(s).\n    /// @return Array containing ABI encoded return data for each of the underlying Exchange function calls.\n    function batchExecuteTransactions(\n        LibZeroExTransaction.ZeroExTransaction[] memory transactions,\n        bytes[] memory signatures\n    )\n        public\n        payable\n        returns (bytes[] memory);\n\n    /// @dev The current function will be called in the context of this address (either 0x transaction signer or `msg.sender`).\n    ///      If calling a fill function, this address will represent the taker.\n    ///      If calling a cancel function, this address will represent the maker.\n    /// @return Signer of 0x transaction if entry point is `executeTransaction`.\n    ///         `msg.sender` if entry point is any other function.\n    function _getCurrentContextAddress()\n        internal\n        view\n        returns (address);\n}\n"
        },
        "@0x/contracts-exchange-libs/contracts/src/LibZeroExTransaction.sol": {
            "id": 39,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-utils/contracts/src/LibEIP712.sol\";\n\n\nlibrary LibZeroExTransaction {\n\n    using LibZeroExTransaction for ZeroExTransaction;\n\n    // Hash for the EIP712 0x transaction schema\n    // keccak256(abi.encodePacked(\n    //    \"ZeroExTransaction(\",\n    //    \"uint256 salt,\",\n    //    \"uint256 expirationTimeSeconds,\",\n    //    \"uint256 gasPrice,\",\n    //    \"address signerAddress,\",\n    //    \"bytes data\",\n    //    \")\"\n    // ));\n    bytes32 constant internal _EIP712_ZEROEX_TRANSACTION_SCHEMA_HASH = 0xec69816980a3a3ca4554410e60253953e9ff375ba4536a98adfa15cc71541508;\n\n    struct ZeroExTransaction {\n        uint256 salt;                   // Arbitrary number to ensure uniqueness of transaction hash.\n        uint256 expirationTimeSeconds;  // Timestamp in seconds at which transaction expires.\n        uint256 gasPrice;               // gasPrice that transaction is required to be executed with.\n        address signerAddress;          // Address of transaction signer.\n        bytes data;                     // AbiV2 encoded calldata.\n    }\n\n    /// @dev Calculates the EIP712 typed data hash of a transaction with a given domain separator.\n    /// @param transaction 0x transaction structure.\n    /// @return EIP712 typed data hash of the transaction.\n    function getTypedDataHash(ZeroExTransaction memory transaction, bytes32 eip712ExchangeDomainHash)\n        internal\n        pure\n        returns (bytes32 transactionHash)\n    {\n        // Hash the transaction with the domain separator of the Exchange contract.\n        transactionHash = LibEIP712.hashEIP712Message(\n            eip712ExchangeDomainHash,\n            transaction.getStructHash()\n        );\n        return transactionHash;\n    }\n\n    /// @dev Calculates EIP712 hash of the 0x transaction struct.\n    /// @param transaction 0x transaction structure.\n    /// @return EIP712 hash of the transaction struct.\n    function getStructHash(ZeroExTransaction memory transaction)\n        internal\n        pure\n        returns (bytes32 result)\n    {\n        bytes32 schemaHash = _EIP712_ZEROEX_TRANSACTION_SCHEMA_HASH;\n        bytes memory data = transaction.data;\n        uint256 salt = transaction.salt;\n        uint256 expirationTimeSeconds = transaction.expirationTimeSeconds;\n        uint256 gasPrice = transaction.gasPrice;\n        address signerAddress = transaction.signerAddress;\n\n        // Assembly for more efficiently computing:\n        // result = keccak256(abi.encodePacked(\n        //     schemaHash,\n        //     salt,\n        //     expirationTimeSeconds,\n        //     gasPrice,\n        //     uint256(signerAddress),\n        //     keccak256(data)\n        // ));\n\n        assembly {\n            // Compute hash of data\n            let dataHash := keccak256(add(data, 32), mload(data))\n\n            // Load free memory pointer\n            let memPtr := mload(64)\n\n            mstore(memPtr, schemaHash)                                                                // hash of schema\n            mstore(add(memPtr, 32), salt)                                                             // salt\n            mstore(add(memPtr, 64), expirationTimeSeconds)                                            // expirationTimeSeconds\n            mstore(add(memPtr, 96), gasPrice)                                                         // gasPrice\n            mstore(add(memPtr, 128), and(signerAddress, 0xffffffffffffffffffffffffffffffffffffffff))  // signerAddress\n            mstore(add(memPtr, 160), dataHash)                                                        // hash of data\n\n            // Compute hash\n            result := keccak256(memPtr, 192)\n        }\n        return result;\n    }\n}\n"
        },
        "./libs/LibEIP712CoordinatorDomain.sol": {
            "id": 10,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibEIP712.sol\";\n\n\ncontract LibEIP712CoordinatorDomain {\n\n    // EIP712 Domain Name value for the Coordinator\n    string constant public EIP712_COORDINATOR_DOMAIN_NAME = \"0x Protocol Coordinator\";\n\n    // EIP712 Domain Version value for the Coordinator\n    string constant public EIP712_COORDINATOR_DOMAIN_VERSION = \"3.0.0\";\n\n    // Hash of the EIP712 Domain Separator data for the Coordinator\n    // solhint-disable-next-line var-name-mixedcase\n    bytes32 public EIP712_COORDINATOR_DOMAIN_HASH;\n\n    /// @param chainId Chain ID of the network this contract is deployed on.\n    /// @param verifyingContractAddressIfExists Address of the verifying contract (null if the address of this contract)\n    constructor (\n        uint256 chainId,\n        address verifyingContractAddressIfExists\n    )\n        public\n    {\n        address verifyingContractAddress = verifyingContractAddressIfExists == address(0)\n            ? address(this)\n            : verifyingContractAddressIfExists;\n        EIP712_COORDINATOR_DOMAIN_HASH = LibEIP712.hashEIP712Domain(\n            EIP712_COORDINATOR_DOMAIN_NAME,\n            EIP712_COORDINATOR_DOMAIN_VERSION,\n            chainId,\n            verifyingContractAddress\n        );\n    }\n\n    /// @dev Calculates EIP712 encoding for a hash struct in the EIP712 domain\n    ///      of this contract.\n    /// @param hashStruct The EIP712 hash struct.\n    /// @return result EIP712 hash applied to this EIP712 Domain.\n    function _hashEIP712CoordinatorMessage(bytes32 hashStruct)\n        internal\n        view\n        returns (bytes32 result)\n    {\n        return LibEIP712.hashEIP712Message(EIP712_COORDINATOR_DOMAIN_HASH, hashStruct);\n    }\n}\n"
        },
        "./MixinSignatureValidator.sol": {
            "id": 3,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibBytes.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"./interfaces/ICoordinatorSignatureValidator.sol\";\nimport \"./libs/LibCoordinatorRichErrors.sol\";\n\n\ncontract MixinSignatureValidator is\n    ICoordinatorSignatureValidator\n{\n    using LibBytes for bytes;\n\n    /// @dev Recovers the address of a signer given a hash and signature.\n    /// @param hash Any 32 byte hash.\n    /// @param signature Proof that the hash has been signed by signer.\n    /// @return signerAddress Address of the signer.\n    function getSignerAddress(bytes32 hash, bytes memory signature)\n        public\n        pure\n        returns (address signerAddress)\n    {\n        uint256 signatureLength = signature.length;\n        if (signatureLength == 0) {\n            LibRichErrors.rrevert(LibCoordinatorRichErrors.SignatureError(\n                LibCoordinatorRichErrors.SignatureErrorCodes.INVALID_LENGTH,\n                hash,\n                signature\n            ));\n        }\n\n        // Pop last byte off of signature byte array.\n        uint8 signatureTypeRaw = uint8(signature[signature.length - 1]);\n\n        // Ensure signature is supported\n        if (signatureTypeRaw >= uint8(SignatureType.NSignatureTypes)) {\n            LibRichErrors.rrevert(LibCoordinatorRichErrors.SignatureError(\n                LibCoordinatorRichErrors.SignatureErrorCodes.UNSUPPORTED,\n                hash,\n                signature\n            ));\n        }\n\n        SignatureType signatureType = SignatureType(signatureTypeRaw);\n\n        // Always illegal signature.\n        // This is always an implicit option since a signer can create a\n        // signature array with invalid type or length. We may as well make\n        // it an explicit option. This aids testing and analysis. It is\n        // also the initialization value for the enum type.\n        if (signatureType == SignatureType.Illegal) {\n            LibRichErrors.rrevert(LibCoordinatorRichErrors.SignatureError(\n                LibCoordinatorRichErrors.SignatureErrorCodes.ILLEGAL,\n                hash,\n                signature\n            ));\n\n        // Always invalid signature.\n        // Like Illegal, this is always implicitly available and therefore\n        // offered explicitly. It can be implicitly created by providing\n        // a correctly formatted but incorrect signature.\n        } else if (signatureType == SignatureType.Invalid) {\n            LibRichErrors.rrevert(LibCoordinatorRichErrors.SignatureError(\n                LibCoordinatorRichErrors.SignatureErrorCodes.INVALID,\n                hash,\n                signature\n            ));\n\n        // Signature using EIP712\n        } else if (signatureType == SignatureType.EIP712) {\n            if (signatureLength != 66) {\n                LibRichErrors.rrevert(LibCoordinatorRichErrors.SignatureError(\n                    LibCoordinatorRichErrors.SignatureErrorCodes.INVALID_LENGTH,\n                    hash,\n                    signature\n                ));\n            }\n            uint8 v = uint8(signature[0]);\n            bytes32 r = signature.readBytes32(1);\n            bytes32 s = signature.readBytes32(33);\n            signerAddress = ecrecover(\n                hash,\n                v,\n                r,\n                s\n            );\n            return signerAddress;\n\n        // Signed using web3.eth_sign\n        } else if (signatureType == SignatureType.EthSign) {\n            if (signatureLength != 66) {\n                LibRichErrors.rrevert(LibCoordinatorRichErrors.SignatureError(\n                    LibCoordinatorRichErrors.SignatureErrorCodes.INVALID_LENGTH,\n                    hash,\n                    signature\n                ));\n            }\n            uint8 v = uint8(signature[0]);\n            bytes32 r = signature.readBytes32(1);\n            bytes32 s = signature.readBytes32(33);\n            signerAddress = ecrecover(\n                keccak256(abi.encodePacked(\n                    \"\\x19Ethereum Signed Message:\\n32\",\n                    hash\n                )),\n                v,\n                r,\n                s\n            );\n            return signerAddress;\n        }\n\n        // Anything else is illegal (We do not return false because\n        // the signature may actually be valid, just not in a format\n        // that we currently support. In this case returning false\n        // may lead the caller to incorrectly believe that the\n        // signature was invalid.)\n        LibRichErrors.rrevert(LibCoordinatorRichErrors.SignatureError(\n            LibCoordinatorRichErrors.SignatureErrorCodes.UNSUPPORTED,\n            hash,\n            signature\n        ));\n    }\n}\n"
        },
        "@0x/contracts-utils/contracts/src/LibBytes.sol": {
            "id": 25,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"./LibBytesRichErrors.sol\";\nimport \"./LibRichErrors.sol\";\n\n\nlibrary LibBytes {\n\n    using LibBytes for bytes;\n\n    /// @dev Gets the memory address for a byte array.\n    /// @param input Byte array to lookup.\n    /// @return memoryAddress Memory address of byte array. This\n    ///         points to the header of the byte array which contains\n    ///         the length.\n    function rawAddress(bytes memory input)\n        internal\n        pure\n        returns (uint256 memoryAddress)\n    {\n        assembly {\n            memoryAddress := input\n        }\n        return memoryAddress;\n    }\n\n    /// @dev Gets the memory address for the contents of a byte array.\n    /// @param input Byte array to lookup.\n    /// @return memoryAddress Memory address of the contents of the byte array.\n    function contentAddress(bytes memory input)\n        internal\n        pure\n        returns (uint256 memoryAddress)\n    {\n        assembly {\n            memoryAddress := add(input, 32)\n        }\n        return memoryAddress;\n    }\n\n    /// @dev Copies `length` bytes from memory location `source` to `dest`.\n    /// @param dest memory address to copy bytes to.\n    /// @param source memory address to copy bytes from.\n    /// @param length number of bytes to copy.\n    function memCopy(\n        uint256 dest,\n        uint256 source,\n        uint256 length\n    )\n        internal\n        pure\n    {\n        if (length < 32) {\n            // Handle a partial word by reading destination and masking\n            // off the bits we are interested in.\n            // This correctly handles overlap, zero lengths and source == dest\n            assembly {\n                let mask := sub(exp(256, sub(32, length)), 1)\n                let s := and(mload(source), not(mask))\n                let d := and(mload(dest), mask)\n                mstore(dest, or(s, d))\n            }\n        } else {\n            // Skip the O(length) loop when source == dest.\n            if (source == dest) {\n                return;\n            }\n\n            // For large copies we copy whole words at a time. The final\n            // word is aligned to the end of the range (instead of after the\n            // previous) to handle partial words. So a copy will look like this:\n            //\n            //  ####\n            //      ####\n            //          ####\n            //            ####\n            //\n            // We handle overlap in the source and destination range by\n            // changing the copying direction. This prevents us from\n            // overwriting parts of source that we still need to copy.\n            //\n            // This correctly handles source == dest\n            //\n            if (source > dest) {\n                assembly {\n                    // We subtract 32 from `sEnd` and `dEnd` because it\n                    // is easier to compare with in the loop, and these\n                    // are also the addresses we need for copying the\n                    // last bytes.\n                    length := sub(length, 32)\n                    let sEnd := add(source, length)\n                    let dEnd := add(dest, length)\n\n                    // Remember the last 32 bytes of source\n                    // This needs to be done here and not after the loop\n                    // because we may have overwritten the last bytes in\n                    // source already due to overlap.\n                    let last := mload(sEnd)\n\n                    // Copy whole words front to back\n                    // Note: the first check is always true,\n                    // this could have been a do-while loop.\n                    // solhint-disable-next-line no-empty-blocks\n                    for {} lt(source, sEnd) {} {\n                        mstore(dest, mload(source))\n                        source := add(source, 32)\n                        dest := add(dest, 32)\n                    }\n\n                    // Write the last 32 bytes\n                    mstore(dEnd, last)\n                }\n            } else {\n                assembly {\n                    // We subtract 32 from `sEnd` and `dEnd` because those\n                    // are the starting points when copying a word at the end.\n                    length := sub(length, 32)\n                    let sEnd := add(source, length)\n                    let dEnd := add(dest, length)\n\n                    // Remember the first 32 bytes of source\n                    // This needs to be done here and not after the loop\n                    // because we may have overwritten the first bytes in\n                    // source already due to overlap.\n                    let first := mload(source)\n\n                    // Copy whole words back to front\n                    // We use a signed comparisson here to allow dEnd to become\n                    // negative (happens when source and dest < 32). Valid\n                    // addresses in local memory will never be larger than\n                    // 2**255, so they can be safely re-interpreted as signed.\n                    // Note: the first check is always true,\n                    // this could have been a do-while loop.\n                    // solhint-disable-next-line no-empty-blocks\n                    for {} slt(dest, dEnd) {} {\n                        mstore(dEnd, mload(sEnd))\n                        sEnd := sub(sEnd, 32)\n                        dEnd := sub(dEnd, 32)\n                    }\n\n                    // Write the first 32 bytes\n                    mstore(dest, first)\n                }\n            }\n        }\n    }\n\n    /// @dev Returns a slices from a byte array.\n    /// @param b The byte array to take a slice from.\n    /// @param from The starting index for the slice (inclusive).\n    /// @param to The final index for the slice (exclusive).\n    /// @return result The slice containing bytes at indices [from, to)\n    function slice(\n        bytes memory b,\n        uint256 from,\n        uint256 to\n    )\n        internal\n        pure\n        returns (bytes memory result)\n    {\n        // Ensure that the from and to positions are valid positions for a slice within\n        // the byte array that is being used.\n        if (from > to) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired,\n                from,\n                to\n            ));\n        }\n        if (to > b.length) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired,\n                to,\n                b.length\n            ));\n        }\n\n        // Create a new bytes structure and copy contents\n        result = new bytes(to - from);\n        memCopy(\n            result.contentAddress(),\n            b.contentAddress() + from,\n            result.length\n        );\n        return result;\n    }\n\n    /// @dev Returns a slice from a byte array without preserving the input.\n    /// @param b The byte array to take a slice from. Will be destroyed in the process.\n    /// @param from The starting index for the slice (inclusive).\n    /// @param to The final index for the slice (exclusive).\n    /// @return result The slice containing bytes at indices [from, to)\n    /// @dev When `from == 0`, the original array will match the slice. In other cases its state will be corrupted.\n    function sliceDestructive(\n        bytes memory b,\n        uint256 from,\n        uint256 to\n    )\n        internal\n        pure\n        returns (bytes memory result)\n    {\n        // Ensure that the from and to positions are valid positions for a slice within\n        // the byte array that is being used.\n        if (from > to) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired,\n                from,\n                to\n            ));\n        }\n        if (to > b.length) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired,\n                to,\n                b.length\n            ));\n        }\n\n        // Create a new bytes structure around [from, to) in-place.\n        assembly {\n            result := add(b, from)\n            mstore(result, sub(to, from))\n        }\n        return result;\n    }\n\n    /// @dev Pops the last byte off of a byte array by modifying its length.\n    /// @param b Byte array that will be modified.\n    /// @return The byte that was popped off.\n    function popLastByte(bytes memory b)\n        internal\n        pure\n        returns (bytes1 result)\n    {\n        if (b.length == 0) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanZeroRequired,\n                b.length,\n                0\n            ));\n        }\n\n        // Store last byte.\n        result = b[b.length - 1];\n\n        assembly {\n            // Decrement length of byte array.\n            let newLen := sub(mload(b), 1)\n            mstore(b, newLen)\n        }\n        return result;\n    }\n\n    /// @dev Tests equality of two byte arrays.\n    /// @param lhs First byte array to compare.\n    /// @param rhs Second byte array to compare.\n    /// @return True if arrays are the same. False otherwise.\n    function equals(\n        bytes memory lhs,\n        bytes memory rhs\n    )\n        internal\n        pure\n        returns (bool equal)\n    {\n        // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare.\n        // We early exit on unequal lengths, but keccak would also correctly\n        // handle this.\n        return lhs.length == rhs.length && keccak256(lhs) == keccak256(rhs);\n    }\n\n    /// @dev Reads an address from a position in a byte array.\n    /// @param b Byte array containing an address.\n    /// @param index Index in byte array of address.\n    /// @return address from byte array.\n    function readAddress(\n        bytes memory b,\n        uint256 index\n    )\n        internal\n        pure\n        returns (address result)\n    {\n        if (b.length < index + 20) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired,\n                b.length,\n                index + 20 // 20 is length of address\n            ));\n        }\n\n        // Add offset to index:\n        // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n        // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n        index += 20;\n\n        // Read address from array memory\n        assembly {\n            // 1. Add index to address of bytes array\n            // 2. Load 32-byte word from memory\n            // 3. Apply 20-byte mask to obtain address\n            result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n        }\n        return result;\n    }\n\n    /// @dev Writes an address into a specific position in a byte array.\n    /// @param b Byte array to insert address into.\n    /// @param index Index in byte array of address.\n    /// @param input Address to put into byte array.\n    function writeAddress(\n        bytes memory b,\n        uint256 index,\n        address input\n    )\n        internal\n        pure\n    {\n        if (b.length < index + 20) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired,\n                b.length,\n                index + 20 // 20 is length of address\n            ));\n        }\n\n        // Add offset to index:\n        // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n        // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n        index += 20;\n\n        // Store address into array memory\n        assembly {\n            // The address occupies 20 bytes and mstore stores 32 bytes.\n            // First fetch the 32-byte word where we'll be storing the address, then\n            // apply a mask so we have only the bytes in the word that the address will not occupy.\n            // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n            // 1. Add index to address of bytes array\n            // 2. Load 32-byte word from memory\n            // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n            let neighbors := and(\n                mload(add(b, index)),\n                0xffffffffffffffffffffffff0000000000000000000000000000000000000000\n            )\n\n            // Make sure input address is clean.\n            // (Solidity does not guarantee this)\n            input := and(input, 0xffffffffffffffffffffffffffffffffffffffff)\n\n            // Store the neighbors and address into memory\n            mstore(add(b, index), xor(input, neighbors))\n        }\n    }\n\n    /// @dev Reads a bytes32 value from a position in a byte array.\n    /// @param b Byte array containing a bytes32 value.\n    /// @param index Index in byte array of bytes32 value.\n    /// @return bytes32 value from byte array.\n    function readBytes32(\n        bytes memory b,\n        uint256 index\n    )\n        internal\n        pure\n        returns (bytes32 result)\n    {\n        if (b.length < index + 32) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired,\n                b.length,\n                index + 32\n            ));\n        }\n\n        // Arrays are prefixed by a 256 bit length parameter\n        index += 32;\n\n        // Read the bytes32 from array memory\n        assembly {\n            result := mload(add(b, index))\n        }\n        return result;\n    }\n\n    /// @dev Writes a bytes32 into a specific position in a byte array.\n    /// @param b Byte array to insert <input> into.\n    /// @param index Index in byte array of <input>.\n    /// @param input bytes32 to put into byte array.\n    function writeBytes32(\n        bytes memory b,\n        uint256 index,\n        bytes32 input\n    )\n        internal\n        pure\n    {\n        if (b.length < index + 32) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired,\n                b.length,\n                index + 32\n            ));\n        }\n\n        // Arrays are prefixed by a 256 bit length parameter\n        index += 32;\n\n        // Read the bytes32 from array memory\n        assembly {\n            mstore(add(b, index), input)\n        }\n    }\n\n    /// @dev Reads a uint256 value from a position in a byte array.\n    /// @param b Byte array containing a uint256 value.\n    /// @param index Index in byte array of uint256 value.\n    /// @return uint256 value from byte array.\n    function readUint256(\n        bytes memory b,\n        uint256 index\n    )\n        internal\n        pure\n        returns (uint256 result)\n    {\n        result = uint256(readBytes32(b, index));\n        return result;\n    }\n\n    /// @dev Writes a uint256 into a specific position in a byte array.\n    /// @param b Byte array to insert <input> into.\n    /// @param index Index in byte array of <input>.\n    /// @param input uint256 to put into byte array.\n    function writeUint256(\n        bytes memory b,\n        uint256 index,\n        uint256 input\n    )\n        internal\n        pure\n    {\n        writeBytes32(b, index, bytes32(input));\n    }\n\n    /// @dev Reads an unpadded bytes4 value from a position in a byte array.\n    /// @param b Byte array containing a bytes4 value.\n    /// @param index Index in byte array of bytes4 value.\n    /// @return bytes4 value from byte array.\n    function readBytes4(\n        bytes memory b,\n        uint256 index\n    )\n        internal\n        pure\n        returns (bytes4 result)\n    {\n        if (b.length < index + 4) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsFourRequired,\n                b.length,\n                index + 4\n            ));\n        }\n\n        // Arrays are prefixed by a 32 byte length field\n        index += 32;\n\n        // Read the bytes4 from array memory\n        assembly {\n            result := mload(add(b, index))\n            // Solidity does not require us to clean the trailing bytes.\n            // We do it anyway\n            result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)\n        }\n        return result;\n    }\n\n    /// @dev Writes a new length to a byte array.\n    ///      Decreasing length will lead to removing the corresponding lower order bytes from the byte array.\n    ///      Increasing length may lead to appending adjacent in-memory bytes to the end of the byte array.\n    /// @param b Bytes array to write new length to.\n    /// @param length New length of byte array.\n    function writeLength(bytes memory b, uint256 length)\n        internal\n        pure\n    {\n        assembly {\n            mstore(b, length)\n        }\n    }\n}\n"
        },
        "@0x/contracts-utils/contracts/src/LibBytesRichErrors.sol": {
            "id": 26,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\nlibrary LibBytesRichErrors {\n\n    enum InvalidByteOperationErrorCodes {\n        FromLessThanOrEqualsToRequired,\n        ToLessThanOrEqualsLengthRequired,\n        LengthGreaterThanZeroRequired,\n        LengthGreaterThanOrEqualsFourRequired,\n        LengthGreaterThanOrEqualsTwentyRequired,\n        LengthGreaterThanOrEqualsThirtyTwoRequired,\n        LengthGreaterThanOrEqualsNestedBytesLengthRequired,\n        DestinationLengthGreaterThanOrEqualSourceLengthRequired\n    }\n\n    // bytes4(keccak256(\"InvalidByteOperationError(uint8,uint256,uint256)\"))\n    bytes4 internal constant INVALID_BYTE_OPERATION_ERROR_SELECTOR =\n        0x28006595;\n\n    // solhint-disable func-name-mixedcase\n    function InvalidByteOperationError(\n        InvalidByteOperationErrorCodes errorCode,\n        uint256 offset,\n        uint256 required\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            INVALID_BYTE_OPERATION_ERROR_SELECTOR,\n            errorCode,\n            offset,\n            required\n        );\n    }\n}\n"
        },
        "@0x/contracts-utils/contracts/src/LibRichErrors.sol": {
            "id": 29,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\nlibrary LibRichErrors {\n\n    // bytes4(keccak256(\"Error(string)\"))\n    bytes4 internal constant STANDARD_ERROR_SELECTOR =\n        0x08c379a0;\n\n    // solhint-disable func-name-mixedcase\n    /// @dev ABI encode a standard, string revert error payload.\n    ///      This is the same payload that would be included by a `revert(string)`\n    ///      solidity statement. It has the function signature `Error(string)`.\n    /// @param message The error string.\n    /// @return The ABI encoded error.\n    function StandardError(\n        string memory message\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            STANDARD_ERROR_SELECTOR,\n            bytes(message)\n        );\n    }\n    // solhint-enable func-name-mixedcase\n\n    /// @dev Reverts an encoded rich revert reason `errorData`.\n    /// @param errorData ABI encoded error data.\n    function rrevert(bytes memory errorData)\n        internal\n        pure\n    {\n        assembly {\n            revert(add(errorData, 0x20), mload(errorData))\n        }\n    }\n}\n"
        },
        "./interfaces/ICoordinatorSignatureValidator.sol": {
            "id": 6,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ncontract ICoordinatorSignatureValidator {\n\n   // Allowed signature types.\n    enum SignatureType {\n        Illegal,                // 0x00, default value\n        Invalid,                // 0x01\n        EIP712,                 // 0x02\n        EthSign,                // 0x03\n        Wallet,                 // 0x04\n        Validator,              // 0x05\n        PreSigned,              // 0x06\n        EIP1271Wallet,          // 0x07\n        NSignatureTypes         // 0x08, number of signature types. Always leave at end.\n    }\n\n    /// @dev Recovers the address of a signer given a hash and signature.\n    /// @param hash Any 32 byte hash.\n    /// @param signature Proof that the hash has been signed by signer.\n    /// @return signerAddress Address of the signer. \n    function getSignerAddress(bytes32 hash, bytes memory signature)\n        public\n        pure\n        returns (address signerAddress);\n}\n"
        },
        "./libs/LibCoordinatorRichErrors.sol": {
            "id": 9,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\nlibrary LibCoordinatorRichErrors {\n    enum SignatureErrorCodes {\n        INVALID_LENGTH,\n        UNSUPPORTED,\n        ILLEGAL,\n        INVALID\n    }\n\n    // bytes4(keccak256(\"SignatureError(uint8,bytes32,bytes)\"))\n    bytes4 internal constant SIGNATURE_ERROR_SELECTOR =\n        0x779c5223;\n\n    // bytes4(keccak256(\"InvalidOriginError(address)\"))\n    bytes4 internal constant INVALID_ORIGIN_ERROR_SELECTOR =\n        0xa458d7ff;\n\n    // bytes4(keccak256(\"InvalidApprovalSignatureError(bytes32,address)\"))\n    bytes4 internal constant INVALID_APPROVAL_SIGNATURE_ERROR_SELECTOR =\n        0xd789b640;\n\n    // solhint-disable func-name-mixedcase\n    function SignatureError(\n        SignatureErrorCodes errorCode,\n        bytes32 hash,\n        bytes memory signature\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            SIGNATURE_ERROR_SELECTOR,\n            errorCode,\n            hash,\n            signature\n        );\n    }\n\n    function InvalidOriginError(\n        address expectedOrigin\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            INVALID_ORIGIN_ERROR_SELECTOR,\n            expectedOrigin\n        );\n    }\n\n    function InvalidApprovalSignatureError(\n        bytes32 transactionHash,\n        address approverAddress\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            INVALID_APPROVAL_SIGNATURE_ERROR_SELECTOR,\n            transactionHash,\n            approverAddress\n        );\n    }\n}\n"
        },
        "./MixinCoordinatorApprovalVerifier.sol": {
            "id": 1,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibEIP712ExchangeDomain.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibZeroExTransaction.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibAddressArray.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibBytes.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"@0x/contracts-exchange/contracts/src/interfaces/IExchange.sol\";\nimport \"./libs/LibCoordinatorApproval.sol\";\nimport \"./libs/LibCoordinatorRichErrors.sol\";\nimport \"./interfaces/ICoordinatorSignatureValidator.sol\";\nimport \"./interfaces/ICoordinatorApprovalVerifier.sol\";\n\n\n// solhint-disable avoid-tx-origin\ncontract MixinCoordinatorApprovalVerifier is\n    LibCoordinatorApproval,\n    LibEIP712ExchangeDomain,\n    ICoordinatorSignatureValidator,\n    ICoordinatorApprovalVerifier\n{\n    using LibBytes for bytes;\n    using LibAddressArray for address[];\n\n    /// @dev Validates that the 0x transaction has been approved by all of the feeRecipients\n    ///      that correspond to each order in the transaction's Exchange calldata.\n    /// @param transaction 0x transaction containing salt, signerAddress, and data.\n    /// @param txOrigin Required signer of Ethereum transaction calling this function.\n    /// @param transactionSignature Proof that the transaction has been signed by the signer.\n    /// @param approvalSignatures Array of signatures that correspond to the feeRecipients of each\n    ///        order in the transaction's Exchange calldata.\n    function assertValidCoordinatorApprovals(\n        LibZeroExTransaction.ZeroExTransaction memory transaction,\n        address txOrigin,\n        bytes memory transactionSignature,\n        bytes[] memory approvalSignatures\n    )\n        public\n        view\n    {\n        // Get the orders from the the Exchange calldata in the 0x transaction\n        LibOrder.Order[] memory orders = decodeOrdersFromFillData(transaction.data);\n\n        // No approval is required for non-fill methods\n        if (orders.length > 0) {\n            // Revert if approval is invalid for transaction orders\n            _assertValidTransactionOrdersApproval(\n                transaction,\n                orders,\n                txOrigin,\n                transactionSignature,\n                approvalSignatures\n            );\n        }\n    }\n\n    /// @dev Decodes the orders from Exchange calldata representing any fill method.\n    /// @param data Exchange calldata representing a fill method.\n    /// @return orders The orders from the Exchange calldata.\n    function decodeOrdersFromFillData(bytes memory data)\n        public\n        pure\n        returns (LibOrder.Order[] memory orders)\n    {\n        bytes4 selector = data.readBytes4(0);\n        if (\n            selector == IExchange(address(0)).fillOrder.selector ||\n            selector == IExchange(address(0)).fillOrKillOrder.selector\n        ) {\n            // Decode single order\n            (LibOrder.Order memory order) = abi.decode(\n                data.slice(4, data.length),\n                (LibOrder.Order)\n            );\n            orders = new LibOrder.Order[](1);\n            orders[0] = order;\n        } else if (\n            selector == IExchange(address(0)).batchFillOrders.selector ||\n            selector == IExchange(address(0)).batchFillOrdersNoThrow.selector ||\n            selector == IExchange(address(0)).batchFillOrKillOrders.selector ||\n            selector == IExchange(address(0)).marketBuyOrdersNoThrow.selector ||\n            selector == IExchange(address(0)).marketBuyOrdersFillOrKill.selector ||\n            selector == IExchange(address(0)).marketSellOrdersNoThrow.selector ||\n            selector == IExchange(address(0)).marketSellOrdersFillOrKill.selector\n        ) {\n            // Decode all orders\n            // solhint-disable indent\n            (orders) = abi.decode(\n                data.slice(4, data.length),\n                (LibOrder.Order[])\n            );\n        } else if (\n            selector == IExchange(address(0)).matchOrders.selector ||\n            selector == IExchange(address(0)).matchOrdersWithMaximalFill.selector\n        ) {\n            // Decode left and right orders\n            (LibOrder.Order memory leftOrder, LibOrder.Order memory rightOrder) = abi.decode(\n                data.slice(4, data.length),\n                (LibOrder.Order, LibOrder.Order)\n            );\n\n            // Create array of orders\n            orders = new LibOrder.Order[](2);\n            orders[0] = leftOrder;\n            orders[1] = rightOrder;\n        }\n        return orders;\n    }\n\n    /// @dev Validates that the feeRecipients of a batch of order have approved a 0x transaction.\n    /// @param transaction 0x transaction containing salt, signerAddress, and data.\n    /// @param orders Array of order structs containing order specifications.\n    /// @param txOrigin Required signer of Ethereum transaction calling this function.\n    /// @param transactionSignature Proof that the transaction has been signed by the signer.\n    /// @param approvalSignatures Array of signatures that correspond to the feeRecipients of each order.\n    function _assertValidTransactionOrdersApproval(\n        LibZeroExTransaction.ZeroExTransaction memory transaction,\n        LibOrder.Order[] memory orders,\n        address txOrigin,\n        bytes memory transactionSignature,\n        bytes[] memory approvalSignatures\n    )\n        internal\n        view\n    {\n        // Verify that Ethereum tx signer is the same as the approved txOrigin\n        if (tx.origin != txOrigin) {\n            LibRichErrors.rrevert(LibCoordinatorRichErrors.InvalidOriginError(txOrigin));\n        }\n\n        // Hash 0x transaction\n        bytes32 transactionHash = LibZeroExTransaction.getTypedDataHash(transaction, EIP712_EXCHANGE_DOMAIN_HASH);\n\n        // Create empty list of approval signers\n        address[] memory approvalSignerAddresses = new address[](0);\n\n        uint256 signaturesLength = approvalSignatures.length;\n        for (uint256 i = 0; i != signaturesLength; i++) {\n            // Create approval message\n            CoordinatorApproval memory approval = CoordinatorApproval({\n                txOrigin: txOrigin,\n                transactionHash: transactionHash,\n                transactionSignature: transactionSignature\n            });\n\n            // Hash approval message and recover signer address\n            bytes32 approvalHash = getCoordinatorApprovalHash(approval);\n            address approvalSignerAddress = getSignerAddress(approvalHash, approvalSignatures[i]);\n\n            // Add approval signer to list of signers\n            approvalSignerAddresses = approvalSignerAddresses.append(approvalSignerAddress);\n        }\n\n        // Ethereum transaction signer gives implicit signature of approval\n        approvalSignerAddresses = approvalSignerAddresses.append(tx.origin);\n\n        uint256 ordersLength = orders.length;\n        for (uint256 i = 0; i != ordersLength; i++) {\n            // Do not check approval if the order's senderAddress is null\n            if (orders[i].senderAddress == address(0)) {\n                continue;\n            }\n\n            // Ensure feeRecipient of order has approved this 0x transaction\n            address approverAddress = orders[i].feeRecipientAddress;\n            bool isOrderApproved = approvalSignerAddresses.contains(approverAddress);\n            if (!isOrderApproved) {\n                LibRichErrors.rrevert(LibCoordinatorRichErrors.InvalidApprovalSignatureError(\n                    transactionHash,\n                    approverAddress\n                ));\n            }\n        }\n    }\n}\n"
        },
        "@0x/contracts-exchange-libs/contracts/src/LibOrder.sol": {
            "id": 38,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibEIP712.sol\";\n\n\nlibrary LibOrder {\n\n    using LibOrder for Order;\n\n    // Hash for the EIP712 Order Schema:\n    // keccak256(abi.encodePacked(\n    //     \"Order(\",\n    //     \"address makerAddress,\",\n    //     \"address takerAddress,\",\n    //     \"address feeRecipientAddress,\",\n    //     \"address senderAddress,\",\n    //     \"uint256 makerAssetAmount,\",\n    //     \"uint256 takerAssetAmount,\",\n    //     \"uint256 makerFee,\",\n    //     \"uint256 takerFee,\",\n    //     \"uint256 expirationTimeSeconds,\",\n    //     \"uint256 salt,\",\n    //     \"bytes makerAssetData,\",\n    //     \"bytes takerAssetData,\",\n    //     \"bytes makerFeeAssetData,\",\n    //     \"bytes takerFeeAssetData\",\n    //     \")\"\n    // ))\n    bytes32 constant internal _EIP712_ORDER_SCHEMA_HASH =\n        0xf80322eb8376aafb64eadf8f0d7623f22130fd9491a221e902b713cb984a7534;\n\n    // A valid order remains fillable until it is expired, fully filled, or cancelled.\n    // An order's status is unaffected by external factors, like account balances.\n    enum OrderStatus {\n        INVALID,                     // Default value\n        INVALID_MAKER_ASSET_AMOUNT,  // Order does not have a valid maker asset amount\n        INVALID_TAKER_ASSET_AMOUNT,  // Order does not have a valid taker asset amount\n        FILLABLE,                    // Order is fillable\n        EXPIRED,                     // Order has already expired\n        FULLY_FILLED,                // Order is fully filled\n        CANCELLED                    // Order has been cancelled\n    }\n\n    // solhint-disable max-line-length\n    /// @dev Canonical order structure.\n    struct Order {\n        address makerAddress;           // Address that created the order.\n        address takerAddress;           // Address that is allowed to fill the order. If set to 0, any address is allowed to fill the order.\n        address feeRecipientAddress;    // Address that will recieve fees when order is filled.\n        address senderAddress;          // Address that is allowed to call Exchange contract methods that affect this order. If set to 0, any address is allowed to call these methods.\n        uint256 makerAssetAmount;       // Amount of makerAsset being offered by maker. Must be greater than 0.\n        uint256 takerAssetAmount;       // Amount of takerAsset being bid on by maker. Must be greater than 0.\n        uint256 makerFee;               // Fee paid to feeRecipient by maker when order is filled.\n        uint256 takerFee;               // Fee paid to feeRecipient by taker when order is filled.\n        uint256 expirationTimeSeconds;  // Timestamp in seconds at which order expires.\n        uint256 salt;                   // Arbitrary number to facilitate uniqueness of the order's hash.\n        bytes makerAssetData;           // Encoded data that can be decoded by a specified proxy contract when transferring makerAsset. The leading bytes4 references the id of the asset proxy.\n        bytes takerAssetData;           // Encoded data that can be decoded by a specified proxy contract when transferring takerAsset. The leading bytes4 references the id of the asset proxy.\n        bytes makerFeeAssetData;        // Encoded data that can be decoded by a specified proxy contract when transferring makerFeeAsset. The leading bytes4 references the id of the asset proxy.\n        bytes takerFeeAssetData;        // Encoded data that can be decoded by a specified proxy contract when transferring takerFeeAsset. The leading bytes4 references the id of the asset proxy.\n    }\n    // solhint-enable max-line-length\n\n    /// @dev Order information returned by `getOrderInfo()`.\n    struct OrderInfo {\n        OrderStatus orderStatus;                    // Status that describes order's validity and fillability.\n        bytes32 orderHash;                    // EIP712 typed data hash of the order (see LibOrder.getTypedDataHash).\n        uint256 orderTakerAssetFilledAmount;  // Amount of order that has already been filled.\n    }\n\n    /// @dev Calculates the EIP712 typed data hash of an order with a given domain separator.\n    /// @param order The order structure.\n    /// @return EIP712 typed data hash of the order.\n    function getTypedDataHash(Order memory order, bytes32 eip712ExchangeDomainHash)\n        internal\n        pure\n        returns (bytes32 orderHash)\n    {\n        orderHash = LibEIP712.hashEIP712Message(\n            eip712ExchangeDomainHash,\n            order.getStructHash()\n        );\n        return orderHash;\n    }\n\n    /// @dev Calculates EIP712 hash of the order struct.\n    /// @param order The order structure.\n    /// @return EIP712 hash of the order struct.\n    function getStructHash(Order memory order)\n        internal\n        pure\n        returns (bytes32 result)\n    {\n        bytes32 schemaHash = _EIP712_ORDER_SCHEMA_HASH;\n        bytes memory makerAssetData = order.makerAssetData;\n        bytes memory takerAssetData = order.takerAssetData;\n        bytes memory makerFeeAssetData = order.makerFeeAssetData;\n        bytes memory takerFeeAssetData = order.takerFeeAssetData;\n\n        // Assembly for more efficiently computing:\n        // keccak256(abi.encodePacked(\n        //     EIP712_ORDER_SCHEMA_HASH,\n        //     uint256(order.makerAddress),\n        //     uint256(order.takerAddress),\n        //     uint256(order.feeRecipientAddress),\n        //     uint256(order.senderAddress),\n        //     order.makerAssetAmount,\n        //     order.takerAssetAmount,\n        //     order.makerFee,\n        //     order.takerFee,\n        //     order.expirationTimeSeconds,\n        //     order.salt,\n        //     keccak256(order.makerAssetData),\n        //     keccak256(order.takerAssetData),\n        //     keccak256(order.makerFeeAssetData),\n        //     keccak256(order.takerFeeAssetData)\n        // ));\n\n        assembly {\n            // Assert order offset (this is an internal error that should never be triggered)\n            if lt(order, 32) {\n                invalid()\n            }\n\n            // Calculate memory addresses that will be swapped out before hashing\n            let pos1 := sub(order, 32)\n            let pos2 := add(order, 320)\n            let pos3 := add(order, 352)\n            let pos4 := add(order, 384)\n            let pos5 := add(order, 416)\n\n            // Backup\n            let temp1 := mload(pos1)\n            let temp2 := mload(pos2)\n            let temp3 := mload(pos3)\n            let temp4 := mload(pos4)\n            let temp5 := mload(pos5)\n\n            // Hash in place\n            mstore(pos1, schemaHash)\n            mstore(pos2, keccak256(add(makerAssetData, 32), mload(makerAssetData)))        // store hash of makerAssetData\n            mstore(pos3, keccak256(add(takerAssetData, 32), mload(takerAssetData)))        // store hash of takerAssetData\n            mstore(pos4, keccak256(add(makerFeeAssetData, 32), mload(makerFeeAssetData)))  // store hash of makerFeeAssetData\n            mstore(pos5, keccak256(add(takerFeeAssetData, 32), mload(takerFeeAssetData)))  // store hash of takerFeeAssetData\n            result := keccak256(pos1, 480)\n\n            // Restore\n            mstore(pos1, temp1)\n            mstore(pos2, temp2)\n            mstore(pos3, temp3)\n            mstore(pos4, temp4)\n            mstore(pos5, temp5)\n        }\n        return result;\n    }\n}\n"
        },
        "@0x/contracts-utils/contracts/src/LibAddressArray.sol": {
            "id": 23,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"./LibAddressArrayRichErrors.sol\";\nimport \"./LibBytes.sol\";\nimport \"./LibRichErrors.sol\";\n\n\nlibrary LibAddressArray {\n\n    /// @dev Append a new address to an array of addresses.\n    ///      The `addressArray` may need to be reallocated to make space\n    ///      for the new address. Because of this we return the resulting\n    ///      memory location of `addressArray`.\n    /// @param addressArray Array of addresses.\n    /// @param addressToAppend  Address to append.\n    /// @return Array of addresses: [... addressArray, addressToAppend]\n    function append(address[] memory addressArray, address addressToAppend)\n        internal\n        pure\n        returns (address[] memory)\n    {\n        // Get stats on address array and free memory\n        uint256 freeMemPtr = 0;\n        uint256 addressArrayBeginPtr = 0;\n        uint256 addressArrayEndPtr = 0;\n        uint256 addressArrayLength = addressArray.length;\n        uint256 addressArrayMemSizeInBytes = 32 + (32 * addressArrayLength);\n        assembly {\n            freeMemPtr := mload(0x40)\n            addressArrayBeginPtr := addressArray\n            addressArrayEndPtr := add(addressArray, addressArrayMemSizeInBytes)\n        }\n\n        // Cases for `freeMemPtr`:\n        //  `freeMemPtr` == `addressArrayEndPtr`: Nothing occupies memory after `addressArray`\n        //  `freeMemPtr` > `addressArrayEndPtr`: Some value occupies memory after `addressArray`\n        //  `freeMemPtr` < `addressArrayEndPtr`: Memory has not been managed properly.\n        if (freeMemPtr < addressArrayEndPtr) {\n            LibRichErrors.rrevert(LibAddressArrayRichErrors.MismanagedMemoryError(\n                freeMemPtr,\n                addressArrayEndPtr\n            ));\n        }\n\n        // If free memory begins at the end of `addressArray`\n        // then we can append `addressToAppend` directly.\n        // Otherwise, we must copy the array to free memory\n        // before appending new values to it.\n        if (freeMemPtr > addressArrayEndPtr) {\n            LibBytes.memCopy(freeMemPtr, addressArrayBeginPtr, addressArrayMemSizeInBytes);\n            assembly {\n                addressArray := freeMemPtr\n                addressArrayBeginPtr := addressArray\n            }\n        }\n\n        // Append `addressToAppend`\n        addressArrayLength += 1;\n        addressArrayMemSizeInBytes += 32;\n        addressArrayEndPtr = addressArrayBeginPtr + addressArrayMemSizeInBytes;\n        freeMemPtr = addressArrayEndPtr;\n        assembly {\n            // Store new array length\n            mstore(addressArray, addressArrayLength)\n\n            // Update `freeMemPtr`\n            mstore(0x40, freeMemPtr)\n        }\n        addressArray[addressArrayLength - 1] = addressToAppend;\n        return addressArray;\n    }\n\n    /// @dev Checks if an address array contains the target address.\n    /// @param addressArray Array of addresses.\n    /// @param target Address to search for in array.\n    /// @return True if the addressArray contains the target.\n    function contains(address[] memory addressArray, address target)\n        internal\n        pure\n        returns (bool success)\n    {\n        assembly {\n\n            // Calculate byte length of array\n            let arrayByteLen := mul(mload(addressArray), 32)\n            // Calculate beginning of array contents\n            let arrayContentsStart := add(addressArray, 32)\n            // Calclulate end of array contents\n            let arrayContentsEnd := add(arrayContentsStart, arrayByteLen)\n\n            // Loop through array\n            for {let i:= arrayContentsStart} lt(i, arrayContentsEnd) {i := add(i, 32)} {\n\n                // Load array element\n                let arrayElement := mload(i)\n\n                // Return true if array element equals target\n                if eq(target, arrayElement) {\n                    // Set success to true\n                    success := 1\n                    // Break loop\n                    i := arrayContentsEnd\n                }\n            }\n        }\n        return success;\n    }\n\n    /// @dev Finds the index of an address within an array.\n    /// @param addressArray Array of addresses.\n    /// @param target Address to search for in array.\n    /// @return Existence and index of the target in the array.\n    function indexOf(address[] memory addressArray, address target)\n        internal\n        pure\n        returns (bool success, uint256 index)\n    {\n        assembly {\n\n            // Calculate byte length of array\n            let arrayByteLen := mul(mload(addressArray), 32)\n            // Calculate beginning of array contents\n            let arrayContentsStart := add(addressArray, 32)\n            // Calclulate end of array contents\n            let arrayContentsEnd := add(arrayContentsStart, arrayByteLen)\n\n            // Loop through array\n            for {let i:= arrayContentsStart} lt(i, arrayContentsEnd) {i := add(i, 32)} {\n\n                // Load array element\n                let arrayElement := mload(i)\n\n                // Return true if array element equals target\n                if eq(target, arrayElement) {\n                    // Set success and index\n                    success := 1\n                    index := div(sub(i, arrayContentsStart), 32)\n                    // Break loop\n                    i := arrayContentsEnd\n                }\n            }\n        }\n        return (success, index);\n    }\n}\n"
        },
        "@0x/contracts-utils/contracts/src/LibAddressArrayRichErrors.sol": {
            "id": 24,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\nlibrary LibAddressArrayRichErrors {\n\n    // bytes4(keccak256(\"MismanagedMemoryError(uint256,uint256)\"))\n    bytes4 internal constant MISMANAGED_MEMORY_ERROR_SELECTOR =\n        0x5fc83722;\n\n    // solhint-disable func-name-mixedcase\n    function MismanagedMemoryError(\n        uint256 freeMemPtr,\n        uint256 addressArrayEndPtr\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            MISMANAGED_MEMORY_ERROR_SELECTOR,\n            freeMemPtr,\n            addressArrayEndPtr\n        );\n    }\n}\n"
        },
        "@0x/contracts-exchange/contracts/src/interfaces/IExchange.sol": {
            "id": 15,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"./IExchangeCore.sol\";\nimport \"./IProtocolFees.sol\";\nimport \"./IMatchOrders.sol\";\nimport \"./ISignatureValidator.sol\";\nimport \"./ITransactions.sol\";\nimport \"./IAssetProxyDispatcher.sol\";\nimport \"./IWrapperFunctions.sol\";\nimport \"./ITransferSimulator.sol\";\n\n\n// solhint-disable no-empty-blocks\ncontract IExchange is\n    IProtocolFees,\n    IExchangeCore,\n    IMatchOrders,\n    ISignatureValidator,\n    ITransactions,\n    IAssetProxyDispatcher,\n    ITransferSimulator,\n    IWrapperFunctions\n{}\n"
        },
        "@0x/contracts-exchange/contracts/src/interfaces/IExchangeCore.sol": {
            "id": 16,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibFillResults.sol\";\n\n\ncontract IExchangeCore {\n\n    // Fill event is emitted whenever an order is filled.\n    event Fill(\n        address indexed makerAddress,         // Address that created the order.\n        address indexed feeRecipientAddress,  // Address that received fees.\n        bytes makerAssetData,                 // Encoded data specific to makerAsset.\n        bytes takerAssetData,                 // Encoded data specific to takerAsset.\n        bytes makerFeeAssetData,              // Encoded data specific to makerFeeAsset.\n        bytes takerFeeAssetData,              // Encoded data specific to takerFeeAsset.\n        bytes32 indexed orderHash,            // EIP712 hash of order (see LibOrder.getTypedDataHash).\n        address takerAddress,                 // Address that filled the order.\n        address senderAddress,                // Address that called the Exchange contract (msg.sender).\n        uint256 makerAssetFilledAmount,       // Amount of makerAsset sold by maker and bought by taker.\n        uint256 takerAssetFilledAmount,       // Amount of takerAsset sold by taker and bought by maker.\n        uint256 makerFeePaid,                 // Amount of makerFeeAssetData paid to feeRecipient by maker.\n        uint256 takerFeePaid,                 // Amount of takerFeeAssetData paid to feeRecipient by taker.\n        uint256 protocolFeePaid               // Amount of eth or weth paid to the staking contract.\n    );\n\n    // Cancel event is emitted whenever an individual order is cancelled.\n    event Cancel(\n        address indexed makerAddress,         // Address that created the order.\n        address indexed feeRecipientAddress,  // Address that would have recieved fees if order was filled.\n        bytes makerAssetData,                 // Encoded data specific to makerAsset.\n        bytes takerAssetData,                 // Encoded data specific to takerAsset.\n        address senderAddress,                // Address that called the Exchange contract (msg.sender).\n        bytes32 indexed orderHash             // EIP712 hash of order (see LibOrder.getTypedDataHash).\n    );\n\n    // CancelUpTo event is emitted whenever `cancelOrdersUpTo` is executed succesfully.\n    event CancelUpTo(\n        address indexed makerAddress,         // Orders cancelled must have been created by this address.\n        address indexed orderSenderAddress,   // Orders cancelled must have a `senderAddress` equal to this address.\n        uint256 orderEpoch                    // Orders with specified makerAddress and senderAddress with a salt less than this value are considered cancelled.\n    );\n\n    /// @dev Cancels all orders created by makerAddress with a salt less than or equal to the targetOrderEpoch\n    ///      and senderAddress equal to msg.sender (or null address if msg.sender == makerAddress).\n    /// @param targetOrderEpoch Orders created with a salt less or equal to this value will be cancelled.\n    function cancelOrdersUpTo(uint256 targetOrderEpoch)\n        external\n        payable;\n\n    /// @dev Fills the input order.\n    /// @param order Order struct containing order specifications.\n    /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n    /// @param signature Proof that order has been created by maker.\n    /// @return Amounts filled and fees paid by maker and taker.\n    function fillOrder(\n        LibOrder.Order memory order,\n        uint256 takerAssetFillAmount,\n        bytes memory signature\n    )\n        public\n        payable\n        returns (LibFillResults.FillResults memory fillResults);\n\n    /// @dev After calling, the order can not be filled anymore.\n    /// @param order Order struct containing order specifications.\n    function cancelOrder(LibOrder.Order memory order)\n        public\n        payable;\n\n    /// @dev Gets information about an order: status, hash, and amount filled.\n    /// @param order Order to gather information on.\n    /// @return OrderInfo Information about the order and its state.\n    ///                   See LibOrder.OrderInfo for a complete description.\n    function getOrderInfo(LibOrder.Order memory order)\n        public\n        view\n        returns (LibOrder.OrderInfo memory orderInfo);\n}\n"
        },
        "@0x/contracts-exchange-libs/contracts/src/LibFillResults.sol": {
            "id": 35,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\nimport \"./LibMath.sol\";\nimport \"./LibOrder.sol\";\n\n\nlibrary LibFillResults {\n\n    using LibSafeMath for uint256;\n\n    struct BatchMatchedFillResults {\n        FillResults[] left;              // Fill results for left orders\n        FillResults[] right;             // Fill results for right orders\n        uint256 profitInLeftMakerAsset;  // Profit taken from left makers\n        uint256 profitInRightMakerAsset; // Profit taken from right makers\n    }\n\n    struct FillResults {\n        uint256 makerAssetFilledAmount;  // Total amount of makerAsset(s) filled.\n        uint256 takerAssetFilledAmount;  // Total amount of takerAsset(s) filled.\n        uint256 makerFeePaid;            // Total amount of fees paid by maker(s) to feeRecipient(s).\n        uint256 takerFeePaid;            // Total amount of fees paid by taker to feeRecipients(s).\n        uint256 protocolFeePaid;         // Total amount of fees paid by taker to the staking contract.\n    }\n\n    struct MatchedFillResults {\n        FillResults left;                // Amounts filled and fees paid of left order.\n        FillResults right;               // Amounts filled and fees paid of right order.\n        uint256 profitInLeftMakerAsset;  // Profit taken from the left maker\n        uint256 profitInRightMakerAsset; // Profit taken from the right maker\n    }\n\n    /// @dev Calculates amounts filled and fees paid by maker and taker.\n    /// @param order to be filled.\n    /// @param takerAssetFilledAmount Amount of takerAsset that will be filled.\n    /// @param protocolFeeMultiplier The current protocol fee of the exchange contract.\n    /// @param gasPrice The gasprice of the transaction. This is provided so that the function call can continue\n    ///        to be pure rather than view.\n    /// @return fillResults Amounts filled and fees paid by maker and taker.\n    function calculateFillResults(\n        LibOrder.Order memory order,\n        uint256 takerAssetFilledAmount,\n        uint256 protocolFeeMultiplier,\n        uint256 gasPrice\n    )\n        internal\n        pure\n        returns (FillResults memory fillResults)\n    {\n        // Compute proportional transfer amounts\n        fillResults.takerAssetFilledAmount = takerAssetFilledAmount;\n        fillResults.makerAssetFilledAmount = LibMath.safeGetPartialAmountFloor(\n            takerAssetFilledAmount,\n            order.takerAssetAmount,\n            order.makerAssetAmount\n        );\n        fillResults.makerFeePaid = LibMath.safeGetPartialAmountFloor(\n            takerAssetFilledAmount,\n            order.takerAssetAmount,\n            order.makerFee\n        );\n        fillResults.takerFeePaid = LibMath.safeGetPartialAmountFloor(\n            takerAssetFilledAmount,\n            order.takerAssetAmount,\n            order.takerFee\n        );\n\n        // Compute the protocol fee that should be paid for a single fill.\n        fillResults.protocolFeePaid = gasPrice.safeMul(protocolFeeMultiplier);\n\n        return fillResults;\n    }\n\n    /// @dev Calculates fill amounts for the matched orders.\n    ///      Each order is filled at their respective price point. However, the calculations are\n    ///      carried out as though the orders are both being filled at the right order's price point.\n    ///      The profit made by the leftOrder order goes to the taker (who matched the two orders).\n    /// @param leftOrder First order to match.\n    /// @param rightOrder Second order to match.\n    /// @param leftOrderTakerAssetFilledAmount Amount of left order already filled.\n    /// @param rightOrderTakerAssetFilledAmount Amount of right order already filled.\n    /// @param protocolFeeMultiplier The current protocol fee of the exchange contract.\n    /// @param gasPrice The gasprice of the transaction. This is provided so that the function call can continue\n    ///        to be pure rather than view.\n    /// @param shouldMaximallyFillOrders A value that indicates whether or not this calculation should use\n    ///                                  the maximal fill order matching strategy.\n    /// @param matchedFillResults Amounts to fill and fees to pay by maker and taker of matched orders.\n    function calculateMatchedFillResults(\n        LibOrder.Order memory leftOrder,\n        LibOrder.Order memory rightOrder,\n        uint256 leftOrderTakerAssetFilledAmount,\n        uint256 rightOrderTakerAssetFilledAmount,\n        uint256 protocolFeeMultiplier,\n        uint256 gasPrice,\n        bool shouldMaximallyFillOrders\n    )\n        internal\n        pure\n        returns (MatchedFillResults memory matchedFillResults)\n    {\n        // Derive maker asset amounts for left & right orders, given store taker assert amounts\n        uint256 leftTakerAssetAmountRemaining = leftOrder.takerAssetAmount.safeSub(leftOrderTakerAssetFilledAmount);\n        uint256 leftMakerAssetAmountRemaining = LibMath.safeGetPartialAmountFloor(\n            leftOrder.makerAssetAmount,\n            leftOrder.takerAssetAmount,\n            leftTakerAssetAmountRemaining\n        );\n        uint256 rightTakerAssetAmountRemaining = rightOrder.takerAssetAmount.safeSub(rightOrderTakerAssetFilledAmount);\n        uint256 rightMakerAssetAmountRemaining = LibMath.safeGetPartialAmountFloor(\n            rightOrder.makerAssetAmount,\n            rightOrder.takerAssetAmount,\n            rightTakerAssetAmountRemaining\n        );\n\n        // Maximally fill the orders and pay out profits to the matcher in one or both of the maker assets.\n        if (shouldMaximallyFillOrders) {\n            matchedFillResults = _calculateMatchedFillResultsWithMaximalFill(\n                leftOrder,\n                rightOrder,\n                leftMakerAssetAmountRemaining,\n                leftTakerAssetAmountRemaining,\n                rightMakerAssetAmountRemaining,\n                rightTakerAssetAmountRemaining\n            );\n        } else {\n            matchedFillResults = _calculateMatchedFillResults(\n                leftOrder,\n                rightOrder,\n                leftMakerAssetAmountRemaining,\n                leftTakerAssetAmountRemaining,\n                rightMakerAssetAmountRemaining,\n                rightTakerAssetAmountRemaining\n            );\n        }\n\n        // Compute fees for left order\n        matchedFillResults.left.makerFeePaid = LibMath.safeGetPartialAmountFloor(\n            matchedFillResults.left.makerAssetFilledAmount,\n            leftOrder.makerAssetAmount,\n            leftOrder.makerFee\n        );\n        matchedFillResults.left.takerFeePaid = LibMath.safeGetPartialAmountFloor(\n            matchedFillResults.left.takerAssetFilledAmount,\n            leftOrder.takerAssetAmount,\n            leftOrder.takerFee\n        );\n\n        // Compute fees for right order\n        matchedFillResults.right.makerFeePaid = LibMath.safeGetPartialAmountFloor(\n            matchedFillResults.right.makerAssetFilledAmount,\n            rightOrder.makerAssetAmount,\n            rightOrder.makerFee\n        );\n        matchedFillResults.right.takerFeePaid = LibMath.safeGetPartialAmountFloor(\n            matchedFillResults.right.takerAssetFilledAmount,\n            rightOrder.takerAssetAmount,\n            rightOrder.takerFee\n        );\n\n        // Compute the protocol fee that should be paid for a single fill. In this\n        // case this should be made the protocol fee for both the left and right orders.\n        uint256 protocolFee = gasPrice.safeMul(protocolFeeMultiplier);\n        matchedFillResults.left.protocolFeePaid = protocolFee;\n        matchedFillResults.right.protocolFeePaid = protocolFee;\n\n        // Return fill results\n        return matchedFillResults;\n    }\n\n    /// @dev Adds properties of both FillResults instances.\n    /// @param fillResults1 The first FillResults.\n    /// @param fillResults2 The second FillResults.\n    /// @return The sum of both fill results.\n    function addFillResults(\n        FillResults memory fillResults1,\n        FillResults memory fillResults2\n    )\n        internal\n        pure\n        returns (FillResults memory totalFillResults)\n    {\n        totalFillResults.makerAssetFilledAmount = fillResults1.makerAssetFilledAmount.safeAdd(fillResults2.makerAssetFilledAmount);\n        totalFillResults.takerAssetFilledAmount = fillResults1.takerAssetFilledAmount.safeAdd(fillResults2.takerAssetFilledAmount);\n        totalFillResults.makerFeePaid = fillResults1.makerFeePaid.safeAdd(fillResults2.makerFeePaid);\n        totalFillResults.takerFeePaid = fillResults1.takerFeePaid.safeAdd(fillResults2.takerFeePaid);\n        totalFillResults.protocolFeePaid = fillResults1.protocolFeePaid.safeAdd(fillResults2.protocolFeePaid);\n\n        return totalFillResults;\n    }\n\n    /// @dev Calculates part of the matched fill results for a given situation using the fill strategy that only\n    ///      awards profit denominated in the left maker asset.\n    /// @param leftOrder The left order in the order matching situation.\n    /// @param rightOrder The right order in the order matching situation.\n    /// @param leftMakerAssetAmountRemaining The amount of the left order maker asset that can still be filled.\n    /// @param leftTakerAssetAmountRemaining The amount of the left order taker asset that can still be filled.\n    /// @param rightMakerAssetAmountRemaining The amount of the right order maker asset that can still be filled.\n    /// @param rightTakerAssetAmountRemaining The amount of the right order taker asset that can still be filled.\n    /// @return MatchFillResults struct that does not include fees paid.\n    function _calculateMatchedFillResults(\n        LibOrder.Order memory leftOrder,\n        LibOrder.Order memory rightOrder,\n        uint256 leftMakerAssetAmountRemaining,\n        uint256 leftTakerAssetAmountRemaining,\n        uint256 rightMakerAssetAmountRemaining,\n        uint256 rightTakerAssetAmountRemaining\n    )\n        private\n        pure\n        returns (MatchedFillResults memory matchedFillResults)\n    {\n        // Calculate fill results for maker and taker assets: at least one order will be fully filled.\n        // The maximum amount the left maker can buy is `leftTakerAssetAmountRemaining`\n        // The maximum amount the right maker can sell is `rightMakerAssetAmountRemaining`\n        // We have two distinct cases for calculating the fill results:\n        // Case 1.\n        //   If the left maker can buy more than the right maker can sell, then only the right order is fully filled.\n        //   If the left maker can buy exactly what the right maker can sell, then both orders are fully filled.\n        // Case 2.\n        //   If the left maker cannot buy more than the right maker can sell, then only the left order is fully filled.\n        // Case 3.\n        //   If the left maker can buy exactly as much as the right maker can sell, then both orders are fully filled.\n        if (leftTakerAssetAmountRemaining > rightMakerAssetAmountRemaining) {\n            // Case 1: Right order is fully filled\n            matchedFillResults = _calculateCompleteRightFill(\n                leftOrder,\n                rightMakerAssetAmountRemaining,\n                rightTakerAssetAmountRemaining\n            );\n        } else if (leftTakerAssetAmountRemaining < rightMakerAssetAmountRemaining) {\n            // Case 2: Left order is fully filled\n            matchedFillResults.left.makerAssetFilledAmount = leftMakerAssetAmountRemaining;\n            matchedFillResults.left.takerAssetFilledAmount = leftTakerAssetAmountRemaining;\n            matchedFillResults.right.makerAssetFilledAmount = leftTakerAssetAmountRemaining;\n            // Round up to ensure the maker's exchange rate does not exceed the price specified by the order.\n            // We favor the maker when the exchange rate must be rounded.\n            matchedFillResults.right.takerAssetFilledAmount = LibMath.safeGetPartialAmountCeil(\n                rightOrder.takerAssetAmount,\n                rightOrder.makerAssetAmount,\n                leftTakerAssetAmountRemaining // matchedFillResults.right.makerAssetFilledAmount\n            );\n        } else {\n            // leftTakerAssetAmountRemaining == rightMakerAssetAmountRemaining\n            // Case 3: Both orders are fully filled. Technically, this could be captured by the above cases, but\n            //         this calculation will be more precise since it does not include rounding.\n            matchedFillResults = _calculateCompleteFillBoth(\n                leftMakerAssetAmountRemaining,\n                leftTakerAssetAmountRemaining,\n                rightMakerAssetAmountRemaining,\n                rightTakerAssetAmountRemaining\n            );\n        }\n\n        // Calculate amount given to taker\n        matchedFillResults.profitInLeftMakerAsset = matchedFillResults.left.makerAssetFilledAmount.safeSub(\n            matchedFillResults.right.takerAssetFilledAmount\n        );\n\n        return matchedFillResults;\n    }\n\n    /// @dev Calculates part of the matched fill results for a given situation using the maximal fill order matching\n    ///      strategy.\n    /// @param leftOrder The left order in the order matching situation.\n    /// @param rightOrder The right order in the order matching situation.\n    /// @param leftMakerAssetAmountRemaining The amount of the left order maker asset that can still be filled.\n    /// @param leftTakerAssetAmountRemaining The amount of the left order taker asset that can still be filled.\n    /// @param rightMakerAssetAmountRemaining The amount of the right order maker asset that can still be filled.\n    /// @param rightTakerAssetAmountRemaining The amount of the right order taker asset that can still be filled.\n    /// @return MatchFillResults struct that does not include fees paid.\n    function _calculateMatchedFillResultsWithMaximalFill(\n        LibOrder.Order memory leftOrder,\n        LibOrder.Order memory rightOrder,\n        uint256 leftMakerAssetAmountRemaining,\n        uint256 leftTakerAssetAmountRemaining,\n        uint256 rightMakerAssetAmountRemaining,\n        uint256 rightTakerAssetAmountRemaining\n    )\n        private\n        pure\n        returns (MatchedFillResults memory matchedFillResults)\n    {\n        // If a maker asset is greater than the opposite taker asset, than there will be a spread denominated in that maker asset.\n        bool doesLeftMakerAssetProfitExist = leftMakerAssetAmountRemaining > rightTakerAssetAmountRemaining;\n        bool doesRightMakerAssetProfitExist = rightMakerAssetAmountRemaining > leftTakerAssetAmountRemaining;\n\n        // Calculate the maximum fill results for the maker and taker assets. At least one of the orders will be fully filled.\n        //\n        // The maximum that the left maker can possibly buy is the amount that the right order can sell.\n        // The maximum that the right maker can possibly buy is the amount that the left order can sell.\n        //\n        // If the left order is fully filled, profit will be paid out in the left maker asset. If the right order is fully filled,\n        // the profit will be out in the right maker asset.\n        //\n        // There are three cases to consider:\n        // Case 1.\n        //   If the left maker can buy more than the right maker can sell, then only the right order is fully filled.\n        // Case 2.\n        //   If the right maker can buy more than the left maker can sell, then only the right order is fully filled.\n        // Case 3.\n        //   If the right maker can sell the max of what the left maker can buy and the left maker can sell the max of\n        //   what the right maker can buy, then both orders are fully filled.\n        if (leftTakerAssetAmountRemaining > rightMakerAssetAmountRemaining) {\n            // Case 1: Right order is fully filled with the profit paid in the left makerAsset\n            matchedFillResults = _calculateCompleteRightFill(\n                leftOrder,\n                rightMakerAssetAmountRemaining,\n                rightTakerAssetAmountRemaining\n            );\n        } else if (rightTakerAssetAmountRemaining > leftMakerAssetAmountRemaining) {\n            // Case 2: Left order is fully filled with the profit paid in the right makerAsset.\n            matchedFillResults.left.makerAssetFilledAmount = leftMakerAssetAmountRemaining;\n            matchedFillResults.left.takerAssetFilledAmount = leftTakerAssetAmountRemaining;\n            // Round down to ensure the right maker's exchange rate does not exceed the price specified by the order.\n            // We favor the right maker when the exchange rate must be rounded and the profit is being paid in the\n            // right maker asset.\n            matchedFillResults.right.makerAssetFilledAmount = LibMath.safeGetPartialAmountFloor(\n                rightOrder.makerAssetAmount,\n                rightOrder.takerAssetAmount,\n                leftMakerAssetAmountRemaining\n            );\n            matchedFillResults.right.takerAssetFilledAmount = leftMakerAssetAmountRemaining;\n        } else {\n            // Case 3: The right and left orders are fully filled\n            matchedFillResults = _calculateCompleteFillBoth(\n                leftMakerAssetAmountRemaining,\n                leftTakerAssetAmountRemaining,\n                rightMakerAssetAmountRemaining,\n                rightTakerAssetAmountRemaining\n            );\n        }\n\n        // Calculate amount given to taker in the left order's maker asset if the left spread will be part of the profit.\n        if (doesLeftMakerAssetProfitExist) {\n            matchedFillResults.profitInLeftMakerAsset = matchedFillResults.left.makerAssetFilledAmount.safeSub(\n                matchedFillResults.right.takerAssetFilledAmount\n            );\n        }\n\n        // Calculate amount given to taker in the right order's maker asset if the right spread will be part of the profit.\n        if (doesRightMakerAssetProfitExist) {\n            matchedFillResults.profitInRightMakerAsset = matchedFillResults.right.makerAssetFilledAmount.safeSub(\n                matchedFillResults.left.takerAssetFilledAmount\n            );\n        }\n\n        return matchedFillResults;\n    }\n\n    /// @dev Calculates the fill results for the maker and taker in the order matching and writes the results\n    ///      to the fillResults that are being collected on the order. Both orders will be fully filled in this\n    ///      case.\n    /// @param leftMakerAssetAmountRemaining The amount of the left maker asset that is remaining to be filled.\n    /// @param leftTakerAssetAmountRemaining The amount of the left taker asset that is remaining to be filled.\n    /// @param rightMakerAssetAmountRemaining The amount of the right maker asset that is remaining to be filled.\n    /// @param rightTakerAssetAmountRemaining The amount of the right taker asset that is remaining to be filled.\n    /// @return MatchFillResults struct that does not include fees paid or spreads taken.\n    function _calculateCompleteFillBoth(\n        uint256 leftMakerAssetAmountRemaining,\n        uint256 leftTakerAssetAmountRemaining,\n        uint256 rightMakerAssetAmountRemaining,\n        uint256 rightTakerAssetAmountRemaining\n    )\n        private\n        pure\n        returns (MatchedFillResults memory matchedFillResults)\n    {\n        // Calculate the fully filled results for both orders.\n        matchedFillResults.left.makerAssetFilledAmount = leftMakerAssetAmountRemaining;\n        matchedFillResults.left.takerAssetFilledAmount = leftTakerAssetAmountRemaining;\n        matchedFillResults.right.makerAssetFilledAmount = rightMakerAssetAmountRemaining;\n        matchedFillResults.right.takerAssetFilledAmount = rightTakerAssetAmountRemaining;\n\n        return matchedFillResults;\n    }\n\n    /// @dev Calculates the fill results for the maker and taker in the order matching and writes the results\n    ///      to the fillResults that are being collected on the order.\n    /// @param leftOrder The left order that is being maximally filled. All of the information about fill amounts\n    ///                  can be derived from this order and the right asset remaining fields.\n    /// @param rightMakerAssetAmountRemaining The amount of the right maker asset that is remaining to be filled.\n    /// @param rightTakerAssetAmountRemaining The amount of the right taker asset that is remaining to be filled.\n    /// @return MatchFillResults struct that does not include fees paid or spreads taken.\n    function _calculateCompleteRightFill(\n        LibOrder.Order memory leftOrder,\n        uint256 rightMakerAssetAmountRemaining,\n        uint256 rightTakerAssetAmountRemaining\n    )\n        private\n        pure\n        returns (MatchedFillResults memory matchedFillResults)\n    {\n        matchedFillResults.right.makerAssetFilledAmount = rightMakerAssetAmountRemaining;\n        matchedFillResults.right.takerAssetFilledAmount = rightTakerAssetAmountRemaining;\n        matchedFillResults.left.takerAssetFilledAmount = rightMakerAssetAmountRemaining;\n        // Round down to ensure the left maker's exchange rate does not exceed the price specified by the order.\n        // We favor the left maker when the exchange rate must be rounded and the profit is being paid in the\n        // left maker asset.\n        matchedFillResults.left.makerAssetFilledAmount = LibMath.safeGetPartialAmountFloor(\n            leftOrder.makerAssetAmount,\n            leftOrder.takerAssetAmount,\n            rightMakerAssetAmountRemaining\n        );\n\n        return matchedFillResults;\n    }\n}\n"
        },
        "@0x/contracts-utils/contracts/src/LibSafeMath.sol": {
            "id": 30,
            "content": "pragma solidity ^0.5.9;\n\nimport \"./LibRichErrors.sol\";\nimport \"./LibSafeMathRichErrors.sol\";\n\n\nlibrary LibSafeMath {\n\n    function safeMul(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        if (a == 0) {\n            return 0;\n        }\n        uint256 c = a * b;\n        if (c / a != b) {\n            LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n                LibSafeMathRichErrors.BinOpErrorCodes.MULTIPLICATION_OVERFLOW,\n                a,\n                b\n            ));\n        }\n        return c;\n    }\n\n    function safeDiv(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        if (b == 0) {\n            LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n                LibSafeMathRichErrors.BinOpErrorCodes.DIVISION_BY_ZERO,\n                a,\n                b\n            ));\n        }\n        uint256 c = a / b;\n        return c;\n    }\n\n    function safeSub(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        if (b > a) {\n            LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n                LibSafeMathRichErrors.BinOpErrorCodes.SUBTRACTION_UNDERFLOW,\n                a,\n                b\n            ));\n        }\n        return a - b;\n    }\n\n    function safeAdd(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        uint256 c = a + b;\n        if (c < a) {\n            LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n                LibSafeMathRichErrors.BinOpErrorCodes.ADDITION_OVERFLOW,\n                a,\n                b\n            ));\n        }\n        return c;\n    }\n\n    function max256(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        return a >= b ? a : b;\n    }\n\n    function min256(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        return a < b ? a : b;\n    }\n}\n"
        },
        "@0x/contracts-utils/contracts/src/LibSafeMathRichErrors.sol": {
            "id": 31,
            "content": "pragma solidity ^0.5.9;\n\n\nlibrary LibSafeMathRichErrors {\n\n    // bytes4(keccak256(\"Uint256BinOpError(uint8,uint256,uint256)\"))\n    bytes4 internal constant UINT256_BINOP_ERROR_SELECTOR =\n        0xe946c1bb;\n\n    // bytes4(keccak256(\"Uint256DowncastError(uint8,uint256)\"))\n    bytes4 internal constant UINT256_DOWNCAST_ERROR_SELECTOR =\n        0xc996af7b;\n\n    enum BinOpErrorCodes {\n        ADDITION_OVERFLOW,\n        MULTIPLICATION_OVERFLOW,\n        SUBTRACTION_UNDERFLOW,\n        DIVISION_BY_ZERO\n    }\n\n    enum DowncastErrorCodes {\n        VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT32,\n        VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT64,\n        VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT96\n    }\n\n    // solhint-disable func-name-mixedcase\n    function Uint256BinOpError(\n        BinOpErrorCodes errorCode,\n        uint256 a,\n        uint256 b\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            UINT256_BINOP_ERROR_SELECTOR,\n            errorCode,\n            a,\n            b\n        );\n    }\n\n    function Uint256DowncastError(\n        DowncastErrorCodes errorCode,\n        uint256 a\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            UINT256_DOWNCAST_ERROR_SELECTOR,\n            errorCode,\n            a\n        );\n    }\n}\n"
        },
        "@0x/contracts-exchange-libs/contracts/src/LibMath.sol": {
            "id": 36,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"./LibMathRichErrors.sol\";\n\n\nlibrary LibMath {\n\n    using LibSafeMath for uint256;\n\n    /// @dev Calculates partial value given a numerator and denominator rounded down.\n    ///      Reverts if rounding error is >= 0.1%\n    /// @param numerator Numerator.\n    /// @param denominator Denominator.\n    /// @param target Value to calculate partial of.\n    /// @return Partial value of target rounded down.\n    function safeGetPartialAmountFloor(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (uint256 partialAmount)\n    {\n        if (isRoundingErrorFloor(\n                numerator,\n                denominator,\n                target\n        )) {\n            LibRichErrors.rrevert(LibMathRichErrors.RoundingError(\n                numerator,\n                denominator,\n                target\n            ));\n        }\n\n        partialAmount = numerator.safeMul(target).safeDiv(denominator);\n        return partialAmount;\n    }\n\n    /// @dev Calculates partial value given a numerator and denominator rounded down.\n    ///      Reverts if rounding error is >= 0.1%\n    /// @param numerator Numerator.\n    /// @param denominator Denominator.\n    /// @param target Value to calculate partial of.\n    /// @return Partial value of target rounded up.\n    function safeGetPartialAmountCeil(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (uint256 partialAmount)\n    {\n        if (isRoundingErrorCeil(\n                numerator,\n                denominator,\n                target\n        )) {\n            LibRichErrors.rrevert(LibMathRichErrors.RoundingError(\n                numerator,\n                denominator,\n                target\n            ));\n        }\n\n        // safeDiv computes `floor(a / b)`. We use the identity (a, b integer):\n        //       ceil(a / b) = floor((a + b - 1) / b)\n        // To implement `ceil(a / b)` using safeDiv.\n        partialAmount = numerator.safeMul(target)\n            .safeAdd(denominator.safeSub(1))\n            .safeDiv(denominator);\n\n        return partialAmount;\n    }\n\n    /// @dev Calculates partial value given a numerator and denominator rounded down.\n    /// @param numerator Numerator.\n    /// @param denominator Denominator.\n    /// @param target Value to calculate partial of.\n    /// @return Partial value of target rounded down.\n    function getPartialAmountFloor(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (uint256 partialAmount)\n    {\n        partialAmount = numerator.safeMul(target).safeDiv(denominator);\n        return partialAmount;\n    }\n\n    /// @dev Calculates partial value given a numerator and denominator rounded down.\n    /// @param numerator Numerator.\n    /// @param denominator Denominator.\n    /// @param target Value to calculate partial of.\n    /// @return Partial value of target rounded up.\n    function getPartialAmountCeil(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (uint256 partialAmount)\n    {\n        // safeDiv computes `floor(a / b)`. We use the identity (a, b integer):\n        //       ceil(a / b) = floor((a + b - 1) / b)\n        // To implement `ceil(a / b)` using safeDiv.\n        partialAmount = numerator.safeMul(target)\n            .safeAdd(denominator.safeSub(1))\n            .safeDiv(denominator);\n\n        return partialAmount;\n    }\n\n    /// @dev Checks if rounding error >= 0.1% when rounding down.\n    /// @param numerator Numerator.\n    /// @param denominator Denominator.\n    /// @param target Value to multiply with numerator/denominator.\n    /// @return Rounding error is present.\n    function isRoundingErrorFloor(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (bool isError)\n    {\n        if (denominator == 0) {\n            LibRichErrors.rrevert(LibMathRichErrors.DivisionByZeroError());\n        }\n\n        // The absolute rounding error is the difference between the rounded\n        // value and the ideal value. The relative rounding error is the\n        // absolute rounding error divided by the absolute value of the\n        // ideal value. This is undefined when the ideal value is zero.\n        //\n        // The ideal value is `numerator * target / denominator`.\n        // Let's call `numerator * target % denominator` the remainder.\n        // The absolute error is `remainder / denominator`.\n        //\n        // When the ideal value is zero, we require the absolute error to\n        // be zero. Fortunately, this is always the case. The ideal value is\n        // zero iff `numerator == 0` and/or `target == 0`. In this case the\n        // remainder and absolute error are also zero.\n        if (target == 0 || numerator == 0) {\n            return false;\n        }\n\n        // Otherwise, we want the relative rounding error to be strictly\n        // less than 0.1%.\n        // The relative error is `remainder / (numerator * target)`.\n        // We want the relative error less than 1 / 1000:\n        //        remainder / (numerator * denominator)  <  1 / 1000\n        // or equivalently:\n        //        1000 * remainder  <  numerator * target\n        // so we have a rounding error iff:\n        //        1000 * remainder  >=  numerator * target\n        uint256 remainder = mulmod(\n            target,\n            numerator,\n            denominator\n        );\n        isError = remainder.safeMul(1000) >= numerator.safeMul(target);\n        return isError;\n    }\n\n    /// @dev Checks if rounding error >= 0.1% when rounding up.\n    /// @param numerator Numerator.\n    /// @param denominator Denominator.\n    /// @param target Value to multiply with numerator/denominator.\n    /// @return Rounding error is present.\n    function isRoundingErrorCeil(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (bool isError)\n    {\n        if (denominator == 0) {\n            LibRichErrors.rrevert(LibMathRichErrors.DivisionByZeroError());\n        }\n\n        // See the comments in `isRoundingError`.\n        if (target == 0 || numerator == 0) {\n            // When either is zero, the ideal value and rounded value are zero\n            // and there is no rounding error. (Although the relative error\n            // is undefined.)\n            return false;\n        }\n        // Compute remainder as before\n        uint256 remainder = mulmod(\n            target,\n            numerator,\n            denominator\n        );\n        remainder = denominator.safeSub(remainder) % denominator;\n        isError = remainder.safeMul(1000) >= numerator.safeMul(target);\n        return isError;\n    }\n}\n"
        },
        "@0x/contracts-exchange-libs/contracts/src/LibMathRichErrors.sol": {
            "id": 37,
            "content": "pragma solidity ^0.5.9;\n\n\nlibrary LibMathRichErrors {\n\n    // bytes4(keccak256(\"DivisionByZeroError()\"))\n    bytes internal constant DIVISION_BY_ZERO_ERROR =\n        hex\"a791837c\";\n\n    // bytes4(keccak256(\"RoundingError(uint256,uint256,uint256)\"))\n    bytes4 internal constant ROUNDING_ERROR_SELECTOR =\n        0x339f3de2;\n\n    // solhint-disable func-name-mixedcase\n    function DivisionByZeroError()\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return DIVISION_BY_ZERO_ERROR;\n    }\n\n    function RoundingError(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            ROUNDING_ERROR_SELECTOR,\n            numerator,\n            denominator,\n            target\n        );\n    }\n}\n"
        },
        "@0x/contracts-exchange/contracts/src/interfaces/IProtocolFees.sol": {
            "id": 18,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ncontract IProtocolFees {\n\n    // Logs updates to the protocol fee multiplier.\n    event ProtocolFeeMultiplier(uint256 oldProtocolFeeMultiplier, uint256 updatedProtocolFeeMultiplier);\n\n    // Logs updates to the protocolFeeCollector address.\n    event ProtocolFeeCollectorAddress(address oldProtocolFeeCollector, address updatedProtocolFeeCollector);\n\n    /// @dev Allows the owner to update the protocol fee multiplier.\n    /// @param updatedProtocolFeeMultiplier The updated protocol fee multiplier.\n    function setProtocolFeeMultiplier(uint256 updatedProtocolFeeMultiplier)\n        external;\n\n    /// @dev Allows the owner to update the protocolFeeCollector address.\n    /// @param updatedProtocolFeeCollector The updated protocolFeeCollector contract address.\n    function setProtocolFeeCollectorAddress(address updatedProtocolFeeCollector)\n        external;\n\n    /// @dev Returns the protocolFeeMultiplier\n    function protocolFeeMultiplier()\n        external\n        view\n        returns (uint256);\n\n    /// @dev Returns the protocolFeeCollector address\n    function protocolFeeCollector()\n        external\n        view\n        returns (address);\n}\n"
        },
        "@0x/contracts-exchange/contracts/src/interfaces/IMatchOrders.sol": {
            "id": 17,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibFillResults.sol\";\n\n\ncontract IMatchOrders {\n\n    /// @dev Match complementary orders that have a profitable spread.\n    ///      Each order is filled at their respective price point, and\n    ///      the matcher receives a profit denominated in the left maker asset.\n    /// @param leftOrders Set of orders with the same maker / taker asset.\n    /// @param rightOrders Set of orders to match against `leftOrders`\n    /// @param leftSignatures Proof that left orders were created by the left makers.\n    /// @param rightSignatures Proof that right orders were created by the right makers.\n    /// @return batchMatchedFillResults Amounts filled and profit generated.\n    function batchMatchOrders(\n        LibOrder.Order[] memory leftOrders,\n        LibOrder.Order[] memory rightOrders,\n        bytes[] memory leftSignatures,\n        bytes[] memory rightSignatures\n    )\n        public\n        payable\n        returns (LibFillResults.BatchMatchedFillResults memory batchMatchedFillResults);\n\n    /// @dev Match complementary orders that have a profitable spread.\n    ///      Each order is maximally filled at their respective price point, and\n    ///      the matcher receives a profit denominated in either the left maker asset,\n    ///      right maker asset, or a combination of both.\n    /// @param leftOrders Set of orders with the same maker / taker asset.\n    /// @param rightOrders Set of orders to match against `leftOrders`\n    /// @param leftSignatures Proof that left orders were created by the left makers.\n    /// @param rightSignatures Proof that right orders were created by the right makers.\n    /// @return batchMatchedFillResults Amounts filled and profit generated.\n    function batchMatchOrdersWithMaximalFill(\n        LibOrder.Order[] memory leftOrders,\n        LibOrder.Order[] memory rightOrders,\n        bytes[] memory leftSignatures,\n        bytes[] memory rightSignatures\n    )\n        public\n        payable\n        returns (LibFillResults.BatchMatchedFillResults memory batchMatchedFillResults);\n\n    /// @dev Match two complementary orders that have a profitable spread.\n    ///      Each order is filled at their respective price point. However, the calculations are\n    ///      carried out as though the orders are both being filled at the right order's price point.\n    ///      The profit made by the left order goes to the taker (who matched the two orders).\n    /// @param leftOrder First order to match.\n    /// @param rightOrder Second order to match.\n    /// @param leftSignature Proof that order was created by the left maker.\n    /// @param rightSignature Proof that order was created by the right maker.\n    /// @return matchedFillResults Amounts filled and fees paid by maker and taker of matched orders.\n    function matchOrders(\n        LibOrder.Order memory leftOrder,\n        LibOrder.Order memory rightOrder,\n        bytes memory leftSignature,\n        bytes memory rightSignature\n    )\n        public\n        payable\n        returns (LibFillResults.MatchedFillResults memory matchedFillResults);\n\n    /// @dev Match two complementary orders that have a profitable spread.\n    ///      Each order is maximally filled at their respective price point, and\n    ///      the matcher receives a profit denominated in either the left maker asset,\n    ///      right maker asset, or a combination of both.\n    /// @param leftOrder First order to match.\n    /// @param rightOrder Second order to match.\n    /// @param leftSignature Proof that order was created by the left maker.\n    /// @param rightSignature Proof that order was created by the right maker.\n    /// @return matchedFillResults Amounts filled by maker and taker of matched orders.\n    function matchOrdersWithMaximalFill(\n        LibOrder.Order memory leftOrder,\n        LibOrder.Order memory rightOrder,\n        bytes memory leftSignature,\n        bytes memory rightSignature\n    )\n        public\n        payable\n        returns (LibFillResults.MatchedFillResults memory matchedFillResults);\n}\n"
        },
        "@0x/contracts-exchange/contracts/src/interfaces/ISignatureValidator.sol": {
            "id": 19,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibZeroExTransaction.sol\";\n\n\ncontract ISignatureValidator {\n\n   // Allowed signature types.\n    enum SignatureType {\n        Illegal,                     // 0x00, default value\n        Invalid,                     // 0x01\n        EIP712,                      // 0x02\n        EthSign,                     // 0x03\n        Wallet,                      // 0x04\n        Validator,                   // 0x05\n        PreSigned,                   // 0x06\n        EIP1271Wallet,               // 0x07\n        NSignatureTypes              // 0x08, number of signature types. Always leave at end.\n    }\n\n    event SignatureValidatorApproval(\n        address indexed signerAddress,     // Address that approves or disapproves a contract to verify signatures.\n        address indexed validatorAddress,  // Address of signature validator contract.\n        bool isApproved                    // Approval or disapproval of validator contract.\n    );\n\n    /// @dev Approves a hash on-chain.\n    ///      After presigning a hash, the preSign signature type will become valid for that hash and signer.\n    /// @param hash Any 32-byte hash.\n    function preSign(bytes32 hash)\n        external\n        payable;\n\n    /// @dev Approves/unnapproves a Validator contract to verify signatures on signer's behalf.\n    /// @param validatorAddress Address of Validator contract.\n    /// @param approval Approval or disapproval of  Validator contract.\n    function setSignatureValidatorApproval(\n        address validatorAddress,\n        bool approval\n    )\n        external\n        payable;\n\n    /// @dev Verifies that a hash has been signed by the given signer.\n    /// @param hash Any 32-byte hash.\n    /// @param signature Proof that the hash has been signed by signer.\n    /// @return isValid `true` if the signature is valid for the given hash and signer.\n    function isValidHashSignature(\n        bytes32 hash,\n        address signerAddress,\n        bytes memory signature\n    )\n        public\n        view\n        returns (bool isValid);\n\n    /// @dev Verifies that a signature for an order is valid.\n    /// @param order The order.\n    /// @param signature Proof that the order has been signed by signer.\n    /// @return isValid true if the signature is valid for the given order and signer.\n    function isValidOrderSignature(\n        LibOrder.Order memory order,\n        bytes memory signature\n    )\n        public\n        view\n        returns (bool isValid);\n\n    /// @dev Verifies that a signature for a transaction is valid.\n    /// @param transaction The transaction.\n    /// @param signature Proof that the order has been signed by signer.\n    /// @return isValid true if the signature is valid for the given transaction and signer.\n    function isValidTransactionSignature(\n        LibZeroExTransaction.ZeroExTransaction memory transaction,\n        bytes memory signature\n    )\n        public\n        view\n        returns (bool isValid);\n\n    /// @dev Verifies that an order, with provided order hash, has been signed\n    ///      by the given signer.\n    /// @param order The order.\n    /// @param orderHash The hash of the order.\n    /// @param signature Proof that the hash has been signed by signer.\n    /// @return isValid True if the signature is valid for the given order and signer.\n    function _isValidOrderWithHashSignature(\n        LibOrder.Order memory order,\n        bytes32 orderHash,\n        bytes memory signature\n    )\n        internal\n        view\n        returns (bool isValid);\n\n    /// @dev Verifies that a transaction, with provided order hash, has been signed\n    ///      by the given signer.\n    /// @param transaction The transaction.\n    /// @param transactionHash The hash of the transaction.\n    /// @param signature Proof that the hash has been signed by signer.\n    /// @return isValid True if the signature is valid for the given transaction and signer.\n    function _isValidTransactionWithHashSignature(\n        LibZeroExTransaction.ZeroExTransaction memory transaction,\n        bytes32 transactionHash,\n        bytes memory signature\n    )\n        internal\n        view\n        returns (bool isValid);\n}\n"
        },
        "@0x/contracts-exchange/contracts/src/interfaces/IAssetProxyDispatcher.sol": {
            "id": 14,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ncontract IAssetProxyDispatcher {\n\n    // Logs registration of new asset proxy\n    event AssetProxyRegistered(\n        bytes4 id,              // Id of new registered AssetProxy.\n        address assetProxy      // Address of new registered AssetProxy.\n    );\n\n    /// @dev Registers an asset proxy to its asset proxy id.\n    ///      Once an asset proxy is registered, it cannot be unregistered.\n    /// @param assetProxy Address of new asset proxy to register.\n    function registerAssetProxy(address assetProxy)\n        external;\n\n    /// @dev Gets an asset proxy.\n    /// @param assetProxyId Id of the asset proxy.\n    /// @return The asset proxy registered to assetProxyId. Returns 0x0 if no proxy is registered.\n    function getAssetProxy(bytes4 assetProxyId)\n        external\n        view\n        returns (address);\n}\n"
        },
        "@0x/contracts-exchange/contracts/src/interfaces/IWrapperFunctions.sol": {
            "id": 22,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibFillResults.sol\";\n\n\ncontract IWrapperFunctions {\n\n    /// @dev Fills the input order. Reverts if exact takerAssetFillAmount not filled.\n    /// @param order Order struct containing order specifications.\n    /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n    /// @param signature Proof that order has been created by maker.\n    function fillOrKillOrder(\n        LibOrder.Order memory order,\n        uint256 takerAssetFillAmount,\n        bytes memory signature\n    )\n        public\n        payable\n        returns (LibFillResults.FillResults memory fillResults);\n\n    /// @dev Executes multiple calls of fillOrder.\n    /// @param orders Array of order specifications.\n    /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n    /// @param signatures Proofs that orders have been created by makers.\n    /// @return Array of amounts filled and fees paid by makers and taker.\n    function batchFillOrders(\n        LibOrder.Order[] memory orders,\n        uint256[] memory takerAssetFillAmounts,\n        bytes[] memory signatures\n    )\n        public\n        payable\n        returns (LibFillResults.FillResults[] memory fillResults);\n\n    /// @dev Executes multiple calls of fillOrKillOrder.\n    /// @param orders Array of order specifications.\n    /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n    /// @param signatures Proofs that orders have been created by makers.\n    /// @return Array of amounts filled and fees paid by makers and taker.\n    function batchFillOrKillOrders(\n        LibOrder.Order[] memory orders,\n        uint256[] memory takerAssetFillAmounts,\n        bytes[] memory signatures\n    )\n        public\n        payable\n        returns (LibFillResults.FillResults[] memory fillResults);\n\n    /// @dev Executes multiple calls of fillOrder. If any fill reverts, the error is caught and ignored.\n    /// @param orders Array of order specifications.\n    /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n    /// @param signatures Proofs that orders have been created by makers.\n    /// @return Array of amounts filled and fees paid by makers and taker.\n    function batchFillOrdersNoThrow(\n        LibOrder.Order[] memory orders,\n        uint256[] memory takerAssetFillAmounts,\n        bytes[] memory signatures\n    )\n        public\n        payable\n        returns (LibFillResults.FillResults[] memory fillResults);\n\n    /// @dev Executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n    ///      If any fill reverts, the error is caught and ignored.\n    ///      NOTE: This function does not enforce that the takerAsset is the same for each order.\n    /// @param orders Array of order specifications.\n    /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n    /// @param signatures Proofs that orders have been signed by makers.\n    /// @return Amounts filled and fees paid by makers and taker.\n    function marketSellOrdersNoThrow(\n        LibOrder.Order[] memory orders,\n        uint256 takerAssetFillAmount,\n        bytes[] memory signatures\n    )\n        public\n        payable\n        returns (LibFillResults.FillResults memory fillResults);\n\n    /// @dev Executes multiple calls of fillOrder until total amount of makerAsset is bought by taker.\n    ///      If any fill reverts, the error is caught and ignored.\n    ///      NOTE: This function does not enforce that the makerAsset is the same for each order.\n    /// @param orders Array of order specifications.\n    /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n    /// @param signatures Proofs that orders have been signed by makers.\n    /// @return Amounts filled and fees paid by makers and taker.\n    function marketBuyOrdersNoThrow(\n        LibOrder.Order[] memory orders,\n        uint256 makerAssetFillAmount,\n        bytes[] memory signatures\n    )\n        public\n        payable\n        returns (LibFillResults.FillResults memory fillResults);\n\n    /// @dev Calls marketSellOrdersNoThrow then reverts if < takerAssetFillAmount has been sold.\n    ///      NOTE: This function does not enforce that the takerAsset is the same for each order.\n    /// @param orders Array of order specifications.\n    /// @param takerAssetFillAmount Minimum amount of takerAsset to sell.\n    /// @param signatures Proofs that orders have been signed by makers.\n    /// @return Amounts filled and fees paid by makers and taker.\n    function marketSellOrdersFillOrKill(\n        LibOrder.Order[] memory orders,\n        uint256 takerAssetFillAmount,\n        bytes[] memory signatures\n    )\n        public\n        payable\n        returns (LibFillResults.FillResults memory fillResults);\n\n    /// @dev Calls marketBuyOrdersNoThrow then reverts if < makerAssetFillAmount has been bought.\n    ///      NOTE: This function does not enforce that the makerAsset is the same for each order.\n    /// @param orders Array of order specifications.\n    /// @param makerAssetFillAmount Minimum amount of makerAsset to buy.\n    /// @param signatures Proofs that orders have been signed by makers.\n    /// @return Amounts filled and fees paid by makers and taker.\n    function marketBuyOrdersFillOrKill(\n        LibOrder.Order[] memory orders,\n        uint256 makerAssetFillAmount,\n        bytes[] memory signatures\n    )\n        public\n        payable\n        returns (LibFillResults.FillResults memory fillResults);\n\n    /// @dev Executes multiple calls of cancelOrder.\n    /// @param orders Array of order specifications.\n    function batchCancelOrders(LibOrder.Order[] memory orders)\n        public\n        payable;\n}\n"
        },
        "@0x/contracts-exchange/contracts/src/interfaces/ITransferSimulator.sol": {
            "id": 21,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\n\ncontract ITransferSimulator {\n\n    /// @dev This function may be used to simulate any amount of transfers\n    /// As they would occur through the Exchange contract. Note that this function\n    /// will always revert, even if all transfers are successful. However, it may\n    /// be used with eth_call or with a try/catch pattern in order to simulate\n    /// the results of the transfers.\n    /// @param assetData Array of asset details, each encoded per the AssetProxy contract specification.\n    /// @param fromAddresses Array containing the `from` addresses that correspond with each transfer.\n    /// @param toAddresses Array containing the `to` addresses that correspond with each transfer.\n    /// @param amounts Array containing the amounts that correspond to each transfer.\n    /// @return This function does not return a value. However, it will always revert with\n    /// `Error(\"TRANSFERS_SUCCESSFUL\")` if all of the transfers were successful.\n    function simulateDispatchTransferFromCalls(\n        bytes[] memory assetData,\n        address[] memory fromAddresses,\n        address[] memory toAddresses,\n        uint256[] memory amounts\n    )\n        public;\n}\n"
        },
        "./libs/LibCoordinatorApproval.sol": {
            "id": 8,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"./LibEIP712CoordinatorDomain.sol\";\n\n\ncontract LibCoordinatorApproval is\n    LibEIP712CoordinatorDomain\n{\n    // Hash for the EIP712 Coordinator approval message\n    // keccak256(abi.encodePacked(\n    //     \"CoordinatorApproval(\",\n    //     \"address txOrigin,\",\n    //     \"bytes32 transactionHash,\",\n    //     \"bytes transactionSignature\",\n    //     \")\"\n    // ));\n    bytes32 constant public EIP712_COORDINATOR_APPROVAL_SCHEMA_HASH =\n        0xa6511c04ca44625d50986f8c36bedc09366207a17b96e347094053a9f8507168;\n\n    struct CoordinatorApproval {\n        address txOrigin;                       // Required signer of Ethereum transaction that is submitting approval.\n        bytes32 transactionHash;                // EIP712 hash of the transaction.\n        bytes transactionSignature;             // Signature of the 0x transaction.\n    }\n\n    /// @dev Calculates the EIP712 hash of the Coordinator approval mesasage using the domain\n    ///      separator of this contract.\n    /// @param approval Coordinator approval message containing the transaction hash, and transaction\n    ///        signature.\n    /// @return approvalHash EIP712 hash of the Coordinator approval message with the domain\n    ///         separator of this contract.\n    function getCoordinatorApprovalHash(CoordinatorApproval memory approval)\n        public\n        view\n        returns (bytes32 approvalHash)\n    {\n        approvalHash = _hashEIP712CoordinatorMessage(_hashCoordinatorApproval(approval));\n        return approvalHash;\n    }\n\n    /// @dev Calculates the EIP712 hash of the Coordinator approval mesasage with no domain separator.\n    /// @param approval Coordinator approval message containing the transaction hash, and transaction\n    //         signature.\n    /// @return result EIP712 hash of the Coordinator approval message with no domain separator.\n    function _hashCoordinatorApproval(CoordinatorApproval memory approval)\n        internal\n        pure\n        returns (bytes32 result)\n    {\n        bytes32 schemaHash = EIP712_COORDINATOR_APPROVAL_SCHEMA_HASH;\n        bytes memory transactionSignature = approval.transactionSignature;\n        address txOrigin = approval.txOrigin;\n        bytes32 transactionHash = approval.transactionHash;\n\n        // Assembly for more efficiently computing:\n        // keccak256(abi.encodePacked(\n        //     EIP712_COORDINATOR_APPROVAL_SCHEMA_HASH,\n        //     approval.txOrigin,\n        //     approval.transactionHash,\n        //     keccak256(approval.transactionSignature)\n        // ));\n\n        assembly {\n            // Compute hash of transaction signature\n            let transactionSignatureHash := keccak256(add(transactionSignature, 32), mload(transactionSignature))\n\n            // Load free memory pointer\n            let memPtr := mload(64)\n\n            mstore(memPtr, schemaHash)                               // hash of schema\n            mstore(add(memPtr, 32), txOrigin)                        // txOrigin\n            mstore(add(memPtr, 64), transactionHash)                 // transactionHash\n            mstore(add(memPtr, 96), transactionSignatureHash)        // transactionSignatureHash\n            // Compute hash\n            result := keccak256(memPtr, 128)\n        }\n        return result;\n    }\n}\n"
        },
        "./interfaces/ICoordinatorApprovalVerifier.sol": {
            "id": 4,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibZeroExTransaction.sol\";\n\n\ncontract ICoordinatorApprovalVerifier {\n\n    /// @dev Validates that the 0x transaction has been approved by all of the feeRecipients\n    ///      that correspond to each order in the transaction's Exchange calldata.\n    /// @param transaction 0x transaction containing salt, signerAddress, and data.\n    /// @param txOrigin Required signer of Ethereum transaction calling this function.\n    /// @param transactionSignature Proof that the transaction has been signed by the signer.\n    /// @param approvalSignatures Array of signatures that correspond to the feeRecipients of each\n    ///        order in the transaction's Exchange calldata.\n    function assertValidCoordinatorApprovals(\n        LibZeroExTransaction.ZeroExTransaction memory transaction,\n        address txOrigin,\n        bytes memory transactionSignature,\n        bytes[] memory approvalSignatures\n    )\n        public\n        view;\n\n    /// @dev Decodes the orders from Exchange calldata representing any fill method.\n    /// @param data Exchange calldata representing a fill method.\n    /// @return orders The orders from the Exchange calldata.\n    function decodeOrdersFromFillData(bytes memory data)\n        public\n        pure\n        returns (LibOrder.Order[] memory orders);\n}\n"
        },
        "./MixinCoordinatorCore.sol": {
            "id": 2,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibZeroExTransaction.sol\";\nimport \"@0x/contracts-utils/contracts/src/Refundable.sol\";\nimport \"./libs/LibConstants.sol\";\nimport \"./interfaces/ICoordinatorCore.sol\";\nimport \"./interfaces/ICoordinatorApprovalVerifier.sol\";\n\n\n// solhint-disable no-empty-blocks\ncontract MixinCoordinatorCore is\n    Refundable,\n    LibConstants,\n    ICoordinatorApprovalVerifier,\n    ICoordinatorCore\n{\n\n    /// @dev A payable fallback function that makes this contract \"payable\". This is necessary to allow\n    ///      this contract to gracefully handle refunds from the Exchange.\n    function ()\n        external\n        payable\n    {}\n\n    /// @dev Executes a 0x transaction that has been signed by the feeRecipients that correspond to\n    ///      each order in the transaction's Exchange calldata.\n    /// @param transaction 0x transaction containing salt, signerAddress, and data.\n    /// @param txOrigin Required signer of Ethereum transaction calling this function.\n    /// @param transactionSignature Proof that the transaction has been signed by the signer.\n    /// @param approvalSignatures Array of signatures that correspond to the feeRecipients of each\n    ///        order in the transaction's Exchange calldata.\n    function executeTransaction(\n        LibZeroExTransaction.ZeroExTransaction memory transaction,\n        address txOrigin,\n        bytes memory transactionSignature,\n        bytes[] memory approvalSignatures\n    )\n        public\n        payable\n        refundFinalBalance\n    {\n        // Validate that the 0x transaction has been approves by each feeRecipient\n        assertValidCoordinatorApprovals(\n            transaction,\n            txOrigin,\n            transactionSignature,\n            approvalSignatures\n        );\n\n        // Execute the transaction\n        EXCHANGE.executeTransaction.value(msg.value)(transaction, transactionSignature);\n    }\n}\n"
        },
        "@0x/contracts-utils/contracts/src/Refundable.sol": {
            "id": 33,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"./ReentrancyGuard.sol\";\n\n\ncontract Refundable is\n    ReentrancyGuard\n{\n\n    // This bool is used by the refund modifier to allow for lazily evaluated refunds.\n    bool internal _shouldNotRefund;\n\n    modifier refundFinalBalance {\n        _;\n        _refundNonZeroBalanceIfEnabled();\n    }\n\n    modifier refundFinalBalanceNoReentry {\n        _lockMutexOrThrowIfAlreadyLocked();\n        _;\n        _refundNonZeroBalanceIfEnabled();\n        _unlockMutex();\n    }\n\n    modifier disableRefundUntilEnd {\n        if (_areRefundsDisabled()) {\n            _;\n        } else {\n            _disableRefund();\n            _;\n            _enableAndRefundNonZeroBalance();\n        }\n    }\n\n    function _refundNonZeroBalanceIfEnabled()\n        internal\n    {\n        if (!_areRefundsDisabled()) {\n            _refundNonZeroBalance();\n        }\n    }\n\n    function _refundNonZeroBalance()\n        internal\n    {\n        uint256 balance = address(this).balance;\n        if (balance > 0) {\n            msg.sender.transfer(balance);\n        }\n    }\n\n    function _disableRefund()\n        internal\n    {\n        _shouldNotRefund = true;\n    }\n\n    function _enableAndRefundNonZeroBalance()\n        internal\n    {\n        _shouldNotRefund = false;\n        _refundNonZeroBalance();\n    }\n\n    function _areRefundsDisabled()\n        internal\n        view\n        returns (bool)\n    {\n        return _shouldNotRefund;\n    }\n}\n"
        },
        "@0x/contracts-utils/contracts/src/ReentrancyGuard.sol": {
            "id": 32,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"./LibReentrancyGuardRichErrors.sol\";\nimport \"./LibRichErrors.sol\";\n\n\ncontract ReentrancyGuard {\n\n    // Locked state of mutex.\n    bool private _locked = false;\n\n    /// @dev Functions with this modifer cannot be reentered. The mutex will be locked\n    ///      before function execution and unlocked after.\n    modifier nonReentrant() {\n        _lockMutexOrThrowIfAlreadyLocked();\n        _;\n        _unlockMutex();\n    }\n\n    function _lockMutexOrThrowIfAlreadyLocked()\n        internal\n    {\n        // Ensure mutex is unlocked.\n        if (_locked) {\n            LibRichErrors.rrevert(\n                LibReentrancyGuardRichErrors.IllegalReentrancyError()\n            );\n        }\n        // Lock mutex.\n        _locked = true;\n    }\n\n    function _unlockMutex()\n        internal\n    {\n        // Unlock mutex.\n        _locked = false;\n    }\n}\n"
        },
        "@0x/contracts-utils/contracts/src/LibReentrancyGuardRichErrors.sol": {
            "id": 28,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\nlibrary LibReentrancyGuardRichErrors {\n\n    // bytes4(keccak256(\"IllegalReentrancyError()\"))\n    bytes internal constant ILLEGAL_REENTRANCY_ERROR_SELECTOR_BYTES =\n        hex\"0c3b823f\";\n\n    // solhint-disable func-name-mixedcase\n    function IllegalReentrancyError()\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return ILLEGAL_REENTRANCY_ERROR_SELECTOR_BYTES;\n    }\n}\n"
        },
        "./interfaces/ICoordinatorCore.sol": {
            "id": 5,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibZeroExTransaction.sol\";\n\n\ncontract ICoordinatorCore {\n\n    /// @dev Executes a 0x transaction that has been signed by the feeRecipients that correspond to\n    ///      each order in the transaction's Exchange calldata.\n    /// @param transaction 0x transaction containing salt, signerAddress, and data.\n    /// @param txOrigin Required signer of Ethereum transaction calling this function.\n    /// @param transactionSignature Proof that the transaction has been signed by the signer.\n    /// @param approvalSignatures Array of signatures that correspond to the feeRecipients of each\n    ///        order in the transaction's Exchange calldata.\n    function executeTransaction(\n        LibZeroExTransaction.ZeroExTransaction memory transaction,\n        address txOrigin,\n        bytes memory transactionSignature,\n        bytes[] memory approvalSignatures\n    )\n        public\n        payable;\n}\n"
        }
    },
    "sourceCodes": {
        "./Coordinator.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibEIP712ExchangeDomain.sol\";\nimport \"./libs/LibConstants.sol\";\nimport \"./libs/LibEIP712CoordinatorDomain.sol\";\nimport \"./MixinSignatureValidator.sol\";\nimport \"./MixinCoordinatorApprovalVerifier.sol\";\nimport \"./MixinCoordinatorCore.sol\";\n\n\n// solhint-disable no-empty-blocks\ncontract Coordinator is\n    LibConstants,\n    MixinSignatureValidator,\n    MixinCoordinatorApprovalVerifier,\n    MixinCoordinatorCore\n{\n    /// @param exchange Address of the 0x Exchange contract.\n    /// @param chainId Chain ID of the network this contract is deployed on.\n    constructor (address exchange, uint256 chainId)\n        public\n        LibConstants(exchange)\n        LibEIP712CoordinatorDomain(chainId, address(0))\n        LibEIP712ExchangeDomain(chainId, exchange)\n    {}\n}\n",
        "@0x/contracts-exchange-libs/contracts/src/LibEIP712ExchangeDomain.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibEIP712.sol\";\n\n\ncontract LibEIP712ExchangeDomain {\n\n    // EIP712 Exchange Domain Name value\n    string constant internal _EIP712_EXCHANGE_DOMAIN_NAME = \"0x Protocol\";\n\n    // EIP712 Exchange Domain Version value\n    string constant internal _EIP712_EXCHANGE_DOMAIN_VERSION = \"3.0.0\";\n\n    // solhint-disable var-name-mixedcase\n    /// @dev Hash of the EIP712 Domain Separator data\n    /// @return 0 Domain hash.\n    bytes32 public EIP712_EXCHANGE_DOMAIN_HASH;\n    // solhint-enable var-name-mixedcase\n\n    /// @param chainId Chain ID of the network this contract is deployed on.\n    /// @param verifyingContractAddressIfExists Address of the verifying contract (null if the address of this contract)\n    constructor (\n        uint256 chainId,\n        address verifyingContractAddressIfExists\n    )\n        public\n    {\n        address verifyingContractAddress = verifyingContractAddressIfExists == address(0) ? address(this) : verifyingContractAddressIfExists;\n        EIP712_EXCHANGE_DOMAIN_HASH = LibEIP712.hashEIP712Domain(\n            _EIP712_EXCHANGE_DOMAIN_NAME,\n            _EIP712_EXCHANGE_DOMAIN_VERSION,\n            chainId,\n            verifyingContractAddress\n        );\n    }\n}\n",
        "@0x/contracts-utils/contracts/src/LibEIP712.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\nlibrary LibEIP712 {\n\n    // Hash of the EIP712 Domain Separator Schema\n    // keccak256(abi.encodePacked(\n    //     \"EIP712Domain(\",\n    //     \"string name,\",\n    //     \"string version,\",\n    //     \"uint256 chainId,\",\n    //     \"address verifyingContract\",\n    //     \")\"\n    // ))\n    bytes32 constant internal _EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH = 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f;\n\n    /// @dev Calculates a EIP712 domain separator.\n    /// @param name The EIP712 domain name.\n    /// @param version The EIP712 domain version.\n    /// @param verifyingContract The EIP712 verifying contract.\n    /// @return EIP712 domain separator.\n    function hashEIP712Domain(\n        string memory name,\n        string memory version,\n        uint256 chainId,\n        address verifyingContract\n    )\n        internal\n        pure\n        returns (bytes32 result)\n    {\n        bytes32 schemaHash = _EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH;\n\n        // Assembly for more efficient computing:\n        // keccak256(abi.encodePacked(\n        //     _EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH,\n        //     keccak256(bytes(name)),\n        //     keccak256(bytes(version)),\n        //     chainId,\n        //     uint256(verifyingContract)\n        // ))\n\n        assembly {\n            // Calculate hashes of dynamic data\n            let nameHash := keccak256(add(name, 32), mload(name))\n            let versionHash := keccak256(add(version, 32), mload(version))\n\n            // Load free memory pointer\n            let memPtr := mload(64)\n\n            // Store params in memory\n            mstore(memPtr, schemaHash)\n            mstore(add(memPtr, 32), nameHash)\n            mstore(add(memPtr, 64), versionHash)\n            mstore(add(memPtr, 96), chainId)\n            mstore(add(memPtr, 128), verifyingContract)\n\n            // Compute hash\n            result := keccak256(memPtr, 160)\n        }\n        return result;\n    }\n\n    /// @dev Calculates EIP712 encoding for a hash struct with a given domain hash.\n    /// @param eip712DomainHash Hash of the domain domain separator data, computed\n    ///                         with getDomainHash().\n    /// @param hashStruct The EIP712 hash struct.\n    /// @return EIP712 hash applied to the given EIP712 Domain.\n    function hashEIP712Message(bytes32 eip712DomainHash, bytes32 hashStruct)\n        internal\n        pure\n        returns (bytes32 result)\n    {\n        // Assembly for more efficient computing:\n        // keccak256(abi.encodePacked(\n        //     EIP191_HEADER,\n        //     EIP712_DOMAIN_HASH,\n        //     hashStruct\n        // ));\n\n        assembly {\n            // Load free memory pointer\n            let memPtr := mload(64)\n\n            mstore(memPtr, 0x1901000000000000000000000000000000000000000000000000000000000000)  // EIP191 header\n            mstore(add(memPtr, 2), eip712DomainHash)                                            // EIP712 domain hash\n            mstore(add(memPtr, 34), hashStruct)                                                 // Hash of struct\n\n            // Compute hash\n            result := keccak256(memPtr, 66)\n        }\n        return result;\n    }\n}\n",
        "./libs/LibConstants.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-exchange/contracts/src/interfaces/ITransactions.sol\";\n\n\n// solhint-disable var-name-mixedcase\ncontract LibConstants {\n\n    // The 0x Exchange contract.\n    ITransactions internal EXCHANGE;\n\n    /// @param exchange Address of the 0x Exchange contract.\n    constructor (address exchange)\n        public\n    {\n        EXCHANGE = ITransactions(exchange);\n    }\n}\n",
        "@0x/contracts-exchange/contracts/src/interfaces/ITransactions.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibZeroExTransaction.sol\";\n\n\ncontract ITransactions {\n\n    // TransactionExecution event is emitted when a ZeroExTransaction is executed.\n    event TransactionExecution(bytes32 indexed transactionHash);\n\n    /// @dev Executes an Exchange method call in the context of signer.\n    /// @param transaction 0x transaction containing salt, signerAddress, and data.\n    /// @param signature Proof that transaction has been signed by signer.\n    /// @return ABI encoded return data of the underlying Exchange function call.\n    function executeTransaction(\n        LibZeroExTransaction.ZeroExTransaction memory transaction,\n        bytes memory signature\n    )\n        public\n        payable\n        returns (bytes memory);\n\n    /// @dev Executes a batch of Exchange method calls in the context of signer(s).\n    /// @param transactions Array of 0x transactions containing salt, signerAddress, and data.\n    /// @param signatures Array of proofs that transactions have been signed by signer(s).\n    /// @return Array containing ABI encoded return data for each of the underlying Exchange function calls.\n    function batchExecuteTransactions(\n        LibZeroExTransaction.ZeroExTransaction[] memory transactions,\n        bytes[] memory signatures\n    )\n        public\n        payable\n        returns (bytes[] memory);\n\n    /// @dev The current function will be called in the context of this address (either 0x transaction signer or `msg.sender`).\n    ///      If calling a fill function, this address will represent the taker.\n    ///      If calling a cancel function, this address will represent the maker.\n    /// @return Signer of 0x transaction if entry point is `executeTransaction`.\n    ///         `msg.sender` if entry point is any other function.\n    function _getCurrentContextAddress()\n        internal\n        view\n        returns (address);\n}\n",
        "@0x/contracts-exchange-libs/contracts/src/LibZeroExTransaction.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-utils/contracts/src/LibEIP712.sol\";\n\n\nlibrary LibZeroExTransaction {\n\n    using LibZeroExTransaction for ZeroExTransaction;\n\n    // Hash for the EIP712 0x transaction schema\n    // keccak256(abi.encodePacked(\n    //    \"ZeroExTransaction(\",\n    //    \"uint256 salt,\",\n    //    \"uint256 expirationTimeSeconds,\",\n    //    \"uint256 gasPrice,\",\n    //    \"address signerAddress,\",\n    //    \"bytes data\",\n    //    \")\"\n    // ));\n    bytes32 constant internal _EIP712_ZEROEX_TRANSACTION_SCHEMA_HASH = 0xec69816980a3a3ca4554410e60253953e9ff375ba4536a98adfa15cc71541508;\n\n    struct ZeroExTransaction {\n        uint256 salt;                   // Arbitrary number to ensure uniqueness of transaction hash.\n        uint256 expirationTimeSeconds;  // Timestamp in seconds at which transaction expires.\n        uint256 gasPrice;               // gasPrice that transaction is required to be executed with.\n        address signerAddress;          // Address of transaction signer.\n        bytes data;                     // AbiV2 encoded calldata.\n    }\n\n    /// @dev Calculates the EIP712 typed data hash of a transaction with a given domain separator.\n    /// @param transaction 0x transaction structure.\n    /// @return EIP712 typed data hash of the transaction.\n    function getTypedDataHash(ZeroExTransaction memory transaction, bytes32 eip712ExchangeDomainHash)\n        internal\n        pure\n        returns (bytes32 transactionHash)\n    {\n        // Hash the transaction with the domain separator of the Exchange contract.\n        transactionHash = LibEIP712.hashEIP712Message(\n            eip712ExchangeDomainHash,\n            transaction.getStructHash()\n        );\n        return transactionHash;\n    }\n\n    /// @dev Calculates EIP712 hash of the 0x transaction struct.\n    /// @param transaction 0x transaction structure.\n    /// @return EIP712 hash of the transaction struct.\n    function getStructHash(ZeroExTransaction memory transaction)\n        internal\n        pure\n        returns (bytes32 result)\n    {\n        bytes32 schemaHash = _EIP712_ZEROEX_TRANSACTION_SCHEMA_HASH;\n        bytes memory data = transaction.data;\n        uint256 salt = transaction.salt;\n        uint256 expirationTimeSeconds = transaction.expirationTimeSeconds;\n        uint256 gasPrice = transaction.gasPrice;\n        address signerAddress = transaction.signerAddress;\n\n        // Assembly for more efficiently computing:\n        // result = keccak256(abi.encodePacked(\n        //     schemaHash,\n        //     salt,\n        //     expirationTimeSeconds,\n        //     gasPrice,\n        //     uint256(signerAddress),\n        //     keccak256(data)\n        // ));\n\n        assembly {\n            // Compute hash of data\n            let dataHash := keccak256(add(data, 32), mload(data))\n\n            // Load free memory pointer\n            let memPtr := mload(64)\n\n            mstore(memPtr, schemaHash)                                                                // hash of schema\n            mstore(add(memPtr, 32), salt)                                                             // salt\n            mstore(add(memPtr, 64), expirationTimeSeconds)                                            // expirationTimeSeconds\n            mstore(add(memPtr, 96), gasPrice)                                                         // gasPrice\n            mstore(add(memPtr, 128), and(signerAddress, 0xffffffffffffffffffffffffffffffffffffffff))  // signerAddress\n            mstore(add(memPtr, 160), dataHash)                                                        // hash of data\n\n            // Compute hash\n            result := keccak256(memPtr, 192)\n        }\n        return result;\n    }\n}\n",
        "./libs/LibEIP712CoordinatorDomain.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibEIP712.sol\";\n\n\ncontract LibEIP712CoordinatorDomain {\n\n    // EIP712 Domain Name value for the Coordinator\n    string constant public EIP712_COORDINATOR_DOMAIN_NAME = \"0x Protocol Coordinator\";\n\n    // EIP712 Domain Version value for the Coordinator\n    string constant public EIP712_COORDINATOR_DOMAIN_VERSION = \"3.0.0\";\n\n    // Hash of the EIP712 Domain Separator data for the Coordinator\n    // solhint-disable-next-line var-name-mixedcase\n    bytes32 public EIP712_COORDINATOR_DOMAIN_HASH;\n\n    /// @param chainId Chain ID of the network this contract is deployed on.\n    /// @param verifyingContractAddressIfExists Address of the verifying contract (null if the address of this contract)\n    constructor (\n        uint256 chainId,\n        address verifyingContractAddressIfExists\n    )\n        public\n    {\n        address verifyingContractAddress = verifyingContractAddressIfExists == address(0)\n            ? address(this)\n            : verifyingContractAddressIfExists;\n        EIP712_COORDINATOR_DOMAIN_HASH = LibEIP712.hashEIP712Domain(\n            EIP712_COORDINATOR_DOMAIN_NAME,\n            EIP712_COORDINATOR_DOMAIN_VERSION,\n            chainId,\n            verifyingContractAddress\n        );\n    }\n\n    /// @dev Calculates EIP712 encoding for a hash struct in the EIP712 domain\n    ///      of this contract.\n    /// @param hashStruct The EIP712 hash struct.\n    /// @return result EIP712 hash applied to this EIP712 Domain.\n    function _hashEIP712CoordinatorMessage(bytes32 hashStruct)\n        internal\n        view\n        returns (bytes32 result)\n    {\n        return LibEIP712.hashEIP712Message(EIP712_COORDINATOR_DOMAIN_HASH, hashStruct);\n    }\n}\n",
        "./MixinSignatureValidator.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibBytes.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"./interfaces/ICoordinatorSignatureValidator.sol\";\nimport \"./libs/LibCoordinatorRichErrors.sol\";\n\n\ncontract MixinSignatureValidator is\n    ICoordinatorSignatureValidator\n{\n    using LibBytes for bytes;\n\n    /// @dev Recovers the address of a signer given a hash and signature.\n    /// @param hash Any 32 byte hash.\n    /// @param signature Proof that the hash has been signed by signer.\n    /// @return signerAddress Address of the signer.\n    function getSignerAddress(bytes32 hash, bytes memory signature)\n        public\n        pure\n        returns (address signerAddress)\n    {\n        uint256 signatureLength = signature.length;\n        if (signatureLength == 0) {\n            LibRichErrors.rrevert(LibCoordinatorRichErrors.SignatureError(\n                LibCoordinatorRichErrors.SignatureErrorCodes.INVALID_LENGTH,\n                hash,\n                signature\n            ));\n        }\n\n        // Pop last byte off of signature byte array.\n        uint8 signatureTypeRaw = uint8(signature[signature.length - 1]);\n\n        // Ensure signature is supported\n        if (signatureTypeRaw >= uint8(SignatureType.NSignatureTypes)) {\n            LibRichErrors.rrevert(LibCoordinatorRichErrors.SignatureError(\n                LibCoordinatorRichErrors.SignatureErrorCodes.UNSUPPORTED,\n                hash,\n                signature\n            ));\n        }\n\n        SignatureType signatureType = SignatureType(signatureTypeRaw);\n\n        // Always illegal signature.\n        // This is always an implicit option since a signer can create a\n        // signature array with invalid type or length. We may as well make\n        // it an explicit option. This aids testing and analysis. It is\n        // also the initialization value for the enum type.\n        if (signatureType == SignatureType.Illegal) {\n            LibRichErrors.rrevert(LibCoordinatorRichErrors.SignatureError(\n                LibCoordinatorRichErrors.SignatureErrorCodes.ILLEGAL,\n                hash,\n                signature\n            ));\n\n        // Always invalid signature.\n        // Like Illegal, this is always implicitly available and therefore\n        // offered explicitly. It can be implicitly created by providing\n        // a correctly formatted but incorrect signature.\n        } else if (signatureType == SignatureType.Invalid) {\n            LibRichErrors.rrevert(LibCoordinatorRichErrors.SignatureError(\n                LibCoordinatorRichErrors.SignatureErrorCodes.INVALID,\n                hash,\n                signature\n            ));\n\n        // Signature using EIP712\n        } else if (signatureType == SignatureType.EIP712) {\n            if (signatureLength != 66) {\n                LibRichErrors.rrevert(LibCoordinatorRichErrors.SignatureError(\n                    LibCoordinatorRichErrors.SignatureErrorCodes.INVALID_LENGTH,\n                    hash,\n                    signature\n                ));\n            }\n            uint8 v = uint8(signature[0]);\n            bytes32 r = signature.readBytes32(1);\n            bytes32 s = signature.readBytes32(33);\n            signerAddress = ecrecover(\n                hash,\n                v,\n                r,\n                s\n            );\n            return signerAddress;\n\n        // Signed using web3.eth_sign\n        } else if (signatureType == SignatureType.EthSign) {\n            if (signatureLength != 66) {\n                LibRichErrors.rrevert(LibCoordinatorRichErrors.SignatureError(\n                    LibCoordinatorRichErrors.SignatureErrorCodes.INVALID_LENGTH,\n                    hash,\n                    signature\n                ));\n            }\n            uint8 v = uint8(signature[0]);\n            bytes32 r = signature.readBytes32(1);\n            bytes32 s = signature.readBytes32(33);\n            signerAddress = ecrecover(\n                keccak256(abi.encodePacked(\n                    \"\\x19Ethereum Signed Message:\\n32\",\n                    hash\n                )),\n                v,\n                r,\n                s\n            );\n            return signerAddress;\n        }\n\n        // Anything else is illegal (We do not return false because\n        // the signature may actually be valid, just not in a format\n        // that we currently support. In this case returning false\n        // may lead the caller to incorrectly believe that the\n        // signature was invalid.)\n        LibRichErrors.rrevert(LibCoordinatorRichErrors.SignatureError(\n            LibCoordinatorRichErrors.SignatureErrorCodes.UNSUPPORTED,\n            hash,\n            signature\n        ));\n    }\n}\n",
        "@0x/contracts-utils/contracts/src/LibBytes.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"./LibBytesRichErrors.sol\";\nimport \"./LibRichErrors.sol\";\n\n\nlibrary LibBytes {\n\n    using LibBytes for bytes;\n\n    /// @dev Gets the memory address for a byte array.\n    /// @param input Byte array to lookup.\n    /// @return memoryAddress Memory address of byte array. This\n    ///         points to the header of the byte array which contains\n    ///         the length.\n    function rawAddress(bytes memory input)\n        internal\n        pure\n        returns (uint256 memoryAddress)\n    {\n        assembly {\n            memoryAddress := input\n        }\n        return memoryAddress;\n    }\n\n    /// @dev Gets the memory address for the contents of a byte array.\n    /// @param input Byte array to lookup.\n    /// @return memoryAddress Memory address of the contents of the byte array.\n    function contentAddress(bytes memory input)\n        internal\n        pure\n        returns (uint256 memoryAddress)\n    {\n        assembly {\n            memoryAddress := add(input, 32)\n        }\n        return memoryAddress;\n    }\n\n    /// @dev Copies `length` bytes from memory location `source` to `dest`.\n    /// @param dest memory address to copy bytes to.\n    /// @param source memory address to copy bytes from.\n    /// @param length number of bytes to copy.\n    function memCopy(\n        uint256 dest,\n        uint256 source,\n        uint256 length\n    )\n        internal\n        pure\n    {\n        if (length < 32) {\n            // Handle a partial word by reading destination and masking\n            // off the bits we are interested in.\n            // This correctly handles overlap, zero lengths and source == dest\n            assembly {\n                let mask := sub(exp(256, sub(32, length)), 1)\n                let s := and(mload(source), not(mask))\n                let d := and(mload(dest), mask)\n                mstore(dest, or(s, d))\n            }\n        } else {\n            // Skip the O(length) loop when source == dest.\n            if (source == dest) {\n                return;\n            }\n\n            // For large copies we copy whole words at a time. The final\n            // word is aligned to the end of the range (instead of after the\n            // previous) to handle partial words. So a copy will look like this:\n            //\n            //  ####\n            //      ####\n            //          ####\n            //            ####\n            //\n            // We handle overlap in the source and destination range by\n            // changing the copying direction. This prevents us from\n            // overwriting parts of source that we still need to copy.\n            //\n            // This correctly handles source == dest\n            //\n            if (source > dest) {\n                assembly {\n                    // We subtract 32 from `sEnd` and `dEnd` because it\n                    // is easier to compare with in the loop, and these\n                    // are also the addresses we need for copying the\n                    // last bytes.\n                    length := sub(length, 32)\n                    let sEnd := add(source, length)\n                    let dEnd := add(dest, length)\n\n                    // Remember the last 32 bytes of source\n                    // This needs to be done here and not after the loop\n                    // because we may have overwritten the last bytes in\n                    // source already due to overlap.\n                    let last := mload(sEnd)\n\n                    // Copy whole words front to back\n                    // Note: the first check is always true,\n                    // this could have been a do-while loop.\n                    // solhint-disable-next-line no-empty-blocks\n                    for {} lt(source, sEnd) {} {\n                        mstore(dest, mload(source))\n                        source := add(source, 32)\n                        dest := add(dest, 32)\n                    }\n\n                    // Write the last 32 bytes\n                    mstore(dEnd, last)\n                }\n            } else {\n                assembly {\n                    // We subtract 32 from `sEnd` and `dEnd` because those\n                    // are the starting points when copying a word at the end.\n                    length := sub(length, 32)\n                    let sEnd := add(source, length)\n                    let dEnd := add(dest, length)\n\n                    // Remember the first 32 bytes of source\n                    // This needs to be done here and not after the loop\n                    // because we may have overwritten the first bytes in\n                    // source already due to overlap.\n                    let first := mload(source)\n\n                    // Copy whole words back to front\n                    // We use a signed comparisson here to allow dEnd to become\n                    // negative (happens when source and dest < 32). Valid\n                    // addresses in local memory will never be larger than\n                    // 2**255, so they can be safely re-interpreted as signed.\n                    // Note: the first check is always true,\n                    // this could have been a do-while loop.\n                    // solhint-disable-next-line no-empty-blocks\n                    for {} slt(dest, dEnd) {} {\n                        mstore(dEnd, mload(sEnd))\n                        sEnd := sub(sEnd, 32)\n                        dEnd := sub(dEnd, 32)\n                    }\n\n                    // Write the first 32 bytes\n                    mstore(dest, first)\n                }\n            }\n        }\n    }\n\n    /// @dev Returns a slices from a byte array.\n    /// @param b The byte array to take a slice from.\n    /// @param from The starting index for the slice (inclusive).\n    /// @param to The final index for the slice (exclusive).\n    /// @return result The slice containing bytes at indices [from, to)\n    function slice(\n        bytes memory b,\n        uint256 from,\n        uint256 to\n    )\n        internal\n        pure\n        returns (bytes memory result)\n    {\n        // Ensure that the from and to positions are valid positions for a slice within\n        // the byte array that is being used.\n        if (from > to) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired,\n                from,\n                to\n            ));\n        }\n        if (to > b.length) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired,\n                to,\n                b.length\n            ));\n        }\n\n        // Create a new bytes structure and copy contents\n        result = new bytes(to - from);\n        memCopy(\n            result.contentAddress(),\n            b.contentAddress() + from,\n            result.length\n        );\n        return result;\n    }\n\n    /// @dev Returns a slice from a byte array without preserving the input.\n    /// @param b The byte array to take a slice from. Will be destroyed in the process.\n    /// @param from The starting index for the slice (inclusive).\n    /// @param to The final index for the slice (exclusive).\n    /// @return result The slice containing bytes at indices [from, to)\n    /// @dev When `from == 0`, the original array will match the slice. In other cases its state will be corrupted.\n    function sliceDestructive(\n        bytes memory b,\n        uint256 from,\n        uint256 to\n    )\n        internal\n        pure\n        returns (bytes memory result)\n    {\n        // Ensure that the from and to positions are valid positions for a slice within\n        // the byte array that is being used.\n        if (from > to) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired,\n                from,\n                to\n            ));\n        }\n        if (to > b.length) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired,\n                to,\n                b.length\n            ));\n        }\n\n        // Create a new bytes structure around [from, to) in-place.\n        assembly {\n            result := add(b, from)\n            mstore(result, sub(to, from))\n        }\n        return result;\n    }\n\n    /// @dev Pops the last byte off of a byte array by modifying its length.\n    /// @param b Byte array that will be modified.\n    /// @return The byte that was popped off.\n    function popLastByte(bytes memory b)\n        internal\n        pure\n        returns (bytes1 result)\n    {\n        if (b.length == 0) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanZeroRequired,\n                b.length,\n                0\n            ));\n        }\n\n        // Store last byte.\n        result = b[b.length - 1];\n\n        assembly {\n            // Decrement length of byte array.\n            let newLen := sub(mload(b), 1)\n            mstore(b, newLen)\n        }\n        return result;\n    }\n\n    /// @dev Tests equality of two byte arrays.\n    /// @param lhs First byte array to compare.\n    /// @param rhs Second byte array to compare.\n    /// @return True if arrays are the same. False otherwise.\n    function equals(\n        bytes memory lhs,\n        bytes memory rhs\n    )\n        internal\n        pure\n        returns (bool equal)\n    {\n        // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare.\n        // We early exit on unequal lengths, but keccak would also correctly\n        // handle this.\n        return lhs.length == rhs.length && keccak256(lhs) == keccak256(rhs);\n    }\n\n    /// @dev Reads an address from a position in a byte array.\n    /// @param b Byte array containing an address.\n    /// @param index Index in byte array of address.\n    /// @return address from byte array.\n    function readAddress(\n        bytes memory b,\n        uint256 index\n    )\n        internal\n        pure\n        returns (address result)\n    {\n        if (b.length < index + 20) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired,\n                b.length,\n                index + 20 // 20 is length of address\n            ));\n        }\n\n        // Add offset to index:\n        // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n        // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n        index += 20;\n\n        // Read address from array memory\n        assembly {\n            // 1. Add index to address of bytes array\n            // 2. Load 32-byte word from memory\n            // 3. Apply 20-byte mask to obtain address\n            result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n        }\n        return result;\n    }\n\n    /// @dev Writes an address into a specific position in a byte array.\n    /// @param b Byte array to insert address into.\n    /// @param index Index in byte array of address.\n    /// @param input Address to put into byte array.\n    function writeAddress(\n        bytes memory b,\n        uint256 index,\n        address input\n    )\n        internal\n        pure\n    {\n        if (b.length < index + 20) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired,\n                b.length,\n                index + 20 // 20 is length of address\n            ));\n        }\n\n        // Add offset to index:\n        // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n        // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n        index += 20;\n\n        // Store address into array memory\n        assembly {\n            // The address occupies 20 bytes and mstore stores 32 bytes.\n            // First fetch the 32-byte word where we'll be storing the address, then\n            // apply a mask so we have only the bytes in the word that the address will not occupy.\n            // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n            // 1. Add index to address of bytes array\n            // 2. Load 32-byte word from memory\n            // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n            let neighbors := and(\n                mload(add(b, index)),\n                0xffffffffffffffffffffffff0000000000000000000000000000000000000000\n            )\n\n            // Make sure input address is clean.\n            // (Solidity does not guarantee this)\n            input := and(input, 0xffffffffffffffffffffffffffffffffffffffff)\n\n            // Store the neighbors and address into memory\n            mstore(add(b, index), xor(input, neighbors))\n        }\n    }\n\n    /// @dev Reads a bytes32 value from a position in a byte array.\n    /// @param b Byte array containing a bytes32 value.\n    /// @param index Index in byte array of bytes32 value.\n    /// @return bytes32 value from byte array.\n    function readBytes32(\n        bytes memory b,\n        uint256 index\n    )\n        internal\n        pure\n        returns (bytes32 result)\n    {\n        if (b.length < index + 32) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired,\n                b.length,\n                index + 32\n            ));\n        }\n\n        // Arrays are prefixed by a 256 bit length parameter\n        index += 32;\n\n        // Read the bytes32 from array memory\n        assembly {\n            result := mload(add(b, index))\n        }\n        return result;\n    }\n\n    /// @dev Writes a bytes32 into a specific position in a byte array.\n    /// @param b Byte array to insert <input> into.\n    /// @param index Index in byte array of <input>.\n    /// @param input bytes32 to put into byte array.\n    function writeBytes32(\n        bytes memory b,\n        uint256 index,\n        bytes32 input\n    )\n        internal\n        pure\n    {\n        if (b.length < index + 32) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired,\n                b.length,\n                index + 32\n            ));\n        }\n\n        // Arrays are prefixed by a 256 bit length parameter\n        index += 32;\n\n        // Read the bytes32 from array memory\n        assembly {\n            mstore(add(b, index), input)\n        }\n    }\n\n    /// @dev Reads a uint256 value from a position in a byte array.\n    /// @param b Byte array containing a uint256 value.\n    /// @param index Index in byte array of uint256 value.\n    /// @return uint256 value from byte array.\n    function readUint256(\n        bytes memory b,\n        uint256 index\n    )\n        internal\n        pure\n        returns (uint256 result)\n    {\n        result = uint256(readBytes32(b, index));\n        return result;\n    }\n\n    /// @dev Writes a uint256 into a specific position in a byte array.\n    /// @param b Byte array to insert <input> into.\n    /// @param index Index in byte array of <input>.\n    /// @param input uint256 to put into byte array.\n    function writeUint256(\n        bytes memory b,\n        uint256 index,\n        uint256 input\n    )\n        internal\n        pure\n    {\n        writeBytes32(b, index, bytes32(input));\n    }\n\n    /// @dev Reads an unpadded bytes4 value from a position in a byte array.\n    /// @param b Byte array containing a bytes4 value.\n    /// @param index Index in byte array of bytes4 value.\n    /// @return bytes4 value from byte array.\n    function readBytes4(\n        bytes memory b,\n        uint256 index\n    )\n        internal\n        pure\n        returns (bytes4 result)\n    {\n        if (b.length < index + 4) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsFourRequired,\n                b.length,\n                index + 4\n            ));\n        }\n\n        // Arrays are prefixed by a 32 byte length field\n        index += 32;\n\n        // Read the bytes4 from array memory\n        assembly {\n            result := mload(add(b, index))\n            // Solidity does not require us to clean the trailing bytes.\n            // We do it anyway\n            result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)\n        }\n        return result;\n    }\n\n    /// @dev Writes a new length to a byte array.\n    ///      Decreasing length will lead to removing the corresponding lower order bytes from the byte array.\n    ///      Increasing length may lead to appending adjacent in-memory bytes to the end of the byte array.\n    /// @param b Bytes array to write new length to.\n    /// @param length New length of byte array.\n    function writeLength(bytes memory b, uint256 length)\n        internal\n        pure\n    {\n        assembly {\n            mstore(b, length)\n        }\n    }\n}\n",
        "@0x/contracts-utils/contracts/src/LibBytesRichErrors.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\nlibrary LibBytesRichErrors {\n\n    enum InvalidByteOperationErrorCodes {\n        FromLessThanOrEqualsToRequired,\n        ToLessThanOrEqualsLengthRequired,\n        LengthGreaterThanZeroRequired,\n        LengthGreaterThanOrEqualsFourRequired,\n        LengthGreaterThanOrEqualsTwentyRequired,\n        LengthGreaterThanOrEqualsThirtyTwoRequired,\n        LengthGreaterThanOrEqualsNestedBytesLengthRequired,\n        DestinationLengthGreaterThanOrEqualSourceLengthRequired\n    }\n\n    // bytes4(keccak256(\"InvalidByteOperationError(uint8,uint256,uint256)\"))\n    bytes4 internal constant INVALID_BYTE_OPERATION_ERROR_SELECTOR =\n        0x28006595;\n\n    // solhint-disable func-name-mixedcase\n    function InvalidByteOperationError(\n        InvalidByteOperationErrorCodes errorCode,\n        uint256 offset,\n        uint256 required\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            INVALID_BYTE_OPERATION_ERROR_SELECTOR,\n            errorCode,\n            offset,\n            required\n        );\n    }\n}\n",
        "@0x/contracts-utils/contracts/src/LibRichErrors.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\nlibrary LibRichErrors {\n\n    // bytes4(keccak256(\"Error(string)\"))\n    bytes4 internal constant STANDARD_ERROR_SELECTOR =\n        0x08c379a0;\n\n    // solhint-disable func-name-mixedcase\n    /// @dev ABI encode a standard, string revert error payload.\n    ///      This is the same payload that would be included by a `revert(string)`\n    ///      solidity statement. It has the function signature `Error(string)`.\n    /// @param message The error string.\n    /// @return The ABI encoded error.\n    function StandardError(\n        string memory message\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            STANDARD_ERROR_SELECTOR,\n            bytes(message)\n        );\n    }\n    // solhint-enable func-name-mixedcase\n\n    /// @dev Reverts an encoded rich revert reason `errorData`.\n    /// @param errorData ABI encoded error data.\n    function rrevert(bytes memory errorData)\n        internal\n        pure\n    {\n        assembly {\n            revert(add(errorData, 0x20), mload(errorData))\n        }\n    }\n}\n",
        "./interfaces/ICoordinatorSignatureValidator.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ncontract ICoordinatorSignatureValidator {\n\n   // Allowed signature types.\n    enum SignatureType {\n        Illegal,                // 0x00, default value\n        Invalid,                // 0x01\n        EIP712,                 // 0x02\n        EthSign,                // 0x03\n        Wallet,                 // 0x04\n        Validator,              // 0x05\n        PreSigned,              // 0x06\n        EIP1271Wallet,          // 0x07\n        NSignatureTypes         // 0x08, number of signature types. Always leave at end.\n    }\n\n    /// @dev Recovers the address of a signer given a hash and signature.\n    /// @param hash Any 32 byte hash.\n    /// @param signature Proof that the hash has been signed by signer.\n    /// @return signerAddress Address of the signer. \n    function getSignerAddress(bytes32 hash, bytes memory signature)\n        public\n        pure\n        returns (address signerAddress);\n}\n",
        "./libs/LibCoordinatorRichErrors.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\nlibrary LibCoordinatorRichErrors {\n    enum SignatureErrorCodes {\n        INVALID_LENGTH,\n        UNSUPPORTED,\n        ILLEGAL,\n        INVALID\n    }\n\n    // bytes4(keccak256(\"SignatureError(uint8,bytes32,bytes)\"))\n    bytes4 internal constant SIGNATURE_ERROR_SELECTOR =\n        0x779c5223;\n\n    // bytes4(keccak256(\"InvalidOriginError(address)\"))\n    bytes4 internal constant INVALID_ORIGIN_ERROR_SELECTOR =\n        0xa458d7ff;\n\n    // bytes4(keccak256(\"InvalidApprovalSignatureError(bytes32,address)\"))\n    bytes4 internal constant INVALID_APPROVAL_SIGNATURE_ERROR_SELECTOR =\n        0xd789b640;\n\n    // solhint-disable func-name-mixedcase\n    function SignatureError(\n        SignatureErrorCodes errorCode,\n        bytes32 hash,\n        bytes memory signature\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            SIGNATURE_ERROR_SELECTOR,\n            errorCode,\n            hash,\n            signature\n        );\n    }\n\n    function InvalidOriginError(\n        address expectedOrigin\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            INVALID_ORIGIN_ERROR_SELECTOR,\n            expectedOrigin\n        );\n    }\n\n    function InvalidApprovalSignatureError(\n        bytes32 transactionHash,\n        address approverAddress\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            INVALID_APPROVAL_SIGNATURE_ERROR_SELECTOR,\n            transactionHash,\n            approverAddress\n        );\n    }\n}\n",
        "./MixinCoordinatorApprovalVerifier.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibEIP712ExchangeDomain.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibZeroExTransaction.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibAddressArray.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibBytes.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"@0x/contracts-exchange/contracts/src/interfaces/IExchange.sol\";\nimport \"./libs/LibCoordinatorApproval.sol\";\nimport \"./libs/LibCoordinatorRichErrors.sol\";\nimport \"./interfaces/ICoordinatorSignatureValidator.sol\";\nimport \"./interfaces/ICoordinatorApprovalVerifier.sol\";\n\n\n// solhint-disable avoid-tx-origin\ncontract MixinCoordinatorApprovalVerifier is\n    LibCoordinatorApproval,\n    LibEIP712ExchangeDomain,\n    ICoordinatorSignatureValidator,\n    ICoordinatorApprovalVerifier\n{\n    using LibBytes for bytes;\n    using LibAddressArray for address[];\n\n    /// @dev Validates that the 0x transaction has been approved by all of the feeRecipients\n    ///      that correspond to each order in the transaction's Exchange calldata.\n    /// @param transaction 0x transaction containing salt, signerAddress, and data.\n    /// @param txOrigin Required signer of Ethereum transaction calling this function.\n    /// @param transactionSignature Proof that the transaction has been signed by the signer.\n    /// @param approvalSignatures Array of signatures that correspond to the feeRecipients of each\n    ///        order in the transaction's Exchange calldata.\n    function assertValidCoordinatorApprovals(\n        LibZeroExTransaction.ZeroExTransaction memory transaction,\n        address txOrigin,\n        bytes memory transactionSignature,\n        bytes[] memory approvalSignatures\n    )\n        public\n        view\n    {\n        // Get the orders from the the Exchange calldata in the 0x transaction\n        LibOrder.Order[] memory orders = decodeOrdersFromFillData(transaction.data);\n\n        // No approval is required for non-fill methods\n        if (orders.length > 0) {\n            // Revert if approval is invalid for transaction orders\n            _assertValidTransactionOrdersApproval(\n                transaction,\n                orders,\n                txOrigin,\n                transactionSignature,\n                approvalSignatures\n            );\n        }\n    }\n\n    /// @dev Decodes the orders from Exchange calldata representing any fill method.\n    /// @param data Exchange calldata representing a fill method.\n    /// @return orders The orders from the Exchange calldata.\n    function decodeOrdersFromFillData(bytes memory data)\n        public\n        pure\n        returns (LibOrder.Order[] memory orders)\n    {\n        bytes4 selector = data.readBytes4(0);\n        if (\n            selector == IExchange(address(0)).fillOrder.selector ||\n            selector == IExchange(address(0)).fillOrKillOrder.selector\n        ) {\n            // Decode single order\n            (LibOrder.Order memory order) = abi.decode(\n                data.slice(4, data.length),\n                (LibOrder.Order)\n            );\n            orders = new LibOrder.Order[](1);\n            orders[0] = order;\n        } else if (\n            selector == IExchange(address(0)).batchFillOrders.selector ||\n            selector == IExchange(address(0)).batchFillOrdersNoThrow.selector ||\n            selector == IExchange(address(0)).batchFillOrKillOrders.selector ||\n            selector == IExchange(address(0)).marketBuyOrdersNoThrow.selector ||\n            selector == IExchange(address(0)).marketBuyOrdersFillOrKill.selector ||\n            selector == IExchange(address(0)).marketSellOrdersNoThrow.selector ||\n            selector == IExchange(address(0)).marketSellOrdersFillOrKill.selector\n        ) {\n            // Decode all orders\n            // solhint-disable indent\n            (orders) = abi.decode(\n                data.slice(4, data.length),\n                (LibOrder.Order[])\n            );\n        } else if (\n            selector == IExchange(address(0)).matchOrders.selector ||\n            selector == IExchange(address(0)).matchOrdersWithMaximalFill.selector\n        ) {\n            // Decode left and right orders\n            (LibOrder.Order memory leftOrder, LibOrder.Order memory rightOrder) = abi.decode(\n                data.slice(4, data.length),\n                (LibOrder.Order, LibOrder.Order)\n            );\n\n            // Create array of orders\n            orders = new LibOrder.Order[](2);\n            orders[0] = leftOrder;\n            orders[1] = rightOrder;\n        }\n        return orders;\n    }\n\n    /// @dev Validates that the feeRecipients of a batch of order have approved a 0x transaction.\n    /// @param transaction 0x transaction containing salt, signerAddress, and data.\n    /// @param orders Array of order structs containing order specifications.\n    /// @param txOrigin Required signer of Ethereum transaction calling this function.\n    /// @param transactionSignature Proof that the transaction has been signed by the signer.\n    /// @param approvalSignatures Array of signatures that correspond to the feeRecipients of each order.\n    function _assertValidTransactionOrdersApproval(\n        LibZeroExTransaction.ZeroExTransaction memory transaction,\n        LibOrder.Order[] memory orders,\n        address txOrigin,\n        bytes memory transactionSignature,\n        bytes[] memory approvalSignatures\n    )\n        internal\n        view\n    {\n        // Verify that Ethereum tx signer is the same as the approved txOrigin\n        if (tx.origin != txOrigin) {\n            LibRichErrors.rrevert(LibCoordinatorRichErrors.InvalidOriginError(txOrigin));\n        }\n\n        // Hash 0x transaction\n        bytes32 transactionHash = LibZeroExTransaction.getTypedDataHash(transaction, EIP712_EXCHANGE_DOMAIN_HASH);\n\n        // Create empty list of approval signers\n        address[] memory approvalSignerAddresses = new address[](0);\n\n        uint256 signaturesLength = approvalSignatures.length;\n        for (uint256 i = 0; i != signaturesLength; i++) {\n            // Create approval message\n            CoordinatorApproval memory approval = CoordinatorApproval({\n                txOrigin: txOrigin,\n                transactionHash: transactionHash,\n                transactionSignature: transactionSignature\n            });\n\n            // Hash approval message and recover signer address\n            bytes32 approvalHash = getCoordinatorApprovalHash(approval);\n            address approvalSignerAddress = getSignerAddress(approvalHash, approvalSignatures[i]);\n\n            // Add approval signer to list of signers\n            approvalSignerAddresses = approvalSignerAddresses.append(approvalSignerAddress);\n        }\n\n        // Ethereum transaction signer gives implicit signature of approval\n        approvalSignerAddresses = approvalSignerAddresses.append(tx.origin);\n\n        uint256 ordersLength = orders.length;\n        for (uint256 i = 0; i != ordersLength; i++) {\n            // Do not check approval if the order's senderAddress is null\n            if (orders[i].senderAddress == address(0)) {\n                continue;\n            }\n\n            // Ensure feeRecipient of order has approved this 0x transaction\n            address approverAddress = orders[i].feeRecipientAddress;\n            bool isOrderApproved = approvalSignerAddresses.contains(approverAddress);\n            if (!isOrderApproved) {\n                LibRichErrors.rrevert(LibCoordinatorRichErrors.InvalidApprovalSignatureError(\n                    transactionHash,\n                    approverAddress\n                ));\n            }\n        }\n    }\n}\n",
        "@0x/contracts-exchange-libs/contracts/src/LibOrder.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibEIP712.sol\";\n\n\nlibrary LibOrder {\n\n    using LibOrder for Order;\n\n    // Hash for the EIP712 Order Schema:\n    // keccak256(abi.encodePacked(\n    //     \"Order(\",\n    //     \"address makerAddress,\",\n    //     \"address takerAddress,\",\n    //     \"address feeRecipientAddress,\",\n    //     \"address senderAddress,\",\n    //     \"uint256 makerAssetAmount,\",\n    //     \"uint256 takerAssetAmount,\",\n    //     \"uint256 makerFee,\",\n    //     \"uint256 takerFee,\",\n    //     \"uint256 expirationTimeSeconds,\",\n    //     \"uint256 salt,\",\n    //     \"bytes makerAssetData,\",\n    //     \"bytes takerAssetData,\",\n    //     \"bytes makerFeeAssetData,\",\n    //     \"bytes takerFeeAssetData\",\n    //     \")\"\n    // ))\n    bytes32 constant internal _EIP712_ORDER_SCHEMA_HASH =\n        0xf80322eb8376aafb64eadf8f0d7623f22130fd9491a221e902b713cb984a7534;\n\n    // A valid order remains fillable until it is expired, fully filled, or cancelled.\n    // An order's status is unaffected by external factors, like account balances.\n    enum OrderStatus {\n        INVALID,                     // Default value\n        INVALID_MAKER_ASSET_AMOUNT,  // Order does not have a valid maker asset amount\n        INVALID_TAKER_ASSET_AMOUNT,  // Order does not have a valid taker asset amount\n        FILLABLE,                    // Order is fillable\n        EXPIRED,                     // Order has already expired\n        FULLY_FILLED,                // Order is fully filled\n        CANCELLED                    // Order has been cancelled\n    }\n\n    // solhint-disable max-line-length\n    /// @dev Canonical order structure.\n    struct Order {\n        address makerAddress;           // Address that created the order.\n        address takerAddress;           // Address that is allowed to fill the order. If set to 0, any address is allowed to fill the order.\n        address feeRecipientAddress;    // Address that will recieve fees when order is filled.\n        address senderAddress;          // Address that is allowed to call Exchange contract methods that affect this order. If set to 0, any address is allowed to call these methods.\n        uint256 makerAssetAmount;       // Amount of makerAsset being offered by maker. Must be greater than 0.\n        uint256 takerAssetAmount;       // Amount of takerAsset being bid on by maker. Must be greater than 0.\n        uint256 makerFee;               // Fee paid to feeRecipient by maker when order is filled.\n        uint256 takerFee;               // Fee paid to feeRecipient by taker when order is filled.\n        uint256 expirationTimeSeconds;  // Timestamp in seconds at which order expires.\n        uint256 salt;                   // Arbitrary number to facilitate uniqueness of the order's hash.\n        bytes makerAssetData;           // Encoded data that can be decoded by a specified proxy contract when transferring makerAsset. The leading bytes4 references the id of the asset proxy.\n        bytes takerAssetData;           // Encoded data that can be decoded by a specified proxy contract when transferring takerAsset. The leading bytes4 references the id of the asset proxy.\n        bytes makerFeeAssetData;        // Encoded data that can be decoded by a specified proxy contract when transferring makerFeeAsset. The leading bytes4 references the id of the asset proxy.\n        bytes takerFeeAssetData;        // Encoded data that can be decoded by a specified proxy contract when transferring takerFeeAsset. The leading bytes4 references the id of the asset proxy.\n    }\n    // solhint-enable max-line-length\n\n    /// @dev Order information returned by `getOrderInfo()`.\n    struct OrderInfo {\n        OrderStatus orderStatus;                    // Status that describes order's validity and fillability.\n        bytes32 orderHash;                    // EIP712 typed data hash of the order (see LibOrder.getTypedDataHash).\n        uint256 orderTakerAssetFilledAmount;  // Amount of order that has already been filled.\n    }\n\n    /// @dev Calculates the EIP712 typed data hash of an order with a given domain separator.\n    /// @param order The order structure.\n    /// @return EIP712 typed data hash of the order.\n    function getTypedDataHash(Order memory order, bytes32 eip712ExchangeDomainHash)\n        internal\n        pure\n        returns (bytes32 orderHash)\n    {\n        orderHash = LibEIP712.hashEIP712Message(\n            eip712ExchangeDomainHash,\n            order.getStructHash()\n        );\n        return orderHash;\n    }\n\n    /// @dev Calculates EIP712 hash of the order struct.\n    /// @param order The order structure.\n    /// @return EIP712 hash of the order struct.\n    function getStructHash(Order memory order)\n        internal\n        pure\n        returns (bytes32 result)\n    {\n        bytes32 schemaHash = _EIP712_ORDER_SCHEMA_HASH;\n        bytes memory makerAssetData = order.makerAssetData;\n        bytes memory takerAssetData = order.takerAssetData;\n        bytes memory makerFeeAssetData = order.makerFeeAssetData;\n        bytes memory takerFeeAssetData = order.takerFeeAssetData;\n\n        // Assembly for more efficiently computing:\n        // keccak256(abi.encodePacked(\n        //     EIP712_ORDER_SCHEMA_HASH,\n        //     uint256(order.makerAddress),\n        //     uint256(order.takerAddress),\n        //     uint256(order.feeRecipientAddress),\n        //     uint256(order.senderAddress),\n        //     order.makerAssetAmount,\n        //     order.takerAssetAmount,\n        //     order.makerFee,\n        //     order.takerFee,\n        //     order.expirationTimeSeconds,\n        //     order.salt,\n        //     keccak256(order.makerAssetData),\n        //     keccak256(order.takerAssetData),\n        //     keccak256(order.makerFeeAssetData),\n        //     keccak256(order.takerFeeAssetData)\n        // ));\n\n        assembly {\n            // Assert order offset (this is an internal error that should never be triggered)\n            if lt(order, 32) {\n                invalid()\n            }\n\n            // Calculate memory addresses that will be swapped out before hashing\n            let pos1 := sub(order, 32)\n            let pos2 := add(order, 320)\n            let pos3 := add(order, 352)\n            let pos4 := add(order, 384)\n            let pos5 := add(order, 416)\n\n            // Backup\n            let temp1 := mload(pos1)\n            let temp2 := mload(pos2)\n            let temp3 := mload(pos3)\n            let temp4 := mload(pos4)\n            let temp5 := mload(pos5)\n\n            // Hash in place\n            mstore(pos1, schemaHash)\n            mstore(pos2, keccak256(add(makerAssetData, 32), mload(makerAssetData)))        // store hash of makerAssetData\n            mstore(pos3, keccak256(add(takerAssetData, 32), mload(takerAssetData)))        // store hash of takerAssetData\n            mstore(pos4, keccak256(add(makerFeeAssetData, 32), mload(makerFeeAssetData)))  // store hash of makerFeeAssetData\n            mstore(pos5, keccak256(add(takerFeeAssetData, 32), mload(takerFeeAssetData)))  // store hash of takerFeeAssetData\n            result := keccak256(pos1, 480)\n\n            // Restore\n            mstore(pos1, temp1)\n            mstore(pos2, temp2)\n            mstore(pos3, temp3)\n            mstore(pos4, temp4)\n            mstore(pos5, temp5)\n        }\n        return result;\n    }\n}\n",
        "@0x/contracts-utils/contracts/src/LibAddressArray.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"./LibAddressArrayRichErrors.sol\";\nimport \"./LibBytes.sol\";\nimport \"./LibRichErrors.sol\";\n\n\nlibrary LibAddressArray {\n\n    /// @dev Append a new address to an array of addresses.\n    ///      The `addressArray` may need to be reallocated to make space\n    ///      for the new address. Because of this we return the resulting\n    ///      memory location of `addressArray`.\n    /// @param addressArray Array of addresses.\n    /// @param addressToAppend  Address to append.\n    /// @return Array of addresses: [... addressArray, addressToAppend]\n    function append(address[] memory addressArray, address addressToAppend)\n        internal\n        pure\n        returns (address[] memory)\n    {\n        // Get stats on address array and free memory\n        uint256 freeMemPtr = 0;\n        uint256 addressArrayBeginPtr = 0;\n        uint256 addressArrayEndPtr = 0;\n        uint256 addressArrayLength = addressArray.length;\n        uint256 addressArrayMemSizeInBytes = 32 + (32 * addressArrayLength);\n        assembly {\n            freeMemPtr := mload(0x40)\n            addressArrayBeginPtr := addressArray\n            addressArrayEndPtr := add(addressArray, addressArrayMemSizeInBytes)\n        }\n\n        // Cases for `freeMemPtr`:\n        //  `freeMemPtr` == `addressArrayEndPtr`: Nothing occupies memory after `addressArray`\n        //  `freeMemPtr` > `addressArrayEndPtr`: Some value occupies memory after `addressArray`\n        //  `freeMemPtr` < `addressArrayEndPtr`: Memory has not been managed properly.\n        if (freeMemPtr < addressArrayEndPtr) {\n            LibRichErrors.rrevert(LibAddressArrayRichErrors.MismanagedMemoryError(\n                freeMemPtr,\n                addressArrayEndPtr\n            ));\n        }\n\n        // If free memory begins at the end of `addressArray`\n        // then we can append `addressToAppend` directly.\n        // Otherwise, we must copy the array to free memory\n        // before appending new values to it.\n        if (freeMemPtr > addressArrayEndPtr) {\n            LibBytes.memCopy(freeMemPtr, addressArrayBeginPtr, addressArrayMemSizeInBytes);\n            assembly {\n                addressArray := freeMemPtr\n                addressArrayBeginPtr := addressArray\n            }\n        }\n\n        // Append `addressToAppend`\n        addressArrayLength += 1;\n        addressArrayMemSizeInBytes += 32;\n        addressArrayEndPtr = addressArrayBeginPtr + addressArrayMemSizeInBytes;\n        freeMemPtr = addressArrayEndPtr;\n        assembly {\n            // Store new array length\n            mstore(addressArray, addressArrayLength)\n\n            // Update `freeMemPtr`\n            mstore(0x40, freeMemPtr)\n        }\n        addressArray[addressArrayLength - 1] = addressToAppend;\n        return addressArray;\n    }\n\n    /// @dev Checks if an address array contains the target address.\n    /// @param addressArray Array of addresses.\n    /// @param target Address to search for in array.\n    /// @return True if the addressArray contains the target.\n    function contains(address[] memory addressArray, address target)\n        internal\n        pure\n        returns (bool success)\n    {\n        assembly {\n\n            // Calculate byte length of array\n            let arrayByteLen := mul(mload(addressArray), 32)\n            // Calculate beginning of array contents\n            let arrayContentsStart := add(addressArray, 32)\n            // Calclulate end of array contents\n            let arrayContentsEnd := add(arrayContentsStart, arrayByteLen)\n\n            // Loop through array\n            for {let i:= arrayContentsStart} lt(i, arrayContentsEnd) {i := add(i, 32)} {\n\n                // Load array element\n                let arrayElement := mload(i)\n\n                // Return true if array element equals target\n                if eq(target, arrayElement) {\n                    // Set success to true\n                    success := 1\n                    // Break loop\n                    i := arrayContentsEnd\n                }\n            }\n        }\n        return success;\n    }\n\n    /// @dev Finds the index of an address within an array.\n    /// @param addressArray Array of addresses.\n    /// @param target Address to search for in array.\n    /// @return Existence and index of the target in the array.\n    function indexOf(address[] memory addressArray, address target)\n        internal\n        pure\n        returns (bool success, uint256 index)\n    {\n        assembly {\n\n            // Calculate byte length of array\n            let arrayByteLen := mul(mload(addressArray), 32)\n            // Calculate beginning of array contents\n            let arrayContentsStart := add(addressArray, 32)\n            // Calclulate end of array contents\n            let arrayContentsEnd := add(arrayContentsStart, arrayByteLen)\n\n            // Loop through array\n            for {let i:= arrayContentsStart} lt(i, arrayContentsEnd) {i := add(i, 32)} {\n\n                // Load array element\n                let arrayElement := mload(i)\n\n                // Return true if array element equals target\n                if eq(target, arrayElement) {\n                    // Set success and index\n                    success := 1\n                    index := div(sub(i, arrayContentsStart), 32)\n                    // Break loop\n                    i := arrayContentsEnd\n                }\n            }\n        }\n        return (success, index);\n    }\n}\n",
        "@0x/contracts-utils/contracts/src/LibAddressArrayRichErrors.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\nlibrary LibAddressArrayRichErrors {\n\n    // bytes4(keccak256(\"MismanagedMemoryError(uint256,uint256)\"))\n    bytes4 internal constant MISMANAGED_MEMORY_ERROR_SELECTOR =\n        0x5fc83722;\n\n    // solhint-disable func-name-mixedcase\n    function MismanagedMemoryError(\n        uint256 freeMemPtr,\n        uint256 addressArrayEndPtr\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            MISMANAGED_MEMORY_ERROR_SELECTOR,\n            freeMemPtr,\n            addressArrayEndPtr\n        );\n    }\n}\n",
        "@0x/contracts-exchange/contracts/src/interfaces/IExchange.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"./IExchangeCore.sol\";\nimport \"./IProtocolFees.sol\";\nimport \"./IMatchOrders.sol\";\nimport \"./ISignatureValidator.sol\";\nimport \"./ITransactions.sol\";\nimport \"./IAssetProxyDispatcher.sol\";\nimport \"./IWrapperFunctions.sol\";\nimport \"./ITransferSimulator.sol\";\n\n\n// solhint-disable no-empty-blocks\ncontract IExchange is\n    IProtocolFees,\n    IExchangeCore,\n    IMatchOrders,\n    ISignatureValidator,\n    ITransactions,\n    IAssetProxyDispatcher,\n    ITransferSimulator,\n    IWrapperFunctions\n{}\n",
        "@0x/contracts-exchange/contracts/src/interfaces/IExchangeCore.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibFillResults.sol\";\n\n\ncontract IExchangeCore {\n\n    // Fill event is emitted whenever an order is filled.\n    event Fill(\n        address indexed makerAddress,         // Address that created the order.\n        address indexed feeRecipientAddress,  // Address that received fees.\n        bytes makerAssetData,                 // Encoded data specific to makerAsset.\n        bytes takerAssetData,                 // Encoded data specific to takerAsset.\n        bytes makerFeeAssetData,              // Encoded data specific to makerFeeAsset.\n        bytes takerFeeAssetData,              // Encoded data specific to takerFeeAsset.\n        bytes32 indexed orderHash,            // EIP712 hash of order (see LibOrder.getTypedDataHash).\n        address takerAddress,                 // Address that filled the order.\n        address senderAddress,                // Address that called the Exchange contract (msg.sender).\n        uint256 makerAssetFilledAmount,       // Amount of makerAsset sold by maker and bought by taker.\n        uint256 takerAssetFilledAmount,       // Amount of takerAsset sold by taker and bought by maker.\n        uint256 makerFeePaid,                 // Amount of makerFeeAssetData paid to feeRecipient by maker.\n        uint256 takerFeePaid,                 // Amount of takerFeeAssetData paid to feeRecipient by taker.\n        uint256 protocolFeePaid               // Amount of eth or weth paid to the staking contract.\n    );\n\n    // Cancel event is emitted whenever an individual order is cancelled.\n    event Cancel(\n        address indexed makerAddress,         // Address that created the order.\n        address indexed feeRecipientAddress,  // Address that would have recieved fees if order was filled.\n        bytes makerAssetData,                 // Encoded data specific to makerAsset.\n        bytes takerAssetData,                 // Encoded data specific to takerAsset.\n        address senderAddress,                // Address that called the Exchange contract (msg.sender).\n        bytes32 indexed orderHash             // EIP712 hash of order (see LibOrder.getTypedDataHash).\n    );\n\n    // CancelUpTo event is emitted whenever `cancelOrdersUpTo` is executed succesfully.\n    event CancelUpTo(\n        address indexed makerAddress,         // Orders cancelled must have been created by this address.\n        address indexed orderSenderAddress,   // Orders cancelled must have a `senderAddress` equal to this address.\n        uint256 orderEpoch                    // Orders with specified makerAddress and senderAddress with a salt less than this value are considered cancelled.\n    );\n\n    /// @dev Cancels all orders created by makerAddress with a salt less than or equal to the targetOrderEpoch\n    ///      and senderAddress equal to msg.sender (or null address if msg.sender == makerAddress).\n    /// @param targetOrderEpoch Orders created with a salt less or equal to this value will be cancelled.\n    function cancelOrdersUpTo(uint256 targetOrderEpoch)\n        external\n        payable;\n\n    /// @dev Fills the input order.\n    /// @param order Order struct containing order specifications.\n    /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n    /// @param signature Proof that order has been created by maker.\n    /// @return Amounts filled and fees paid by maker and taker.\n    function fillOrder(\n        LibOrder.Order memory order,\n        uint256 takerAssetFillAmount,\n        bytes memory signature\n    )\n        public\n        payable\n        returns (LibFillResults.FillResults memory fillResults);\n\n    /// @dev After calling, the order can not be filled anymore.\n    /// @param order Order struct containing order specifications.\n    function cancelOrder(LibOrder.Order memory order)\n        public\n        payable;\n\n    /// @dev Gets information about an order: status, hash, and amount filled.\n    /// @param order Order to gather information on.\n    /// @return OrderInfo Information about the order and its state.\n    ///                   See LibOrder.OrderInfo for a complete description.\n    function getOrderInfo(LibOrder.Order memory order)\n        public\n        view\n        returns (LibOrder.OrderInfo memory orderInfo);\n}\n",
        "@0x/contracts-exchange-libs/contracts/src/LibFillResults.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\nimport \"./LibMath.sol\";\nimport \"./LibOrder.sol\";\n\n\nlibrary LibFillResults {\n\n    using LibSafeMath for uint256;\n\n    struct BatchMatchedFillResults {\n        FillResults[] left;              // Fill results for left orders\n        FillResults[] right;             // Fill results for right orders\n        uint256 profitInLeftMakerAsset;  // Profit taken from left makers\n        uint256 profitInRightMakerAsset; // Profit taken from right makers\n    }\n\n    struct FillResults {\n        uint256 makerAssetFilledAmount;  // Total amount of makerAsset(s) filled.\n        uint256 takerAssetFilledAmount;  // Total amount of takerAsset(s) filled.\n        uint256 makerFeePaid;            // Total amount of fees paid by maker(s) to feeRecipient(s).\n        uint256 takerFeePaid;            // Total amount of fees paid by taker to feeRecipients(s).\n        uint256 protocolFeePaid;         // Total amount of fees paid by taker to the staking contract.\n    }\n\n    struct MatchedFillResults {\n        FillResults left;                // Amounts filled and fees paid of left order.\n        FillResults right;               // Amounts filled and fees paid of right order.\n        uint256 profitInLeftMakerAsset;  // Profit taken from the left maker\n        uint256 profitInRightMakerAsset; // Profit taken from the right maker\n    }\n\n    /// @dev Calculates amounts filled and fees paid by maker and taker.\n    /// @param order to be filled.\n    /// @param takerAssetFilledAmount Amount of takerAsset that will be filled.\n    /// @param protocolFeeMultiplier The current protocol fee of the exchange contract.\n    /// @param gasPrice The gasprice of the transaction. This is provided so that the function call can continue\n    ///        to be pure rather than view.\n    /// @return fillResults Amounts filled and fees paid by maker and taker.\n    function calculateFillResults(\n        LibOrder.Order memory order,\n        uint256 takerAssetFilledAmount,\n        uint256 protocolFeeMultiplier,\n        uint256 gasPrice\n    )\n        internal\n        pure\n        returns (FillResults memory fillResults)\n    {\n        // Compute proportional transfer amounts\n        fillResults.takerAssetFilledAmount = takerAssetFilledAmount;\n        fillResults.makerAssetFilledAmount = LibMath.safeGetPartialAmountFloor(\n            takerAssetFilledAmount,\n            order.takerAssetAmount,\n            order.makerAssetAmount\n        );\n        fillResults.makerFeePaid = LibMath.safeGetPartialAmountFloor(\n            takerAssetFilledAmount,\n            order.takerAssetAmount,\n            order.makerFee\n        );\n        fillResults.takerFeePaid = LibMath.safeGetPartialAmountFloor(\n            takerAssetFilledAmount,\n            order.takerAssetAmount,\n            order.takerFee\n        );\n\n        // Compute the protocol fee that should be paid for a single fill.\n        fillResults.protocolFeePaid = gasPrice.safeMul(protocolFeeMultiplier);\n\n        return fillResults;\n    }\n\n    /// @dev Calculates fill amounts for the matched orders.\n    ///      Each order is filled at their respective price point. However, the calculations are\n    ///      carried out as though the orders are both being filled at the right order's price point.\n    ///      The profit made by the leftOrder order goes to the taker (who matched the two orders).\n    /// @param leftOrder First order to match.\n    /// @param rightOrder Second order to match.\n    /// @param leftOrderTakerAssetFilledAmount Amount of left order already filled.\n    /// @param rightOrderTakerAssetFilledAmount Amount of right order already filled.\n    /// @param protocolFeeMultiplier The current protocol fee of the exchange contract.\n    /// @param gasPrice The gasprice of the transaction. This is provided so that the function call can continue\n    ///        to be pure rather than view.\n    /// @param shouldMaximallyFillOrders A value that indicates whether or not this calculation should use\n    ///                                  the maximal fill order matching strategy.\n    /// @param matchedFillResults Amounts to fill and fees to pay by maker and taker of matched orders.\n    function calculateMatchedFillResults(\n        LibOrder.Order memory leftOrder,\n        LibOrder.Order memory rightOrder,\n        uint256 leftOrderTakerAssetFilledAmount,\n        uint256 rightOrderTakerAssetFilledAmount,\n        uint256 protocolFeeMultiplier,\n        uint256 gasPrice,\n        bool shouldMaximallyFillOrders\n    )\n        internal\n        pure\n        returns (MatchedFillResults memory matchedFillResults)\n    {\n        // Derive maker asset amounts for left & right orders, given store taker assert amounts\n        uint256 leftTakerAssetAmountRemaining = leftOrder.takerAssetAmount.safeSub(leftOrderTakerAssetFilledAmount);\n        uint256 leftMakerAssetAmountRemaining = LibMath.safeGetPartialAmountFloor(\n            leftOrder.makerAssetAmount,\n            leftOrder.takerAssetAmount,\n            leftTakerAssetAmountRemaining\n        );\n        uint256 rightTakerAssetAmountRemaining = rightOrder.takerAssetAmount.safeSub(rightOrderTakerAssetFilledAmount);\n        uint256 rightMakerAssetAmountRemaining = LibMath.safeGetPartialAmountFloor(\n            rightOrder.makerAssetAmount,\n            rightOrder.takerAssetAmount,\n            rightTakerAssetAmountRemaining\n        );\n\n        // Maximally fill the orders and pay out profits to the matcher in one or both of the maker assets.\n        if (shouldMaximallyFillOrders) {\n            matchedFillResults = _calculateMatchedFillResultsWithMaximalFill(\n                leftOrder,\n                rightOrder,\n                leftMakerAssetAmountRemaining,\n                leftTakerAssetAmountRemaining,\n                rightMakerAssetAmountRemaining,\n                rightTakerAssetAmountRemaining\n            );\n        } else {\n            matchedFillResults = _calculateMatchedFillResults(\n                leftOrder,\n                rightOrder,\n                leftMakerAssetAmountRemaining,\n                leftTakerAssetAmountRemaining,\n                rightMakerAssetAmountRemaining,\n                rightTakerAssetAmountRemaining\n            );\n        }\n\n        // Compute fees for left order\n        matchedFillResults.left.makerFeePaid = LibMath.safeGetPartialAmountFloor(\n            matchedFillResults.left.makerAssetFilledAmount,\n            leftOrder.makerAssetAmount,\n            leftOrder.makerFee\n        );\n        matchedFillResults.left.takerFeePaid = LibMath.safeGetPartialAmountFloor(\n            matchedFillResults.left.takerAssetFilledAmount,\n            leftOrder.takerAssetAmount,\n            leftOrder.takerFee\n        );\n\n        // Compute fees for right order\n        matchedFillResults.right.makerFeePaid = LibMath.safeGetPartialAmountFloor(\n            matchedFillResults.right.makerAssetFilledAmount,\n            rightOrder.makerAssetAmount,\n            rightOrder.makerFee\n        );\n        matchedFillResults.right.takerFeePaid = LibMath.safeGetPartialAmountFloor(\n            matchedFillResults.right.takerAssetFilledAmount,\n            rightOrder.takerAssetAmount,\n            rightOrder.takerFee\n        );\n\n        // Compute the protocol fee that should be paid for a single fill. In this\n        // case this should be made the protocol fee for both the left and right orders.\n        uint256 protocolFee = gasPrice.safeMul(protocolFeeMultiplier);\n        matchedFillResults.left.protocolFeePaid = protocolFee;\n        matchedFillResults.right.protocolFeePaid = protocolFee;\n\n        // Return fill results\n        return matchedFillResults;\n    }\n\n    /// @dev Adds properties of both FillResults instances.\n    /// @param fillResults1 The first FillResults.\n    /// @param fillResults2 The second FillResults.\n    /// @return The sum of both fill results.\n    function addFillResults(\n        FillResults memory fillResults1,\n        FillResults memory fillResults2\n    )\n        internal\n        pure\n        returns (FillResults memory totalFillResults)\n    {\n        totalFillResults.makerAssetFilledAmount = fillResults1.makerAssetFilledAmount.safeAdd(fillResults2.makerAssetFilledAmount);\n        totalFillResults.takerAssetFilledAmount = fillResults1.takerAssetFilledAmount.safeAdd(fillResults2.takerAssetFilledAmount);\n        totalFillResults.makerFeePaid = fillResults1.makerFeePaid.safeAdd(fillResults2.makerFeePaid);\n        totalFillResults.takerFeePaid = fillResults1.takerFeePaid.safeAdd(fillResults2.takerFeePaid);\n        totalFillResults.protocolFeePaid = fillResults1.protocolFeePaid.safeAdd(fillResults2.protocolFeePaid);\n\n        return totalFillResults;\n    }\n\n    /// @dev Calculates part of the matched fill results for a given situation using the fill strategy that only\n    ///      awards profit denominated in the left maker asset.\n    /// @param leftOrder The left order in the order matching situation.\n    /// @param rightOrder The right order in the order matching situation.\n    /// @param leftMakerAssetAmountRemaining The amount of the left order maker asset that can still be filled.\n    /// @param leftTakerAssetAmountRemaining The amount of the left order taker asset that can still be filled.\n    /// @param rightMakerAssetAmountRemaining The amount of the right order maker asset that can still be filled.\n    /// @param rightTakerAssetAmountRemaining The amount of the right order taker asset that can still be filled.\n    /// @return MatchFillResults struct that does not include fees paid.\n    function _calculateMatchedFillResults(\n        LibOrder.Order memory leftOrder,\n        LibOrder.Order memory rightOrder,\n        uint256 leftMakerAssetAmountRemaining,\n        uint256 leftTakerAssetAmountRemaining,\n        uint256 rightMakerAssetAmountRemaining,\n        uint256 rightTakerAssetAmountRemaining\n    )\n        private\n        pure\n        returns (MatchedFillResults memory matchedFillResults)\n    {\n        // Calculate fill results for maker and taker assets: at least one order will be fully filled.\n        // The maximum amount the left maker can buy is `leftTakerAssetAmountRemaining`\n        // The maximum amount the right maker can sell is `rightMakerAssetAmountRemaining`\n        // We have two distinct cases for calculating the fill results:\n        // Case 1.\n        //   If the left maker can buy more than the right maker can sell, then only the right order is fully filled.\n        //   If the left maker can buy exactly what the right maker can sell, then both orders are fully filled.\n        // Case 2.\n        //   If the left maker cannot buy more than the right maker can sell, then only the left order is fully filled.\n        // Case 3.\n        //   If the left maker can buy exactly as much as the right maker can sell, then both orders are fully filled.\n        if (leftTakerAssetAmountRemaining > rightMakerAssetAmountRemaining) {\n            // Case 1: Right order is fully filled\n            matchedFillResults = _calculateCompleteRightFill(\n                leftOrder,\n                rightMakerAssetAmountRemaining,\n                rightTakerAssetAmountRemaining\n            );\n        } else if (leftTakerAssetAmountRemaining < rightMakerAssetAmountRemaining) {\n            // Case 2: Left order is fully filled\n            matchedFillResults.left.makerAssetFilledAmount = leftMakerAssetAmountRemaining;\n            matchedFillResults.left.takerAssetFilledAmount = leftTakerAssetAmountRemaining;\n            matchedFillResults.right.makerAssetFilledAmount = leftTakerAssetAmountRemaining;\n            // Round up to ensure the maker's exchange rate does not exceed the price specified by the order.\n            // We favor the maker when the exchange rate must be rounded.\n            matchedFillResults.right.takerAssetFilledAmount = LibMath.safeGetPartialAmountCeil(\n                rightOrder.takerAssetAmount,\n                rightOrder.makerAssetAmount,\n                leftTakerAssetAmountRemaining // matchedFillResults.right.makerAssetFilledAmount\n            );\n        } else {\n            // leftTakerAssetAmountRemaining == rightMakerAssetAmountRemaining\n            // Case 3: Both orders are fully filled. Technically, this could be captured by the above cases, but\n            //         this calculation will be more precise since it does not include rounding.\n            matchedFillResults = _calculateCompleteFillBoth(\n                leftMakerAssetAmountRemaining,\n                leftTakerAssetAmountRemaining,\n                rightMakerAssetAmountRemaining,\n                rightTakerAssetAmountRemaining\n            );\n        }\n\n        // Calculate amount given to taker\n        matchedFillResults.profitInLeftMakerAsset = matchedFillResults.left.makerAssetFilledAmount.safeSub(\n            matchedFillResults.right.takerAssetFilledAmount\n        );\n\n        return matchedFillResults;\n    }\n\n    /// @dev Calculates part of the matched fill results for a given situation using the maximal fill order matching\n    ///      strategy.\n    /// @param leftOrder The left order in the order matching situation.\n    /// @param rightOrder The right order in the order matching situation.\n    /// @param leftMakerAssetAmountRemaining The amount of the left order maker asset that can still be filled.\n    /// @param leftTakerAssetAmountRemaining The amount of the left order taker asset that can still be filled.\n    /// @param rightMakerAssetAmountRemaining The amount of the right order maker asset that can still be filled.\n    /// @param rightTakerAssetAmountRemaining The amount of the right order taker asset that can still be filled.\n    /// @return MatchFillResults struct that does not include fees paid.\n    function _calculateMatchedFillResultsWithMaximalFill(\n        LibOrder.Order memory leftOrder,\n        LibOrder.Order memory rightOrder,\n        uint256 leftMakerAssetAmountRemaining,\n        uint256 leftTakerAssetAmountRemaining,\n        uint256 rightMakerAssetAmountRemaining,\n        uint256 rightTakerAssetAmountRemaining\n    )\n        private\n        pure\n        returns (MatchedFillResults memory matchedFillResults)\n    {\n        // If a maker asset is greater than the opposite taker asset, than there will be a spread denominated in that maker asset.\n        bool doesLeftMakerAssetProfitExist = leftMakerAssetAmountRemaining > rightTakerAssetAmountRemaining;\n        bool doesRightMakerAssetProfitExist = rightMakerAssetAmountRemaining > leftTakerAssetAmountRemaining;\n\n        // Calculate the maximum fill results for the maker and taker assets. At least one of the orders will be fully filled.\n        //\n        // The maximum that the left maker can possibly buy is the amount that the right order can sell.\n        // The maximum that the right maker can possibly buy is the amount that the left order can sell.\n        //\n        // If the left order is fully filled, profit will be paid out in the left maker asset. If the right order is fully filled,\n        // the profit will be out in the right maker asset.\n        //\n        // There are three cases to consider:\n        // Case 1.\n        //   If the left maker can buy more than the right maker can sell, then only the right order is fully filled.\n        // Case 2.\n        //   If the right maker can buy more than the left maker can sell, then only the right order is fully filled.\n        // Case 3.\n        //   If the right maker can sell the max of what the left maker can buy and the left maker can sell the max of\n        //   what the right maker can buy, then both orders are fully filled.\n        if (leftTakerAssetAmountRemaining > rightMakerAssetAmountRemaining) {\n            // Case 1: Right order is fully filled with the profit paid in the left makerAsset\n            matchedFillResults = _calculateCompleteRightFill(\n                leftOrder,\n                rightMakerAssetAmountRemaining,\n                rightTakerAssetAmountRemaining\n            );\n        } else if (rightTakerAssetAmountRemaining > leftMakerAssetAmountRemaining) {\n            // Case 2: Left order is fully filled with the profit paid in the right makerAsset.\n            matchedFillResults.left.makerAssetFilledAmount = leftMakerAssetAmountRemaining;\n            matchedFillResults.left.takerAssetFilledAmount = leftTakerAssetAmountRemaining;\n            // Round down to ensure the right maker's exchange rate does not exceed the price specified by the order.\n            // We favor the right maker when the exchange rate must be rounded and the profit is being paid in the\n            // right maker asset.\n            matchedFillResults.right.makerAssetFilledAmount = LibMath.safeGetPartialAmountFloor(\n                rightOrder.makerAssetAmount,\n                rightOrder.takerAssetAmount,\n                leftMakerAssetAmountRemaining\n            );\n            matchedFillResults.right.takerAssetFilledAmount = leftMakerAssetAmountRemaining;\n        } else {\n            // Case 3: The right and left orders are fully filled\n            matchedFillResults = _calculateCompleteFillBoth(\n                leftMakerAssetAmountRemaining,\n                leftTakerAssetAmountRemaining,\n                rightMakerAssetAmountRemaining,\n                rightTakerAssetAmountRemaining\n            );\n        }\n\n        // Calculate amount given to taker in the left order's maker asset if the left spread will be part of the profit.\n        if (doesLeftMakerAssetProfitExist) {\n            matchedFillResults.profitInLeftMakerAsset = matchedFillResults.left.makerAssetFilledAmount.safeSub(\n                matchedFillResults.right.takerAssetFilledAmount\n            );\n        }\n\n        // Calculate amount given to taker in the right order's maker asset if the right spread will be part of the profit.\n        if (doesRightMakerAssetProfitExist) {\n            matchedFillResults.profitInRightMakerAsset = matchedFillResults.right.makerAssetFilledAmount.safeSub(\n                matchedFillResults.left.takerAssetFilledAmount\n            );\n        }\n\n        return matchedFillResults;\n    }\n\n    /// @dev Calculates the fill results for the maker and taker in the order matching and writes the results\n    ///      to the fillResults that are being collected on the order. Both orders will be fully filled in this\n    ///      case.\n    /// @param leftMakerAssetAmountRemaining The amount of the left maker asset that is remaining to be filled.\n    /// @param leftTakerAssetAmountRemaining The amount of the left taker asset that is remaining to be filled.\n    /// @param rightMakerAssetAmountRemaining The amount of the right maker asset that is remaining to be filled.\n    /// @param rightTakerAssetAmountRemaining The amount of the right taker asset that is remaining to be filled.\n    /// @return MatchFillResults struct that does not include fees paid or spreads taken.\n    function _calculateCompleteFillBoth(\n        uint256 leftMakerAssetAmountRemaining,\n        uint256 leftTakerAssetAmountRemaining,\n        uint256 rightMakerAssetAmountRemaining,\n        uint256 rightTakerAssetAmountRemaining\n    )\n        private\n        pure\n        returns (MatchedFillResults memory matchedFillResults)\n    {\n        // Calculate the fully filled results for both orders.\n        matchedFillResults.left.makerAssetFilledAmount = leftMakerAssetAmountRemaining;\n        matchedFillResults.left.takerAssetFilledAmount = leftTakerAssetAmountRemaining;\n        matchedFillResults.right.makerAssetFilledAmount = rightMakerAssetAmountRemaining;\n        matchedFillResults.right.takerAssetFilledAmount = rightTakerAssetAmountRemaining;\n\n        return matchedFillResults;\n    }\n\n    /// @dev Calculates the fill results for the maker and taker in the order matching and writes the results\n    ///      to the fillResults that are being collected on the order.\n    /// @param leftOrder The left order that is being maximally filled. All of the information about fill amounts\n    ///                  can be derived from this order and the right asset remaining fields.\n    /// @param rightMakerAssetAmountRemaining The amount of the right maker asset that is remaining to be filled.\n    /// @param rightTakerAssetAmountRemaining The amount of the right taker asset that is remaining to be filled.\n    /// @return MatchFillResults struct that does not include fees paid or spreads taken.\n    function _calculateCompleteRightFill(\n        LibOrder.Order memory leftOrder,\n        uint256 rightMakerAssetAmountRemaining,\n        uint256 rightTakerAssetAmountRemaining\n    )\n        private\n        pure\n        returns (MatchedFillResults memory matchedFillResults)\n    {\n        matchedFillResults.right.makerAssetFilledAmount = rightMakerAssetAmountRemaining;\n        matchedFillResults.right.takerAssetFilledAmount = rightTakerAssetAmountRemaining;\n        matchedFillResults.left.takerAssetFilledAmount = rightMakerAssetAmountRemaining;\n        // Round down to ensure the left maker's exchange rate does not exceed the price specified by the order.\n        // We favor the left maker when the exchange rate must be rounded and the profit is being paid in the\n        // left maker asset.\n        matchedFillResults.left.makerAssetFilledAmount = LibMath.safeGetPartialAmountFloor(\n            leftOrder.makerAssetAmount,\n            leftOrder.takerAssetAmount,\n            rightMakerAssetAmountRemaining\n        );\n\n        return matchedFillResults;\n    }\n}\n",
        "@0x/contracts-utils/contracts/src/LibSafeMath.sol": "pragma solidity ^0.5.9;\n\nimport \"./LibRichErrors.sol\";\nimport \"./LibSafeMathRichErrors.sol\";\n\n\nlibrary LibSafeMath {\n\n    function safeMul(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        if (a == 0) {\n            return 0;\n        }\n        uint256 c = a * b;\n        if (c / a != b) {\n            LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n                LibSafeMathRichErrors.BinOpErrorCodes.MULTIPLICATION_OVERFLOW,\n                a,\n                b\n            ));\n        }\n        return c;\n    }\n\n    function safeDiv(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        if (b == 0) {\n            LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n                LibSafeMathRichErrors.BinOpErrorCodes.DIVISION_BY_ZERO,\n                a,\n                b\n            ));\n        }\n        uint256 c = a / b;\n        return c;\n    }\n\n    function safeSub(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        if (b > a) {\n            LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n                LibSafeMathRichErrors.BinOpErrorCodes.SUBTRACTION_UNDERFLOW,\n                a,\n                b\n            ));\n        }\n        return a - b;\n    }\n\n    function safeAdd(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        uint256 c = a + b;\n        if (c < a) {\n            LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n                LibSafeMathRichErrors.BinOpErrorCodes.ADDITION_OVERFLOW,\n                a,\n                b\n            ));\n        }\n        return c;\n    }\n\n    function max256(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        return a >= b ? a : b;\n    }\n\n    function min256(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        return a < b ? a : b;\n    }\n}\n",
        "@0x/contracts-utils/contracts/src/LibSafeMathRichErrors.sol": "pragma solidity ^0.5.9;\n\n\nlibrary LibSafeMathRichErrors {\n\n    // bytes4(keccak256(\"Uint256BinOpError(uint8,uint256,uint256)\"))\n    bytes4 internal constant UINT256_BINOP_ERROR_SELECTOR =\n        0xe946c1bb;\n\n    // bytes4(keccak256(\"Uint256DowncastError(uint8,uint256)\"))\n    bytes4 internal constant UINT256_DOWNCAST_ERROR_SELECTOR =\n        0xc996af7b;\n\n    enum BinOpErrorCodes {\n        ADDITION_OVERFLOW,\n        MULTIPLICATION_OVERFLOW,\n        SUBTRACTION_UNDERFLOW,\n        DIVISION_BY_ZERO\n    }\n\n    enum DowncastErrorCodes {\n        VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT32,\n        VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT64,\n        VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT96\n    }\n\n    // solhint-disable func-name-mixedcase\n    function Uint256BinOpError(\n        BinOpErrorCodes errorCode,\n        uint256 a,\n        uint256 b\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            UINT256_BINOP_ERROR_SELECTOR,\n            errorCode,\n            a,\n            b\n        );\n    }\n\n    function Uint256DowncastError(\n        DowncastErrorCodes errorCode,\n        uint256 a\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            UINT256_DOWNCAST_ERROR_SELECTOR,\n            errorCode,\n            a\n        );\n    }\n}\n",
        "@0x/contracts-exchange-libs/contracts/src/LibMath.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"./LibMathRichErrors.sol\";\n\n\nlibrary LibMath {\n\n    using LibSafeMath for uint256;\n\n    /// @dev Calculates partial value given a numerator and denominator rounded down.\n    ///      Reverts if rounding error is >= 0.1%\n    /// @param numerator Numerator.\n    /// @param denominator Denominator.\n    /// @param target Value to calculate partial of.\n    /// @return Partial value of target rounded down.\n    function safeGetPartialAmountFloor(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (uint256 partialAmount)\n    {\n        if (isRoundingErrorFloor(\n                numerator,\n                denominator,\n                target\n        )) {\n            LibRichErrors.rrevert(LibMathRichErrors.RoundingError(\n                numerator,\n                denominator,\n                target\n            ));\n        }\n\n        partialAmount = numerator.safeMul(target).safeDiv(denominator);\n        return partialAmount;\n    }\n\n    /// @dev Calculates partial value given a numerator and denominator rounded down.\n    ///      Reverts if rounding error is >= 0.1%\n    /// @param numerator Numerator.\n    /// @param denominator Denominator.\n    /// @param target Value to calculate partial of.\n    /// @return Partial value of target rounded up.\n    function safeGetPartialAmountCeil(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (uint256 partialAmount)\n    {\n        if (isRoundingErrorCeil(\n                numerator,\n                denominator,\n                target\n        )) {\n            LibRichErrors.rrevert(LibMathRichErrors.RoundingError(\n                numerator,\n                denominator,\n                target\n            ));\n        }\n\n        // safeDiv computes `floor(a / b)`. We use the identity (a, b integer):\n        //       ceil(a / b) = floor((a + b - 1) / b)\n        // To implement `ceil(a / b)` using safeDiv.\n        partialAmount = numerator.safeMul(target)\n            .safeAdd(denominator.safeSub(1))\n            .safeDiv(denominator);\n\n        return partialAmount;\n    }\n\n    /// @dev Calculates partial value given a numerator and denominator rounded down.\n    /// @param numerator Numerator.\n    /// @param denominator Denominator.\n    /// @param target Value to calculate partial of.\n    /// @return Partial value of target rounded down.\n    function getPartialAmountFloor(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (uint256 partialAmount)\n    {\n        partialAmount = numerator.safeMul(target).safeDiv(denominator);\n        return partialAmount;\n    }\n\n    /// @dev Calculates partial value given a numerator and denominator rounded down.\n    /// @param numerator Numerator.\n    /// @param denominator Denominator.\n    /// @param target Value to calculate partial of.\n    /// @return Partial value of target rounded up.\n    function getPartialAmountCeil(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (uint256 partialAmount)\n    {\n        // safeDiv computes `floor(a / b)`. We use the identity (a, b integer):\n        //       ceil(a / b) = floor((a + b - 1) / b)\n        // To implement `ceil(a / b)` using safeDiv.\n        partialAmount = numerator.safeMul(target)\n            .safeAdd(denominator.safeSub(1))\n            .safeDiv(denominator);\n\n        return partialAmount;\n    }\n\n    /// @dev Checks if rounding error >= 0.1% when rounding down.\n    /// @param numerator Numerator.\n    /// @param denominator Denominator.\n    /// @param target Value to multiply with numerator/denominator.\n    /// @return Rounding error is present.\n    function isRoundingErrorFloor(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (bool isError)\n    {\n        if (denominator == 0) {\n            LibRichErrors.rrevert(LibMathRichErrors.DivisionByZeroError());\n        }\n\n        // The absolute rounding error is the difference between the rounded\n        // value and the ideal value. The relative rounding error is the\n        // absolute rounding error divided by the absolute value of the\n        // ideal value. This is undefined when the ideal value is zero.\n        //\n        // The ideal value is `numerator * target / denominator`.\n        // Let's call `numerator * target % denominator` the remainder.\n        // The absolute error is `remainder / denominator`.\n        //\n        // When the ideal value is zero, we require the absolute error to\n        // be zero. Fortunately, this is always the case. The ideal value is\n        // zero iff `numerator == 0` and/or `target == 0`. In this case the\n        // remainder and absolute error are also zero.\n        if (target == 0 || numerator == 0) {\n            return false;\n        }\n\n        // Otherwise, we want the relative rounding error to be strictly\n        // less than 0.1%.\n        // The relative error is `remainder / (numerator * target)`.\n        // We want the relative error less than 1 / 1000:\n        //        remainder / (numerator * denominator)  <  1 / 1000\n        // or equivalently:\n        //        1000 * remainder  <  numerator * target\n        // so we have a rounding error iff:\n        //        1000 * remainder  >=  numerator * target\n        uint256 remainder = mulmod(\n            target,\n            numerator,\n            denominator\n        );\n        isError = remainder.safeMul(1000) >= numerator.safeMul(target);\n        return isError;\n    }\n\n    /// @dev Checks if rounding error >= 0.1% when rounding up.\n    /// @param numerator Numerator.\n    /// @param denominator Denominator.\n    /// @param target Value to multiply with numerator/denominator.\n    /// @return Rounding error is present.\n    function isRoundingErrorCeil(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (bool isError)\n    {\n        if (denominator == 0) {\n            LibRichErrors.rrevert(LibMathRichErrors.DivisionByZeroError());\n        }\n\n        // See the comments in `isRoundingError`.\n        if (target == 0 || numerator == 0) {\n            // When either is zero, the ideal value and rounded value are zero\n            // and there is no rounding error. (Although the relative error\n            // is undefined.)\n            return false;\n        }\n        // Compute remainder as before\n        uint256 remainder = mulmod(\n            target,\n            numerator,\n            denominator\n        );\n        remainder = denominator.safeSub(remainder) % denominator;\n        isError = remainder.safeMul(1000) >= numerator.safeMul(target);\n        return isError;\n    }\n}\n",
        "@0x/contracts-exchange-libs/contracts/src/LibMathRichErrors.sol": "pragma solidity ^0.5.9;\n\n\nlibrary LibMathRichErrors {\n\n    // bytes4(keccak256(\"DivisionByZeroError()\"))\n    bytes internal constant DIVISION_BY_ZERO_ERROR =\n        hex\"a791837c\";\n\n    // bytes4(keccak256(\"RoundingError(uint256,uint256,uint256)\"))\n    bytes4 internal constant ROUNDING_ERROR_SELECTOR =\n        0x339f3de2;\n\n    // solhint-disable func-name-mixedcase\n    function DivisionByZeroError()\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return DIVISION_BY_ZERO_ERROR;\n    }\n\n    function RoundingError(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            ROUNDING_ERROR_SELECTOR,\n            numerator,\n            denominator,\n            target\n        );\n    }\n}\n",
        "@0x/contracts-exchange/contracts/src/interfaces/IProtocolFees.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ncontract IProtocolFees {\n\n    // Logs updates to the protocol fee multiplier.\n    event ProtocolFeeMultiplier(uint256 oldProtocolFeeMultiplier, uint256 updatedProtocolFeeMultiplier);\n\n    // Logs updates to the protocolFeeCollector address.\n    event ProtocolFeeCollectorAddress(address oldProtocolFeeCollector, address updatedProtocolFeeCollector);\n\n    /// @dev Allows the owner to update the protocol fee multiplier.\n    /// @param updatedProtocolFeeMultiplier The updated protocol fee multiplier.\n    function setProtocolFeeMultiplier(uint256 updatedProtocolFeeMultiplier)\n        external;\n\n    /// @dev Allows the owner to update the protocolFeeCollector address.\n    /// @param updatedProtocolFeeCollector The updated protocolFeeCollector contract address.\n    function setProtocolFeeCollectorAddress(address updatedProtocolFeeCollector)\n        external;\n\n    /// @dev Returns the protocolFeeMultiplier\n    function protocolFeeMultiplier()\n        external\n        view\n        returns (uint256);\n\n    /// @dev Returns the protocolFeeCollector address\n    function protocolFeeCollector()\n        external\n        view\n        returns (address);\n}\n",
        "@0x/contracts-exchange/contracts/src/interfaces/IMatchOrders.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibFillResults.sol\";\n\n\ncontract IMatchOrders {\n\n    /// @dev Match complementary orders that have a profitable spread.\n    ///      Each order is filled at their respective price point, and\n    ///      the matcher receives a profit denominated in the left maker asset.\n    /// @param leftOrders Set of orders with the same maker / taker asset.\n    /// @param rightOrders Set of orders to match against `leftOrders`\n    /// @param leftSignatures Proof that left orders were created by the left makers.\n    /// @param rightSignatures Proof that right orders were created by the right makers.\n    /// @return batchMatchedFillResults Amounts filled and profit generated.\n    function batchMatchOrders(\n        LibOrder.Order[] memory leftOrders,\n        LibOrder.Order[] memory rightOrders,\n        bytes[] memory leftSignatures,\n        bytes[] memory rightSignatures\n    )\n        public\n        payable\n        returns (LibFillResults.BatchMatchedFillResults memory batchMatchedFillResults);\n\n    /// @dev Match complementary orders that have a profitable spread.\n    ///      Each order is maximally filled at their respective price point, and\n    ///      the matcher receives a profit denominated in either the left maker asset,\n    ///      right maker asset, or a combination of both.\n    /// @param leftOrders Set of orders with the same maker / taker asset.\n    /// @param rightOrders Set of orders to match against `leftOrders`\n    /// @param leftSignatures Proof that left orders were created by the left makers.\n    /// @param rightSignatures Proof that right orders were created by the right makers.\n    /// @return batchMatchedFillResults Amounts filled and profit generated.\n    function batchMatchOrdersWithMaximalFill(\n        LibOrder.Order[] memory leftOrders,\n        LibOrder.Order[] memory rightOrders,\n        bytes[] memory leftSignatures,\n        bytes[] memory rightSignatures\n    )\n        public\n        payable\n        returns (LibFillResults.BatchMatchedFillResults memory batchMatchedFillResults);\n\n    /// @dev Match two complementary orders that have a profitable spread.\n    ///      Each order is filled at their respective price point. However, the calculations are\n    ///      carried out as though the orders are both being filled at the right order's price point.\n    ///      The profit made by the left order goes to the taker (who matched the two orders).\n    /// @param leftOrder First order to match.\n    /// @param rightOrder Second order to match.\n    /// @param leftSignature Proof that order was created by the left maker.\n    /// @param rightSignature Proof that order was created by the right maker.\n    /// @return matchedFillResults Amounts filled and fees paid by maker and taker of matched orders.\n    function matchOrders(\n        LibOrder.Order memory leftOrder,\n        LibOrder.Order memory rightOrder,\n        bytes memory leftSignature,\n        bytes memory rightSignature\n    )\n        public\n        payable\n        returns (LibFillResults.MatchedFillResults memory matchedFillResults);\n\n    /// @dev Match two complementary orders that have a profitable spread.\n    ///      Each order is maximally filled at their respective price point, and\n    ///      the matcher receives a profit denominated in either the left maker asset,\n    ///      right maker asset, or a combination of both.\n    /// @param leftOrder First order to match.\n    /// @param rightOrder Second order to match.\n    /// @param leftSignature Proof that order was created by the left maker.\n    /// @param rightSignature Proof that order was created by the right maker.\n    /// @return matchedFillResults Amounts filled by maker and taker of matched orders.\n    function matchOrdersWithMaximalFill(\n        LibOrder.Order memory leftOrder,\n        LibOrder.Order memory rightOrder,\n        bytes memory leftSignature,\n        bytes memory rightSignature\n    )\n        public\n        payable\n        returns (LibFillResults.MatchedFillResults memory matchedFillResults);\n}\n",
        "@0x/contracts-exchange/contracts/src/interfaces/ISignatureValidator.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibZeroExTransaction.sol\";\n\n\ncontract ISignatureValidator {\n\n   // Allowed signature types.\n    enum SignatureType {\n        Illegal,                     // 0x00, default value\n        Invalid,                     // 0x01\n        EIP712,                      // 0x02\n        EthSign,                     // 0x03\n        Wallet,                      // 0x04\n        Validator,                   // 0x05\n        PreSigned,                   // 0x06\n        EIP1271Wallet,               // 0x07\n        NSignatureTypes              // 0x08, number of signature types. Always leave at end.\n    }\n\n    event SignatureValidatorApproval(\n        address indexed signerAddress,     // Address that approves or disapproves a contract to verify signatures.\n        address indexed validatorAddress,  // Address of signature validator contract.\n        bool isApproved                    // Approval or disapproval of validator contract.\n    );\n\n    /// @dev Approves a hash on-chain.\n    ///      After presigning a hash, the preSign signature type will become valid for that hash and signer.\n    /// @param hash Any 32-byte hash.\n    function preSign(bytes32 hash)\n        external\n        payable;\n\n    /// @dev Approves/unnapproves a Validator contract to verify signatures on signer's behalf.\n    /// @param validatorAddress Address of Validator contract.\n    /// @param approval Approval or disapproval of  Validator contract.\n    function setSignatureValidatorApproval(\n        address validatorAddress,\n        bool approval\n    )\n        external\n        payable;\n\n    /// @dev Verifies that a hash has been signed by the given signer.\n    /// @param hash Any 32-byte hash.\n    /// @param signature Proof that the hash has been signed by signer.\n    /// @return isValid `true` if the signature is valid for the given hash and signer.\n    function isValidHashSignature(\n        bytes32 hash,\n        address signerAddress,\n        bytes memory signature\n    )\n        public\n        view\n        returns (bool isValid);\n\n    /// @dev Verifies that a signature for an order is valid.\n    /// @param order The order.\n    /// @param signature Proof that the order has been signed by signer.\n    /// @return isValid true if the signature is valid for the given order and signer.\n    function isValidOrderSignature(\n        LibOrder.Order memory order,\n        bytes memory signature\n    )\n        public\n        view\n        returns (bool isValid);\n\n    /// @dev Verifies that a signature for a transaction is valid.\n    /// @param transaction The transaction.\n    /// @param signature Proof that the order has been signed by signer.\n    /// @return isValid true if the signature is valid for the given transaction and signer.\n    function isValidTransactionSignature(\n        LibZeroExTransaction.ZeroExTransaction memory transaction,\n        bytes memory signature\n    )\n        public\n        view\n        returns (bool isValid);\n\n    /// @dev Verifies that an order, with provided order hash, has been signed\n    ///      by the given signer.\n    /// @param order The order.\n    /// @param orderHash The hash of the order.\n    /// @param signature Proof that the hash has been signed by signer.\n    /// @return isValid True if the signature is valid for the given order and signer.\n    function _isValidOrderWithHashSignature(\n        LibOrder.Order memory order,\n        bytes32 orderHash,\n        bytes memory signature\n    )\n        internal\n        view\n        returns (bool isValid);\n\n    /// @dev Verifies that a transaction, with provided order hash, has been signed\n    ///      by the given signer.\n    /// @param transaction The transaction.\n    /// @param transactionHash The hash of the transaction.\n    /// @param signature Proof that the hash has been signed by signer.\n    /// @return isValid True if the signature is valid for the given transaction and signer.\n    function _isValidTransactionWithHashSignature(\n        LibZeroExTransaction.ZeroExTransaction memory transaction,\n        bytes32 transactionHash,\n        bytes memory signature\n    )\n        internal\n        view\n        returns (bool isValid);\n}\n",
        "@0x/contracts-exchange/contracts/src/interfaces/IAssetProxyDispatcher.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ncontract IAssetProxyDispatcher {\n\n    // Logs registration of new asset proxy\n    event AssetProxyRegistered(\n        bytes4 id,              // Id of new registered AssetProxy.\n        address assetProxy      // Address of new registered AssetProxy.\n    );\n\n    /// @dev Registers an asset proxy to its asset proxy id.\n    ///      Once an asset proxy is registered, it cannot be unregistered.\n    /// @param assetProxy Address of new asset proxy to register.\n    function registerAssetProxy(address assetProxy)\n        external;\n\n    /// @dev Gets an asset proxy.\n    /// @param assetProxyId Id of the asset proxy.\n    /// @return The asset proxy registered to assetProxyId. Returns 0x0 if no proxy is registered.\n    function getAssetProxy(bytes4 assetProxyId)\n        external\n        view\n        returns (address);\n}\n",
        "@0x/contracts-exchange/contracts/src/interfaces/IWrapperFunctions.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibFillResults.sol\";\n\n\ncontract IWrapperFunctions {\n\n    /// @dev Fills the input order. Reverts if exact takerAssetFillAmount not filled.\n    /// @param order Order struct containing order specifications.\n    /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n    /// @param signature Proof that order has been created by maker.\n    function fillOrKillOrder(\n        LibOrder.Order memory order,\n        uint256 takerAssetFillAmount,\n        bytes memory signature\n    )\n        public\n        payable\n        returns (LibFillResults.FillResults memory fillResults);\n\n    /// @dev Executes multiple calls of fillOrder.\n    /// @param orders Array of order specifications.\n    /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n    /// @param signatures Proofs that orders have been created by makers.\n    /// @return Array of amounts filled and fees paid by makers and taker.\n    function batchFillOrders(\n        LibOrder.Order[] memory orders,\n        uint256[] memory takerAssetFillAmounts,\n        bytes[] memory signatures\n    )\n        public\n        payable\n        returns (LibFillResults.FillResults[] memory fillResults);\n\n    /// @dev Executes multiple calls of fillOrKillOrder.\n    /// @param orders Array of order specifications.\n    /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n    /// @param signatures Proofs that orders have been created by makers.\n    /// @return Array of amounts filled and fees paid by makers and taker.\n    function batchFillOrKillOrders(\n        LibOrder.Order[] memory orders,\n        uint256[] memory takerAssetFillAmounts,\n        bytes[] memory signatures\n    )\n        public\n        payable\n        returns (LibFillResults.FillResults[] memory fillResults);\n\n    /// @dev Executes multiple calls of fillOrder. If any fill reverts, the error is caught and ignored.\n    /// @param orders Array of order specifications.\n    /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n    /// @param signatures Proofs that orders have been created by makers.\n    /// @return Array of amounts filled and fees paid by makers and taker.\n    function batchFillOrdersNoThrow(\n        LibOrder.Order[] memory orders,\n        uint256[] memory takerAssetFillAmounts,\n        bytes[] memory signatures\n    )\n        public\n        payable\n        returns (LibFillResults.FillResults[] memory fillResults);\n\n    /// @dev Executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n    ///      If any fill reverts, the error is caught and ignored.\n    ///      NOTE: This function does not enforce that the takerAsset is the same for each order.\n    /// @param orders Array of order specifications.\n    /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n    /// @param signatures Proofs that orders have been signed by makers.\n    /// @return Amounts filled and fees paid by makers and taker.\n    function marketSellOrdersNoThrow(\n        LibOrder.Order[] memory orders,\n        uint256 takerAssetFillAmount,\n        bytes[] memory signatures\n    )\n        public\n        payable\n        returns (LibFillResults.FillResults memory fillResults);\n\n    /// @dev Executes multiple calls of fillOrder until total amount of makerAsset is bought by taker.\n    ///      If any fill reverts, the error is caught and ignored.\n    ///      NOTE: This function does not enforce that the makerAsset is the same for each order.\n    /// @param orders Array of order specifications.\n    /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n    /// @param signatures Proofs that orders have been signed by makers.\n    /// @return Amounts filled and fees paid by makers and taker.\n    function marketBuyOrdersNoThrow(\n        LibOrder.Order[] memory orders,\n        uint256 makerAssetFillAmount,\n        bytes[] memory signatures\n    )\n        public\n        payable\n        returns (LibFillResults.FillResults memory fillResults);\n\n    /// @dev Calls marketSellOrdersNoThrow then reverts if < takerAssetFillAmount has been sold.\n    ///      NOTE: This function does not enforce that the takerAsset is the same for each order.\n    /// @param orders Array of order specifications.\n    /// @param takerAssetFillAmount Minimum amount of takerAsset to sell.\n    /// @param signatures Proofs that orders have been signed by makers.\n    /// @return Amounts filled and fees paid by makers and taker.\n    function marketSellOrdersFillOrKill(\n        LibOrder.Order[] memory orders,\n        uint256 takerAssetFillAmount,\n        bytes[] memory signatures\n    )\n        public\n        payable\n        returns (LibFillResults.FillResults memory fillResults);\n\n    /// @dev Calls marketBuyOrdersNoThrow then reverts if < makerAssetFillAmount has been bought.\n    ///      NOTE: This function does not enforce that the makerAsset is the same for each order.\n    /// @param orders Array of order specifications.\n    /// @param makerAssetFillAmount Minimum amount of makerAsset to buy.\n    /// @param signatures Proofs that orders have been signed by makers.\n    /// @return Amounts filled and fees paid by makers and taker.\n    function marketBuyOrdersFillOrKill(\n        LibOrder.Order[] memory orders,\n        uint256 makerAssetFillAmount,\n        bytes[] memory signatures\n    )\n        public\n        payable\n        returns (LibFillResults.FillResults memory fillResults);\n\n    /// @dev Executes multiple calls of cancelOrder.\n    /// @param orders Array of order specifications.\n    function batchCancelOrders(LibOrder.Order[] memory orders)\n        public\n        payable;\n}\n",
        "@0x/contracts-exchange/contracts/src/interfaces/ITransferSimulator.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\n\ncontract ITransferSimulator {\n\n    /// @dev This function may be used to simulate any amount of transfers\n    /// As they would occur through the Exchange contract. Note that this function\n    /// will always revert, even if all transfers are successful. However, it may\n    /// be used with eth_call or with a try/catch pattern in order to simulate\n    /// the results of the transfers.\n    /// @param assetData Array of asset details, each encoded per the AssetProxy contract specification.\n    /// @param fromAddresses Array containing the `from` addresses that correspond with each transfer.\n    /// @param toAddresses Array containing the `to` addresses that correspond with each transfer.\n    /// @param amounts Array containing the amounts that correspond to each transfer.\n    /// @return This function does not return a value. However, it will always revert with\n    /// `Error(\"TRANSFERS_SUCCESSFUL\")` if all of the transfers were successful.\n    function simulateDispatchTransferFromCalls(\n        bytes[] memory assetData,\n        address[] memory fromAddresses,\n        address[] memory toAddresses,\n        uint256[] memory amounts\n    )\n        public;\n}\n",
        "./libs/LibCoordinatorApproval.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"./LibEIP712CoordinatorDomain.sol\";\n\n\ncontract LibCoordinatorApproval is\n    LibEIP712CoordinatorDomain\n{\n    // Hash for the EIP712 Coordinator approval message\n    // keccak256(abi.encodePacked(\n    //     \"CoordinatorApproval(\",\n    //     \"address txOrigin,\",\n    //     \"bytes32 transactionHash,\",\n    //     \"bytes transactionSignature\",\n    //     \")\"\n    // ));\n    bytes32 constant public EIP712_COORDINATOR_APPROVAL_SCHEMA_HASH =\n        0xa6511c04ca44625d50986f8c36bedc09366207a17b96e347094053a9f8507168;\n\n    struct CoordinatorApproval {\n        address txOrigin;                       // Required signer of Ethereum transaction that is submitting approval.\n        bytes32 transactionHash;                // EIP712 hash of the transaction.\n        bytes transactionSignature;             // Signature of the 0x transaction.\n    }\n\n    /// @dev Calculates the EIP712 hash of the Coordinator approval mesasage using the domain\n    ///      separator of this contract.\n    /// @param approval Coordinator approval message containing the transaction hash, and transaction\n    ///        signature.\n    /// @return approvalHash EIP712 hash of the Coordinator approval message with the domain\n    ///         separator of this contract.\n    function getCoordinatorApprovalHash(CoordinatorApproval memory approval)\n        public\n        view\n        returns (bytes32 approvalHash)\n    {\n        approvalHash = _hashEIP712CoordinatorMessage(_hashCoordinatorApproval(approval));\n        return approvalHash;\n    }\n\n    /// @dev Calculates the EIP712 hash of the Coordinator approval mesasage with no domain separator.\n    /// @param approval Coordinator approval message containing the transaction hash, and transaction\n    //         signature.\n    /// @return result EIP712 hash of the Coordinator approval message with no domain separator.\n    function _hashCoordinatorApproval(CoordinatorApproval memory approval)\n        internal\n        pure\n        returns (bytes32 result)\n    {\n        bytes32 schemaHash = EIP712_COORDINATOR_APPROVAL_SCHEMA_HASH;\n        bytes memory transactionSignature = approval.transactionSignature;\n        address txOrigin = approval.txOrigin;\n        bytes32 transactionHash = approval.transactionHash;\n\n        // Assembly for more efficiently computing:\n        // keccak256(abi.encodePacked(\n        //     EIP712_COORDINATOR_APPROVAL_SCHEMA_HASH,\n        //     approval.txOrigin,\n        //     approval.transactionHash,\n        //     keccak256(approval.transactionSignature)\n        // ));\n\n        assembly {\n            // Compute hash of transaction signature\n            let transactionSignatureHash := keccak256(add(transactionSignature, 32), mload(transactionSignature))\n\n            // Load free memory pointer\n            let memPtr := mload(64)\n\n            mstore(memPtr, schemaHash)                               // hash of schema\n            mstore(add(memPtr, 32), txOrigin)                        // txOrigin\n            mstore(add(memPtr, 64), transactionHash)                 // transactionHash\n            mstore(add(memPtr, 96), transactionSignatureHash)        // transactionSignatureHash\n            // Compute hash\n            result := keccak256(memPtr, 128)\n        }\n        return result;\n    }\n}\n",
        "./interfaces/ICoordinatorApprovalVerifier.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibZeroExTransaction.sol\";\n\n\ncontract ICoordinatorApprovalVerifier {\n\n    /// @dev Validates that the 0x transaction has been approved by all of the feeRecipients\n    ///      that correspond to each order in the transaction's Exchange calldata.\n    /// @param transaction 0x transaction containing salt, signerAddress, and data.\n    /// @param txOrigin Required signer of Ethereum transaction calling this function.\n    /// @param transactionSignature Proof that the transaction has been signed by the signer.\n    /// @param approvalSignatures Array of signatures that correspond to the feeRecipients of each\n    ///        order in the transaction's Exchange calldata.\n    function assertValidCoordinatorApprovals(\n        LibZeroExTransaction.ZeroExTransaction memory transaction,\n        address txOrigin,\n        bytes memory transactionSignature,\n        bytes[] memory approvalSignatures\n    )\n        public\n        view;\n\n    /// @dev Decodes the orders from Exchange calldata representing any fill method.\n    /// @param data Exchange calldata representing a fill method.\n    /// @return orders The orders from the Exchange calldata.\n    function decodeOrdersFromFillData(bytes memory data)\n        public\n        pure\n        returns (LibOrder.Order[] memory orders);\n}\n",
        "./MixinCoordinatorCore.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibZeroExTransaction.sol\";\nimport \"@0x/contracts-utils/contracts/src/Refundable.sol\";\nimport \"./libs/LibConstants.sol\";\nimport \"./interfaces/ICoordinatorCore.sol\";\nimport \"./interfaces/ICoordinatorApprovalVerifier.sol\";\n\n\n// solhint-disable no-empty-blocks\ncontract MixinCoordinatorCore is\n    Refundable,\n    LibConstants,\n    ICoordinatorApprovalVerifier,\n    ICoordinatorCore\n{\n\n    /// @dev A payable fallback function that makes this contract \"payable\". This is necessary to allow\n    ///      this contract to gracefully handle refunds from the Exchange.\n    function ()\n        external\n        payable\n    {}\n\n    /// @dev Executes a 0x transaction that has been signed by the feeRecipients that correspond to\n    ///      each order in the transaction's Exchange calldata.\n    /// @param transaction 0x transaction containing salt, signerAddress, and data.\n    /// @param txOrigin Required signer of Ethereum transaction calling this function.\n    /// @param transactionSignature Proof that the transaction has been signed by the signer.\n    /// @param approvalSignatures Array of signatures that correspond to the feeRecipients of each\n    ///        order in the transaction's Exchange calldata.\n    function executeTransaction(\n        LibZeroExTransaction.ZeroExTransaction memory transaction,\n        address txOrigin,\n        bytes memory transactionSignature,\n        bytes[] memory approvalSignatures\n    )\n        public\n        payable\n        refundFinalBalance\n    {\n        // Validate that the 0x transaction has been approves by each feeRecipient\n        assertValidCoordinatorApprovals(\n            transaction,\n            txOrigin,\n            transactionSignature,\n            approvalSignatures\n        );\n\n        // Execute the transaction\n        EXCHANGE.executeTransaction.value(msg.value)(transaction, transactionSignature);\n    }\n}\n",
        "@0x/contracts-utils/contracts/src/Refundable.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"./ReentrancyGuard.sol\";\n\n\ncontract Refundable is\n    ReentrancyGuard\n{\n\n    // This bool is used by the refund modifier to allow for lazily evaluated refunds.\n    bool internal _shouldNotRefund;\n\n    modifier refundFinalBalance {\n        _;\n        _refundNonZeroBalanceIfEnabled();\n    }\n\n    modifier refundFinalBalanceNoReentry {\n        _lockMutexOrThrowIfAlreadyLocked();\n        _;\n        _refundNonZeroBalanceIfEnabled();\n        _unlockMutex();\n    }\n\n    modifier disableRefundUntilEnd {\n        if (_areRefundsDisabled()) {\n            _;\n        } else {\n            _disableRefund();\n            _;\n            _enableAndRefundNonZeroBalance();\n        }\n    }\n\n    function _refundNonZeroBalanceIfEnabled()\n        internal\n    {\n        if (!_areRefundsDisabled()) {\n            _refundNonZeroBalance();\n        }\n    }\n\n    function _refundNonZeroBalance()\n        internal\n    {\n        uint256 balance = address(this).balance;\n        if (balance > 0) {\n            msg.sender.transfer(balance);\n        }\n    }\n\n    function _disableRefund()\n        internal\n    {\n        _shouldNotRefund = true;\n    }\n\n    function _enableAndRefundNonZeroBalance()\n        internal\n    {\n        _shouldNotRefund = false;\n        _refundNonZeroBalance();\n    }\n\n    function _areRefundsDisabled()\n        internal\n        view\n        returns (bool)\n    {\n        return _shouldNotRefund;\n    }\n}\n",
        "@0x/contracts-utils/contracts/src/ReentrancyGuard.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"./LibReentrancyGuardRichErrors.sol\";\nimport \"./LibRichErrors.sol\";\n\n\ncontract ReentrancyGuard {\n\n    // Locked state of mutex.\n    bool private _locked = false;\n\n    /// @dev Functions with this modifer cannot be reentered. The mutex will be locked\n    ///      before function execution and unlocked after.\n    modifier nonReentrant() {\n        _lockMutexOrThrowIfAlreadyLocked();\n        _;\n        _unlockMutex();\n    }\n\n    function _lockMutexOrThrowIfAlreadyLocked()\n        internal\n    {\n        // Ensure mutex is unlocked.\n        if (_locked) {\n            LibRichErrors.rrevert(\n                LibReentrancyGuardRichErrors.IllegalReentrancyError()\n            );\n        }\n        // Lock mutex.\n        _locked = true;\n    }\n\n    function _unlockMutex()\n        internal\n    {\n        // Unlock mutex.\n        _locked = false;\n    }\n}\n",
        "@0x/contracts-utils/contracts/src/LibReentrancyGuardRichErrors.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\nlibrary LibReentrancyGuardRichErrors {\n\n    // bytes4(keccak256(\"IllegalReentrancyError()\"))\n    bytes internal constant ILLEGAL_REENTRANCY_ERROR_SELECTOR_BYTES =\n        hex\"0c3b823f\";\n\n    // solhint-disable func-name-mixedcase\n    function IllegalReentrancyError()\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return ILLEGAL_REENTRANCY_ERROR_SELECTOR_BYTES;\n    }\n}\n",
        "./interfaces/ICoordinatorCore.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibZeroExTransaction.sol\";\n\n\ncontract ICoordinatorCore {\n\n    /// @dev Executes a 0x transaction that has been signed by the feeRecipients that correspond to\n    ///      each order in the transaction's Exchange calldata.\n    /// @param transaction 0x transaction containing salt, signerAddress, and data.\n    /// @param txOrigin Required signer of Ethereum transaction calling this function.\n    /// @param transactionSignature Proof that the transaction has been signed by the signer.\n    /// @param approvalSignatures Array of signatures that correspond to the feeRecipients of each\n    ///        order in the transaction's Exchange calldata.\n    function executeTransaction(\n        LibZeroExTransaction.ZeroExTransaction memory transaction,\n        address txOrigin,\n        bytes memory transactionSignature,\n        bytes[] memory approvalSignatures\n    )\n        public\n        payable;\n}\n"
    },
    "compiler": {
        "name": "solc",
        "version": "0.5.17+commit.d19bba13",
        "settings": {
            "remappings": [
                "@0x/contracts-exchange-libs=/home/runner/work/protocol/protocol/node_modules/@0x/contracts-exchange-libs",
                "@0x/contracts-utils=/home/runner/work/protocol/protocol/contracts/coordinator/node_modules/@0x/contracts-utils",
                "@0x/contracts-exchange=/home/runner/work/protocol/protocol/contracts/coordinator/node_modules/@0x/contracts-exchange"
            ],
            "optimizer": {
                "enabled": true,
                "runs": 1000000,
                "details": {
                    "yul": true,
                    "deduplicate": true,
                    "cse": true,
                    "constantOptimizer": true
                }
            },
            "outputSelection": {
                "*": {
                    "*": [
                        "abi",
                        "devdoc",
                        "evm.bytecode.object",
                        "evm.bytecode.sourceMap",
                        "evm.deployedBytecode.object",
                        "evm.deployedBytecode.sourceMap"
                    ]
                }
            },
            "evmVersion": "istanbul"
        }
    },
    "chains": {}
}
