elliptic-solidity
Version:
Elliptic curve implementation in solidity; includes secp256r1
436 lines • 1.61 MB
JSON
{
"contractName": "EllipticCurve",
"abi": [
{
"constant": true,
"inputs": [
{
"name": "x0",
"type": "uint256"
},
{
"name": "y0",
"type": "uint256"
}
],
"name": "toProjectivePoint",
"outputs": [
{
"name": "P",
"type": "uint256[3]"
}
],
"payable": false,
"stateMutability": "pure",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "x1",
"type": "uint256"
},
{
"name": "y1",
"type": "uint256"
},
{
"name": "x2",
"type": "uint256"
},
{
"name": "y2",
"type": "uint256"
}
],
"name": "addAndReturnProjectivePoint",
"outputs": [
{
"name": "P",
"type": "uint256[3]"
}
],
"payable": false,
"stateMutability": "pure",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "x0",
"type": "uint256"
},
{
"name": "y0",
"type": "uint256"
},
{
"name": "z0",
"type": "uint256"
}
],
"name": "toAffinePoint",
"outputs": [
{
"name": "x1",
"type": "uint256"
},
{
"name": "y1",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "pure",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "zeroProj",
"outputs": [
{
"name": "x",
"type": "uint256"
},
{
"name": "y",
"type": "uint256"
},
{
"name": "z",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "pure",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "zeroAffine",
"outputs": [
{
"name": "x",
"type": "uint256"
},
{
"name": "y",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "pure",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "x0",
"type": "uint256"
},
{
"name": "y0",
"type": "uint256"
}
],
"name": "isZeroCurve",
"outputs": [
{
"name": "isZero",
"type": "bool"
}
],
"payable": false,
"stateMutability": "pure",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "x",
"type": "uint256"
},
{
"name": "y",
"type": "uint256"
}
],
"name": "isOnCurve",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "pure",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "x0",
"type": "uint256"
},
{
"name": "y0",
"type": "uint256"
},
{
"name": "z0",
"type": "uint256"
}
],
"name": "twiceProj",
"outputs": [
{
"name": "x1",
"type": "uint256"
},
{
"name": "y1",
"type": "uint256"
},
{
"name": "z1",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "pure",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "x0",
"type": "uint256"
},
{
"name": "y0",
"type": "uint256"
},
{
"name": "z0",
"type": "uint256"
},
{
"name": "x1",
"type": "uint256"
},
{
"name": "y1",
"type": "uint256"
},
{
"name": "z1",
"type": "uint256"
}
],
"name": "addProj",
"outputs": [
{
"name": "x2",
"type": "uint256"
},
{
"name": "y2",
"type": "uint256"
},
{
"name": "z2",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "pure",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "x0",
"type": "uint256"
},
{
"name": "y0",
"type": "uint256"
},
{
"name": "x1",
"type": "uint256"
},
{
"name": "y1",
"type": "uint256"
}
],
"name": "add",
"outputs": [
{
"name": "",
"type": "uint256"
},
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "pure",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "x0",
"type": "uint256"
},
{
"name": "y0",
"type": "uint256"
}
],
"name": "twice",
"outputs": [
{
"name": "",
"type": "uint256"
},
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "pure",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "x0",
"type": "uint256"
},
{
"name": "y0",
"type": "uint256"
},
{
"name": "exp",
"type": "uint256"
}
],
"name": "multiplyPowerBase2",
"outputs": [
{
"name": "",
"type": "uint256"
},
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "pure",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "x0",
"type": "uint256"
},
{
"name": "y0",
"type": "uint256"
},
{
"name": "scalar",
"type": "uint256"
}
],
"name": "multiplyScalar",
"outputs": [
{
"name": "x1",
"type": "uint256"
},
{
"name": "y1",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "pure",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "scalar",
"type": "uint256"
}
],
"name": "multipleGeneratorByScalar",
"outputs": [
{
"name": "",
"type": "uint256"
},
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "pure",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "message",
"type": "bytes32"
},
{
"name": "rs",
"type": "uint256[2]"
},
{
"name": "Q",
"type": "uint256[2]"
}
],
"name": "validateSignature",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "pure",
"type": "function"
}
],
"bytecode": "0x608060405234801561001057600080fd5b50611c5e806100206000396000f3fe6080604052600436106100d5576000357c01000000000000000000000000000000000000000000000000000000009004806304e960d7146100da57806309d3ef31146101af5780630afb4ddc1461020f5780630b0dbcfa1461026557806314c67060146102c2578063322b24aa146102fb578063675ca04314610365578063713eca28146103cf57806372fb4a14146104645780637ec8da8d146104ce57806384dfba461461054f578063c30cfa2d14610581578063c80edca4146105de578063e022d77c1461064f578063f214aba0146106c3575b600080fd5b3480156100e657600080fd5b50610195600480360360a08110156100fd57600080fd5b810190808035906020019092919080604001906002806020026040519081016040528092919082600260200280828437600081840152601f19601f820116905080830192505050505050919291929080604001906002806020026040519081016040528092919082600260200280828437600081840152601f19601f8201169050808301925050505050509192919290505050610752565b604051808215151515815260200191505060405180910390f35b3480156101bb57600080fd5b506101f2600480360360408110156101d257600080fd5b810190808035906020019092919080359060200190929190505050610a97565b604051808381526020018281526020019250505060405180910390f35b34801561021b57600080fd5b506102486004803603602081101561023257600080fd5b8101908080359060200190929190505050610acb565b604051808381526020018281526020019250505060405180910390f35b34801561027157600080fd5b506102a86004803603604081101561028857600080fd5b810190808035906020019092919080359060200190929190505050610b22565b604051808215151515815260200191505060405180910390f35b3480156102ce57600080fd5b506102d7610d51565b60405180848152602001838152602001828152602001935050505060405180910390f35b34801561030757600080fd5b506103486004803603606081101561031e57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050610d6f565b604051808381526020018281526020019250505060405180910390f35b34801561037157600080fd5b506103b26004803603606081101561038857600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050610dcf565b604051808381526020018281526020019250505060405180910390f35b3480156103db57600080fd5b50610426600480360360808110156103f257600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190505050610e67565b6040518082600360200280838360005b83811015610451578082015181840152602081019050610436565b5050505090500191505060405180910390f35b34801561047057600080fd5b506104b16004803603606081101561048757600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050610e9c565b604051808381526020018281526020019250505060405180910390f35b3480156104da57600080fd5b50610511600480360360408110156104f157600080fd5b810190808035906020019092919080359060200190929190505050610fb2565b6040518082600360200280838360005b8381101561053c578082015181840152602081019050610521565b5050505090500191505060405180910390f35b34801561055b57600080fd5b506105646110b7565b604051808381526020018281526020019250505060405180910390f35b34801561058d57600080fd5b506105c4600480360360408110156105a457600080fd5b8101908080359060200190929190803590602001909291905050506110cb565b604051808215151515815260200191505060405180910390f35b3480156105ea57600080fd5b5061062b6004803603606081101561060157600080fd5b810190808035906020019092919080359060200190929190803590602001909291905050506110f5565b60405180848152602001838152602001828152602001935050505060405180910390f35b34801561065b57600080fd5b506106a66004803603608081101561067257600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803590602001909291905050506115c9565b604051808381526020018281526020019250505060405180910390f35b3480156106cf57600080fd5b5061072e600480360360c08110156106e657600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050611603565b60405180848152602001838152602001828152602001935050505060405180910390f35b60008083600060028110151561076457fe5b602002015114806107a857507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518360006002811015156107a057fe5b602002015110155b806107c6575060008360016002811015156107bf57fe5b6020020151145b156107d45760009050610a90565b6108048260006002811015156107e657fe5b60200201518360016002811015156107fa57fe5b6020020151610b22565b15156108135760009050610a90565b600080600080600061085888600160028110151561082d57fe5b60200201517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325516117a3565b90506108d57f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f57fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518015156108c957fe5b848d6001900409610e9c565b809450819650505061094d8760006002811015156108ef57fe5b602002015188600160028110151561090357fe5b60200201517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255180151561093257fe5b848c600060028110151561094257fe5b602002015109610e9c565b809350819550505061095d611c0f565b61096986858786610e67565b9050600081600260038110151561097c57fe5b602002015114156109965760009650505050505050610a90565b60006109d58260026003811015156109aa57fe5b60200201517fffffffff00000001000000000000000000000000ffffffffffffffffffffffff6117a3565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515610a0157fe5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515610a2b57fe5b828309836000600381101515610a3d57fe5b6020020151099050896000600281101515610a5457fe5b60200201517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255182811515610a8457fe5b06149750505050505050505b9392505050565b6000806000610aa8858560016110f5565b809350819650829750505050610abf858583610dcf565b92509250509250929050565b600080610b197f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f585610e9c565b91509150915091565b60008260001480610b5257507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b80610b5d5750816000145b80610b8757507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b15610b955760009050610d4b565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515610bc157fe5b838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515610bf257fe5b857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515610c1d57fe5b87880909905060007fffffffff00000001000000000000000000000000fffffffffffffffffffffffc141515610cc9577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515610c7757fe5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515610ca157fe5b7fffffffff00000001000000000000000000000000fffffffffffffffffffffffc8709820890505b60007f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b141515610d43577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515610d1d57fe5b7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b820890505b808214925050505b92915050565b60008060008060016000829250819150809050925092509250909192565b6000806000859050600085905060006001905060008090505b86811015610db457610d9b8484846110f5565b8094508195508296505050508080600101915050610d88565b50610dc0838383610dcf565b94509450505050935093915050565b6000806000610dfe847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff6117a3565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515610e2a57fe5b81870992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515610e5957fe5b818609915050935093915050565b610e6f611c0f565b600080610e7e878787876115c9565b8092508193505050610e908282610fb2565b92505050949350505050565b6000806000831415610eb957610eb06110b7565b91509150610faa565b6001831415610ecd57848491509150610faa565b6002831415610ee957610ee08585610a97565b91509150610faa565b600085905060008590506000600190506000600190508895508794506000600288811515610f1357fe5b061415610f2257600094508495505b600187908060020a820491505096505b6000871115610f9657610f468484846110f5565b8094508195508296505050506001600288811515610f6057fe5b061415610f8257610f75848484898986611603565b8093508197508298505050505b600187908060020a82049150509650610f32565b610fa1868683610dcf565b95509550505050505b935093915050565b610fba611c0f565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515610fe457fe5b6001600008816002600381101515610ff857fe5b6020020181815250507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561102b57fe5b81600260038110151561103a57fe5b6020020151840981600060038110151561105057fe5b6020020181815250507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561108357fe5b81600260038110151561109257fe5b602002015183098160016003811015156110a857fe5b60200201818152505092915050565b600080600080819150809050915091509091565b600080831480156110dc5750600082145b156110ea57600190506110ef565b600090505b92915050565b600080600080600080600061110a8a8a6110cb565b1561112657611117610d51565b965096509650505050506115c0565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561115057fe5b888a0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561117f57fe5b6002840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8015156111af57fe5b8a840991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8015156111de57fe5b89830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561120d57fe5b6002830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561123d57fe5b8a8b0999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561126c57fe5b60038b0993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561129c57fe5b88890997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8015156112cb57fe5b7fffffffff00000001000000000000000000000000fffffffffffffffffffffffc890997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561131a57fe5b88850893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561134957fe5b84850990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561137857fe5b8260020999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8015156113a857fe5b8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03820890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8015156113f957fe5b817fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03830899507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561144a57fe5b8a850999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561147957fe5b838a0998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8015156114a857fe5b898a0998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8015156114d757fe5b8960020998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561150757fe5b897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038b0895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561155857fe5b81840996507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561158757fe5b83840994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8015156115b657fe5b8386099450505050505b93509350939050565b60008060006115de8787600188886001611603565b8093508198508299505050506115f5878783610dcf565b925092505094509492505050565b60008060008060008060006116188d8d6110cb565b1561162f5789898996509650965050505050611797565b6116398a8a6110cb565b15611650578c8c8c96509650965050505050611797565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561167a57fe5b888d0993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8015156116a957fe5b8b8a0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8015156116d857fe5b888e0991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561170757fe5b8b8b0990508082141561174d5782841415611736576117278d8d8d6110f5565b96509650965050505050611797565b61173e610d51565b96509650965050505050611797565b6117867fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561177a57fe5b898d0983838688611859565b809750819850829950505050505050505b96509650969350505050565b6000808314806117b257508183145b806117bd5750600082145b156117cb5760009050611853565b818311156117e25781838115156117de57fe5b0692505b600080600190506000849050600086905060005b60008214151561182f57818381151561180b57fe5b049050838482028603838484028603809550819650829750839850505050506117f6565b600085121561184a5784600003870395505050505050611853565b84955050505050505b92915050565b6000806000806000806000807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561188f57fe5b8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038a0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8015156118e057fe5b8b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d0894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561193157fe5b85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561196057fe5b81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561198f57fe5b8d830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8015156119be57fe5b8c8c089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8015156119ed57fe5b848c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515611a1c57fe5b8b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03830891507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515611a6d57fe5b82860997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515611a9c57fe5b85850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515611acb57fe5b848d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515611afa57fe5b827fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515611b4b57fe5b8c820990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515611b7a57fe5b838a0998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515611ba957fe5b897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03820896507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515611bfa57fe5b8d840995505050505050955095509592505050565b60606040519081016040528060039060208202803883398082019150509050509056fea165627a7a72305820ec57280556620ccab155aa552deb02257feaa50d168b952ae4425b5a37f0a98f0029",
"deployedBytecode": "0x6080604052600436106100d5576000357c01000000000000000000000000000000000000000000000000000000009004806304e960d7146100da57806309d3ef31146101af5780630afb4ddc1461020f5780630b0dbcfa1461026557806314c67060146102c2578063322b24aa146102fb578063675ca04314610365578063713eca28146103cf57806372fb4a14146104645780637ec8da8d146104ce57806384dfba461461054f578063c30cfa2d14610581578063c80edca4146105de578063e022d77c1461064f578063f214aba0146106c3575b600080fd5b3480156100e657600080fd5b50610195600480360360a08110156100fd57600080fd5b810190808035906020019092919080604001906002806020026040519081016040528092919082600260200280828437600081840152601f19601f820116905080830192505050505050919291929080604001906002806020026040519081016040528092919082600260200280828437600081840152601f19601f8201169050808301925050505050509192919290505050610752565b604051808215151515815260200191505060405180910390f35b3480156101bb57600080fd5b506101f2600480360360408110156101d257600080fd5b810190808035906020019092919080359060200190929190505050610a97565b604051808381526020018281526020019250505060405180910390f35b34801561021b57600080fd5b506102486004803603602081101561023257600080fd5b8101908080359060200190929190505050610acb565b604051808381526020018281526020019250505060405180910390f35b34801561027157600080fd5b506102a86004803603604081101561028857600080fd5b810190808035906020019092919080359060200190929190505050610b22565b604051808215151515815260200191505060405180910390f35b3480156102ce57600080fd5b506102d7610d51565b60405180848152602001838152602001828152602001935050505060405180910390f35b34801561030757600080fd5b506103486004803603606081101561031e57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050610d6f565b604051808381526020018281526020019250505060405180910390f35b34801561037157600080fd5b506103b26004803603606081101561038857600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050610dcf565b604051808381526020018281526020019250505060405180910390f35b3480156103db57600080fd5b50610426600480360360808110156103f257600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190505050610e67565b6040518082600360200280838360005b83811015610451578082015181840152602081019050610436565b5050505090500191505060405180910390f35b34801561047057600080fd5b506104b16004803603606081101561048757600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050610e9c565b604051808381526020018281526020019250505060405180910390f35b3480156104da57600080fd5b50610511600480360360408110156104f157600080fd5b810190808035906020019092919080359060200190929190505050610fb2565b6040518082600360200280838360005b8381101561053c578082015181840152602081019050610521565b5050505090500191505060405180910390f35b34801561055b57600080fd5b506105646110b7565b604051808381526020018281526020019250505060405180910390f35b34801561058d57600080fd5b506105c4600480360360408110156105a457600080fd5b8101908080359060200190929190803590602001909291905050506110cb565b604051808215151515815260200191505060405180910390f35b3480156105ea57600080fd5b5061062b6004803603606081101561060157600080fd5b810190808035906020019092919080359060200190929190803590602001909291905050506110f5565b60405180848152602001838152602001828152602001935050505060405180910390f35b34801561065b57600080fd5b506106a66004803603608081101561067257600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803590602001909291905050506115c9565b604051808381526020018281526020019250505060405180910390f35b3480156106cf57600080fd5b5061072e600480360360c08110156106e657600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050611603565b60405180848152602001838152602001828152602001935050505060405180910390f35b60008083600060028110151561076457fe5b602002015114806107a857507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518360006002811015156107a057fe5b602002015110155b806107c6575060008360016002811015156107bf57fe5b6020020151145b156107d45760009050610a90565b6108048260006002811015156107e657fe5b60200201518360016002811015156107fa57fe5b6020020151610b22565b15156108135760009050610a90565b600080600080600061085888600160028110151561082d57fe5b60200201517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325516117a3565b90506108d57f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f57fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518015156108c957fe5b848d6001900409610e9c565b809450819650505061094d8760006002811015156108ef57fe5b602002015188600160028110151561090357fe5b60200201517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255180151561093257fe5b848c600060028110151561094257fe5b602002015109610e9c565b809350819550505061095d611c0f565b61096986858786610e67565b9050600081600260038110151561097c57fe5b602002015114156109965760009650505050505050610a90565b60006109d58260026003811015156109aa57fe5b60200201517fffffffff00000001000000000000000000000000ffffffffffffffffffffffff6117a3565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515610a0157fe5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515610a2b57fe5b828309836000600381101515610a3d57fe5b6020020151099050896000600281101515610a5457fe5b60200201517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255182811515610a8457fe5b06149750505050505050505b9392505050565b6000806000610aa8858560016110f5565b809350819650829750505050610abf858583610dcf565b92509250509250929050565b600080610b197f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f585610e9c565b91509150915091565b60008260001480610b5257507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b80610b5d5750816000145b80610b8757507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b15610b955760009050610d4b565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515610bc157fe5b838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515610bf257fe5b857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515610c1d57fe5b87880909905060007fffffffff00000001000000000000000000000000fffffffffffffffffffffffc141515610cc9577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515610c7757fe5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515610ca157fe5b7fffffffff00000001000000000000000000000000fffffffffffffffffffffffc8709820890505b60007f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b141515610d43577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515610d1d57fe5b7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b820890505b808214925050505b92915050565b60008060008060016000829250819150809050925092509250909192565b6000806000859050600085905060006001905060008090505b86811015610db457610d9b8484846110f5565b8094508195508296505050508080600101915050610d88565b50610dc0838383610dcf565b94509450505050935093915050565b6000806000610dfe847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff6117a3565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515610e2a57fe5b81870992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515610e5957fe5b818609915050935093915050565b610e6f611c0f565b600080610e7e878787876115c9565b8092508193505050610e908282610fb2565b92505050949350505050565b6000806000831415610eb957610eb06110b7565b91509150610faa565b6001831415610ecd57848491509150610faa565b6002831415610ee957610ee08585610a97565b91509150610faa565b600085905060008590506000600190506000600190508895508794506000600288811515610f1357fe5b061415610f2257600094508495505b600187908060020a820491505096505b6000871115610f9657610f468484846110f5565b8094508195508296505050506001600288811515610f6057fe5b061415610f8257610f75848484898986611603565b8093508197508298505050505b600187908060020a82049150509650610f32565b610fa1868683610dcf565b95509550505050505b935093915050565b610fba611c0f565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515610fe457fe5b6001600008816002600381101515610ff857fe5b6020020181815250507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561102b57fe5b81600260038110151561103a57fe5b6020020151840981600060038110151561105057fe5b6020020181815250507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561108357fe5b81600260038110151561109257fe5b602002015183098160016003811015156110a857fe5b60200201818152505092915050565b600080600080819150809050915091509091565b600080831480156110dc5750600082145b156110ea57600190506110ef565b600090505b92915050565b600080600080600080600061110a8a8a6110cb565b1561112657611117610d51565b965096509650505050506115c0565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561115057fe5b888a0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561117f57fe5b6002840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8015156111af57fe5b8a840991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8015156111de57fe5b89830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561120d57fe5b6002830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561123d57fe5b8a8b0999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561126c57fe5b60038b0993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561129c57fe5b88890997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8015156112cb57fe5b7fffffffff00000001000000000000000000000000fffffffffffffffffffffffc890997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561131a57fe5b88850893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561134957fe5b84850990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561137857fe5b8260020999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8015156113a857fe5b8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03820890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8015156113f957fe5b817fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03830899507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561144a57fe5b8a850999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561147957fe5b838a0998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8015156114a857fe5b898a0998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8015156114d757fe5b8960020998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561150757fe5b897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038b0895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561155857fe5b81840996507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561158757fe5b83840994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8015156115b657fe5b8386099450505050505b93509350939050565b60008060006115de8787600188886001611603565b8093508198508299505050506115f5878783610dcf565b925092505094509492505050565b60008060008060008060006116188d8d6110cb565b1561162f5789898996509650965050505050611797565b6116398a8a6110cb565b15611650578c8c8c96509650965050505050611797565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561167a57fe5b888d0993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8015156116a957fe5b8b8a0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8015156116d857fe5b888e0991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561170757fe5b8b8b0990508082141561174d5782841415611736576117278d8d8d6110f5565b96509650965050505050611797565b61173e610d51565b96509650965050505050611797565b6117867fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561177a57fe5b898d0983838688611859565b809750819850829950505050505050505b96509650969350505050565b6000808314806117b257508183145b806117bd5750600082145b156117cb5760009050611853565b818311156117e25781838115156117de57fe5b0692505b600080600190506000849050600086905060005b60008214151561182f57818381151561180b57fe5b049050838482028603838484028603809550819650829750839850505050506117f6565b600085121561184a5784600003870395505050505050611853565b84955050505050505b92915050565b6000806000806000806000807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561188f57fe5b8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038a0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8015156118e057fe5b8b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d0894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561193157fe5b85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561196057fe5b81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80151561198f57fe5b8d830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8015156119be57fe5b8c8c089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8015156119ed57fe5b848c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515611a1c57fe5b8b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03830891507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515611a6d57fe5b82860997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515611a9c57fe5b85850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515611acb57fe5b848d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515611afa57fe5b827fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515611b4b57fe5b8c820990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515611b7a57fe5b838a0998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515611ba957fe5b897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03820896507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff801515611bfa57fe5b8d840995505050505050955095509592505050565b60606040519081016040528060039060208202803883398082019150509050509056fea165627a7a72305820ec57280556620ccab155aa552deb02257feaa50d168b952ae4425b5a37f0a98f0029",
"sourceMap": "537:9550:1:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;537:9550:1;;;;;;;",
"deployedSourceMap": "537:9550:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9178:907;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9178:907:1;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;9178:907:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;9178:907:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;9178:907:1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;7241:191;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7241:191:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;7241:191:1;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;8937:147;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8937:147:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;8937:147:1;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;3477:481;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3477:481:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3477:481:1;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;2843:110;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2843:110:1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7537:365;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7537:365:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;7537:365:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;2527:233;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2527:233:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2527:233:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;2206:238;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2206:238:1;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;2206:238:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;2206:238:1;;;;;;;;;;;;;;;;7982:871;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7982:871:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;7982:871:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;1899:207;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1899:207:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1899:207:1;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;1899:207:1;;;;;;;;;;;;;;;;3032:101;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3032:101:1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;3205:182;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3205:182:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3205:182:1;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;4144:938;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4144:938:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;4144:938:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6937:216;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6937:216:1;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;6937:216:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;5267:758;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5267:758:1;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;5267:758:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9178:907;9288:4;9401:1;9392:2;9395:1;9392:5;;;;;;;;;;;;;:10;:24;;;;1070:66;9406:2;9409:1;9406:5;;;;;;;;;;;;;:10;;9392:24;:38;;;;9429:1;9420:2;9423:1;9420:5;;;;;;;;;;;;;:10;9392:38;9389:102;;;9475:5;9468:12;;;;9389:102;9505:21;9515:1;9517;9515:4;;;;;;;;;;;;;9521:1;9523;9521:4;;;;;;;;;;;;;9505:9;:21::i;:::-;9504:22;9500:65;;;9549:5;9542:12;;;;9500:65;9575:7;9592;9609;9626;9644:9;9656:20;9667:2;9670:1;9667:5;;;;;;;;;;;;;1070:66;9656:10;:20::i;:::-;9644:32;;9697:54;799:66;890;1070;9720:30;;;;;;;9742:4;9732:7;9727:13;;;9720:30;9697:14;:54::i;:::-;9686:65;;;;;;;;9772:50;9787:1;9789;9787:4;;;;;;;;;;;;;9793:1;9795;9793:4;;;;;;;;;;;;;1070:66;9799:22;;;;;;;9813:4;9806:2;9809:1;9806:5;;;;;;;;;;;;;9799:22;9772:14;:50::i;:::-;9761:61;;;;;;;;9832:16;;:::i;:::-;9851:43;9879:2;9883;9887;9891;9851:27;:43::i;:::-;9832:62;;9917:1;9909;9911;9909:4;;;;;;;;;;;;;:9;9905:52;;;9941:5;9934:12;;;;;;;;;;9905:52;9967:7;9977:19;9988:1;9990;9988:4;;;;;;;;;;;;;980:66;9977:10;:19::i;:::-;9967:29;;980:66;10011:34;;;;;;;980:66;10024:17;;;;;;;10035:2;10031;10024:17;10018:1;10020;10018:4;;;;;;;;;;;;;10011:34;10006:39;;10073:2;10076:1;10073:5;;;;;;;;;;;;;1070:66;10063:2;:6;;;;;;;;:15;10056:22;;;;;;;;;9178:907;;;;;;:::o;7241:191::-;7303:4;7309;7329:7;7362:20;7372:2;7376;7380:1;7362:9;:20::i;:::-;7347:35;;;;;;;;;;;;7400:25;7414:2;7418;7422;7400:13;:25::i;:::-;7393:32;;;;;7241:191;;;;;:::o;8937:147::-;9014:4;9020;9047:30;799:66;890;9070:6;9047:14;:30::i;:::-;9040:37;;;;8937:147;;;:::o;3477:481::-;3541:4;3570:1;3565;:6;:16;;;;980:66;3575:1;:6;3565:16;:26;;;;3590:1;3585;:6;3565:26;:36;;;;980:66;3595:1;:6;3565:36;3561:79;;;3624:5;3617:12;;;;3561:79;3650:8;980:66;3661:15;;;;;;;3671:1;3668;3661:15;3650:26;;3693:8;980:66;3704:29;;;;;;;3728:1;980:66;3711:15;;;;;;;3721:1;3718;3711:15;3704:29;3693:40;;3760:1;618:66;3755:6;;3751:87;;;980:66;3783:31;;;;;;;980:66;3795:15;;;;;;;618:66;3802:1;3795:15;3790:3;3783:31;3777:37;;3751:87;3856:1;708:66;3851:6;;3847:77;;;980:66;3879:17;;;;;;;708:66;3886:3;3879:17;3873:23;;3847:77;3948:3;3941;:10;3934:17;;;;3477:481;;;;;:::o;2843:110::-;2892:6;2900;2908;2938:1;2941;2944;2930:16;;;;;;;;;;;;;;;2843:110;;;:::o;7537:365::-;7622:4;7628;7648:11;7662:2;7648:16;;7674:11;7688:2;7674:16;;7700:11;7714:1;7700:15;;7730:6;7739:1;7730:10;;7726:115;7746:3;7742:1;:7;7726:115;;;7797:33;7807:6;7815;7823;7797:9;:33::i;:::-;7770:60;;;;;;;;;;;;7751:3;;;;;;;7726:115;;;;7858:37;7872:6;7880;7888;7858:13;:37::i;:::-;7851:44;;;;;;;7537:365;;;;;;:::o;2527:233::-;2606:7;2615;2638:10;2666:17;2677:2;980:66;2666:10;:17::i;:::-;2658:25;;980:66;2698:20;;;;;;;2709:5;2705:2;2698:20;2693:25;;980:66;2733:20;;;;;;;2744:5;2740:2;2733:20;2728:25;;2527:233;;;;;;;:::o;2206:238::-;2308:16;;:::i;:::-;2340:6;2356;2381:19;2385:2;2389;2393;2397;2381:3;:19::i;:::-;2372:28;;;;;;;;2414:23;2432:1;2435;2414:17;:23::i;:::-;2410:27;;2206:238;;;;;;;;:::o;7982:871::-;8066:7;8075;8111:1;8101:6;:11;8098:207;;;8135:12;:10;:12::i;:::-;8128:19;;;;;;8098:207;8186:1;8176:6;:11;8172:133;;;8211:2;8215;8203:15;;;;;;8172:133;8257:1;8247:6;:11;8243:62;;;8281:13;8287:2;8291;8281:5;:13::i;:::-;8274:20;;;;;;8243:62;8315:11;8329:2;8315:16;;8341:11;8355:2;8341:16;;8367:11;8381:1;8367:15;;8392:7;8402:1;8392:11;;8418:2;8413:7;;8435:2;8430:7;;8463:1;8458;8451:6;:8;;;;;;;;:13;8448:54;;;8490:1;8485:6;;;8480:11;;8448:54;8531:1;8521:6;:11;52:12:-1;49:1;45:20;29:14;25:41;7:59;;8521:11:1;8512:20;;8543:261;8558:1;8549:6;:10;8543:261;;;8602:33;8612:6;8620;8628;8602:9;:33::i;:::-;8575:60;;;;;;;;;;;;8665:1;8660;8653:6;:8;;;;;;;;:13;8650:109;;;8701:43;8709:6;8717;8725;8733:2;8737;8741;8701:7;:43::i;:::-;8686:58;;;;;;;;;;;;8650:109;8792:1;8782:6;:11;52:12:-1;49:1;45:20;29:14;25:41;7:59;;8782:11:1;8773:20;;8543:261;;;8821:25;8835:2;8839;8843;8821:13;:25::i;:::-;8814:32;;;;;;;;7982:871;;;;;;;:::o;1899:207::-;1973:16;;:::i;:::-;980:66;2012:15;;;;;;;2022:1;2019;2012:15;2005:1;2007;2005:4;;;;;;;;;;;;:22;;;;;980:66;2044:19;;;;;;;2055:1;2057;2055:4;;;;;;;;;;;;;2051:2;2044:19;2037:1;2039;2037:4;;;;;;;;;;;;:26;;;;;980:66;2080:19;;;;;;;2091:1;2093;2091:4;;;;;;;;;;;;;2087:2;2080:19;2073:1;2075;2073:4;;;;;;;;;;;;:26;;;;;1899:207;;;;:::o;3032:101::-;3083:6;3091;3121:1;3124;3113:13;;;;;;;;;;3032:101;;:::o;3205:182::-;3273:11;3309:1;3303:2;:7;:18;;;;;3320:1;3314:2;:7;3303:18;3300:59;;;3344:4;3337:11;;;;3300:59;3375:5;3368:12;;3205:182;;;;;:::o;4144:938::-;4219:7;4228;4237;4260:6;4276;4292;4308;4328:19;4340:2;4344;4328:11;:19::i;:::-;4325:66;;;4370:10;:8;:10::i;:::-;4363:17;;;;;;;;;;;;4325:66;980;4405:17;;;;;;;4416:2;4412;4405:17;4401:21;;980:66;4436:15;;;;;;;4446:1;4443;4436:15;4432:19;;980:66;4466:16;;;;;;;4476:2;4473:1;4466:16;4462:20;;980:66;4496:16;;;;;;;4506:2;4503:1;4496:16;4492:20;;980:66;4526:15;;;;;;;4536:1;4533;4526:15;4522:19;;980:66;4557:17;;;;;;;4568:2;4564;4557:17;4552:22;;980:66;4588:16;;;;;;;4599:1;4595:2;4588:16;4584:20;;980:66;4620:17;;;;;;;4631:2;4627;4620:17;4615:22;;980:66;4652:16;;;;;;;618:66;4659:2;4652:16;4647:21;;980:66;4682:16;;;;;;;4692:2;4689:1;4682:16;4678:20;;980:66;4713:15;;;;;;;4723:1;4720;4713:15;4709:19;;980:66;4743:15;;;;;;;4753:1;4750;4743:15;4738:20;;980:66;4772:18;;;;;;;4784:2;980:66;4782:4;4779:1;4772:18;4768:22;;980:66;4806:17;;;;;;;4818:1;980:66;4816:3;4813:1;4806:17;4801:22;;980:66;4838:16;;;;;;;4848:2;4845:1;4838:16;4833:21;;980:66;4869:16;;;;;;;4880:1;4876:2;4869:16;4864:21;;980:66;4900:17;;;;;;;4911:2;4907;4900:17;4895:22;;980:66;4932:16;;;;;;;4942:2;4939:1;4932:16;4927:21;;980:66;4963:19;;;;;;;4976:2;980:66;4974:4;4970:2;4963:19;4958:24;;980:66;4998:15;;;;;;;5008:1;5005;4998:15;4993:20;;980:66;5029:15;;;;;;;5039:1;5036;5029:15;5024:20;;980:66;5059:16;;;;;;;5070:1;5066:2;5059:16;5054:21;;4144:938;;;;;;;;;;;;:::o;6937:216::-;7015:4;7021;7041:7;7074:29;7082:2;7086;7090:1;7093:2;7097;7101:1;7074:7;:29::i;:::-;7059:44;;;;;;;;;;;;7121:25;7135:2;7139;7143;7121:13;:25::i;:::-;7114:32;;;;;6937:216;;;;;;;:::o;5267:758::-;5367:7;5376;5385;5408;5425;5442;5459;5481:19;5493:2;5497;5481:11;:19::i;:::-;5477:152;;;5524:2;5528;5532;5516:19;;;;;;;;;;;;5477:152;5564:19;5576:2;5580;5564:11;:19::i;:::-;5560:69;;;5607:2;5611;5615;5599:19;;;;;;;;;;;;5560:69;980:66;5644:17;;;;;;;5655:2;5651;5644:17;5639:22;;980:66;5676:17;;;;;;;5687:2;5683;5676:17;5671:22;;980:66;5709:17;;;;;;;5720:2;5716;5709:17;5704:22;;980:66;5741:17;;;;;;;5752:2;5748;5741:17;5736:22;;5779:2;5773;:8;5769:181;;;5807:2;5801;:8;5797:143;;;5836:21;5846:2;5850;5854;5836:9;:21::i;:::-;5829:28;;;;;;;;;;;;5797:143;5915:10;:8;:10::i;:::-;5908:17;;;;;;;;;;;;5769:181;5975:43;980:66;5984:17;;;;;;;5995:2;5991;5984:17;6003:2;6007;6011;6015;5975:8;:43::i;:::-;5960:58;;;;;;;;;;;;5267:758;;;;;;;;;;;;;;;:::o;1307:500::-;1374:4;1403:1;1398;:6;:16;;;;1413:1;1408;:6;1398:16;:26;;;;1423:1;1418;:6;1398:26;1394:52;;;1445:1;1438:8;;;;1394:52;1464:1;1460;:5;1456:32;;;1487:1;1483;:5;;;;;;;;1479:9;;1456:32;1499:6;1515;1524:1;1515:10;;1535:7;1545:1;1535:11;;1556:7;1566:1;1556:11;;1577:6;1594:124;1607:1;1601:2;:7;;1594:124;;;1633:2;1628;:7;;;;;;;;1624:11;;1669:2;1687;1682:1;1678:11;1673:2;:16;1691:2;1704;1700:1;:6;1695:2;:11;1649:58;;;;;;;;;;;;;;;;1594:124;;;1737:1;1732:2;:6;1728:46;;;1770:2;1769:3;;1760:1;:13;1752:22;;;;;;;;;1728:46;1797:2;1785:15;;;;;;;1307:500;;;;;:::o;6130:720::-;6222:7;6231;6240;6263:6;6279:7;6296;6313:6;6329;980:66;6350:19;;;;;;;6363:2;980:66;6361:4;6357:2;6350:19;6346:23;;980:66;6383:19;;;;;;;6396:2;980:66;6394:4;6390:2;6383:19;6379:23;;980:66;6417:15;;;;;;;6427:1;6424;6417:15;6412:20;;980:66;6447:15;;;;;;;6457:1;6454;6447:15;6443:19;;980:66;6476:15;;;;;;;6486:1;6483;6476:15;6472:19;;980:66;6506:17;;;;;;;6517:2;6513;6506:17;6501:22;;980:66;6538:17;;;;;;;6549:2;6545;6538:17;6533:22;;980:66;6569:18;;;;;;;6581:2;980:66;6579:4;6576:1;6569:18;6565:22;;980:66;6603:15;;;;;;;6613:1;6610;6603:15;6598:20;;980:66;6634:16;;;;;;;6645:1;6641:2;6634:16;6629:21;;980:66;6665:17;;;;;;;6676:2;6672;6665:17;6660:22;;980:66;6697:18;;;;;;;6710:1;980:66;6708:3;6704:2;6697:18;6692:23;;980:66;6729:16;;;;;;;6739:2;6736:1;6729:16;6725:20;;980:66;6760:17;;;;;;;6771:2;6767;6760:17;6755:22;;980:66;6793:18;;;;;;;6805:2;980:66;6803:4;6800:1;6793:18;6788:23;;980:66;6827:16;;;;;;;6838:1;6834:2;6827:16;6822:21;;6130:720;;;;;;;;;;;;;;:::o;537:9550::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;537:9550:1;;;;:::o",
"source": "pragma solidity ^0.5.0;\n\n/**\n * @title EllipticCurve\n *\n * @author Tilman Drerup;\n *\n * @notice Implements elliptic curve math; Parametrized for SECP256R1.\n *\n * Includes components of code by Andreas Olofsson, Alexander Vlasov\n * (https://github.com/BANKEX/CurveArithmetics), and Avi Asayag\n * (https://github.com/orbs-network/elliptic-curve-solidity)\n *\n * @dev NOTE: To disambiguate public keys when verifying signatures, activate\n * condition 'rs[1] > lowSmax' in validateSignature().\n */\ncontract EllipticCurve {\n\n // Set parameters for curve.\n uint constant a = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\n uint constant b = 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\n uint constant gx = 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\n uint constant gy = 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\n uint constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\n uint constant n = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551;\n\n uint constant lowSmax = 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0;\n\n /**\n * @dev Inverse of u in the field of modulo m.\n */\n function inverseMod(uint u, uint m) internal pure\n returns (uint)\n {\n if (u