From 99e3f407fe24d4f3557768f0fb8dfb36bc947c47 Mon Sep 17 00:00:00 2001 From: Austin Abell Date: Mon, 30 Sep 2024 17:20:50 -0400 Subject: [PATCH] Implement feature to use pre-built docker ELF --- .dockerignore | 4 +++- cli/Cargo.toml | 3 +++ contracts/artifacts/Blobstream0.json | 12 ++++++------ contracts/src/ImageID.sol | 2 +- core/Cargo.toml | 3 +++ core/src/lib.rs | 11 ++++++++++- dockerfiles/blobstream0.Dockerfile | 2 +- light-client-guest/Cargo.toml | 5 ++++- light-client-guest/build.rs | 6 ++++++ light-client-guest/src/lib.rs | 1 + 10 files changed, 38 insertions(+), 11 deletions(-) diff --git a/.dockerignore b/.dockerignore index 7e6c1de..4d9a196 100644 --- a/.dockerignore +++ b/.dockerignore @@ -3,5 +3,7 @@ target/ .env contracts/cache -contracts/out dockerfiles + +# Docker build ignored, to allow overriding the dockerized service with the deterministic build. +!target/riscv-guest/riscv32im-risc0-zkvm-elf/docker/light_client_guest/light-client-guest \ No newline at end of file diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 2ca06c8..5b592de 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -24,3 +24,6 @@ reqwest = "0.12.4" serde = { workspace = true } serde_json = "1.0" serde_with = { version = "3.8", features = ["base64"] } + +[features] +prebuilt-docker = ["blobstream0-core/prebuilt-docker"] diff --git a/contracts/artifacts/Blobstream0.json b/contracts/artifacts/Blobstream0.json index 58eed45..c00ad21 100644 --- a/contracts/artifacts/Blobstream0.json +++ b/contracts/artifacts/Blobstream0.json @@ -560,7 +560,7 @@ ], "bytecode": { "linkReferences": {}, - "object": "0x60a06040523060805234801561001457600080fd5b50608051611bf961003e60003960008181610b9101528181610bba0152610d000152611bf96000f3fe60806040526004361061011f5760003560e01c8063a7e47629116100a0578063e30c397811610064578063e30c397814610331578063e405bbc314610346578063e6679c2614610366578063ef3f7dd514610386578063f2fde38b1461039c57600080fd5b8063a7e476291461027d578063ad3cb1cc1461029d578063c532514b146102db578063ce0bb7e4146102fb578063d86ba0e21461031157600080fd5b80636c4f6ba9116100e75780636c4f6ba9146101f0578063715018a61461020657806379ba50971461021b5780637eeb1c67146102305780638da5cb5b1461026857600080fd5b80631f3302a91461012457806323a4608b146101595780632b7ac3f31461017b5780634f1ef286146101ba57806352d1902d146101cd575b600080fd5b34801561013057600080fd5b5061014461013f366004611611565b6103bc565b60405190151581526020015b60405180910390f35b34801561016557600080fd5b5061017961017436600461174e565b610429565b005b34801561018757600080fd5b506000546101a290600160401b90046001600160a01b031681565b6040516001600160a01b039091168152602001610150565b6101796101c836600461178f565b610459565b3480156101d957600080fd5b506101e2610478565b604051908152602001610150565b3480156101fc57600080fd5b506101e260045481565b34801561021257600080fd5b50610179610495565b34801561022757600080fd5b506101796104a9565b34801561023c57600080fd5b50600054610250906001600160401b031681565b6040516001600160401b039091168152602001610150565b34801561027457600080fd5b506101a26104f6565b34801561028957600080fd5b50610179610298366004611836565b61052b565b3480156102a957600080fd5b506102ce604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101509190611873565b3480156102e757600080fd5b506101796102f63660046118ee565b610538565b34801561030757600080fd5b506101e260025481565b34801561031d57600080fd5b5061017961032c366004611959565b6107ce565b34801561033d57600080fd5b506101a261096c565b34801561035257600080fd5b50600354610250906001600160401b031681565b34801561037257600080fd5b506101796103813660046119bb565b610995565b34801561039257600080fd5b506101e260015481565b3480156103a857600080fd5b506101796103b73660046119bb565b6109ce565b60008315806103cd57506002548410155b156103da57506000610422565b600084815260056020908152604080832054815187518185015292870151838301528151808403830181526060909301909152919061041c9083908690610a53565b50925050505b9392505050565b610431610b54565b6004919091556003805467ffffffffffffffff19166001600160401b03909216919091179055565b610461610b86565b61046a82610c2b565b6104748282610c33565b5050565b6000610482610cf5565b50600080516020611ba483398151915290565b61049d610b54565b6104a76000610d3e565b565b33806104b361096c565b6001600160a01b0316146104ea5760405163118cdaa760e01b81526001600160a01b03821660048201526024015b60405180910390fd5b6104f381610d3e565b50565b6000807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b546001600160a01b031692915050565b610533610b54565b600155565b6000610546848601866119d8565b600054600354919250610565916001600160401b039182169116611a62565b6001600160401b031681602001516001600160401b03161161059a5760405163145ce5ff60e11b815260040160405180910390fd5b6004548151146105bd576040516352c6046360e01b815260040160405180910390fd5b600060089054906101000a90046001600160a01b03166001600160a01b031663ab750e75848460015460028a8a6040516105f8929190611a82565b602060405180830381855afa158015610615573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906106389190611a92565b6040518563ffffffff1660e01b81526004016106579493929190611aab565b60006040518083038186803b15801561066f57600080fd5b505afa158015610683573d6000803e3d6000fd5b50505060608201516020808401516003546002546040519081529394506001600160401b03918216939116917f34dd3689f5bd77a60a3ff2e09483dcab032fa2f1fd7227af3e24bed21beab1cb910160405180910390a46003546020828101516080840151604080516001600160401b03958616815294909216928401929092528201527f034c7608fd99db72330fdb1bcf6386af42ee9b6125664743942b942a8df4a3519060600160405180910390a16020818101516003805467ffffffffffffffff19166001600160401b03909216918217905560408084015160048190558151928352928201929092527f292f5abc3167175400fca463fa99530cda826ec53ec5eb1f3a2776006dacd75d910160405180910390a16060810151600280546000908152600560205260408120929092558054916107c283611aeb565b91905055505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03166000811580156108135750825b90506000826001600160401b0316600114801561082f5750303b155b90508115801561083d575080155b1561085b5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561088557845460ff60401b1916600160401b1785555b61088e8a610d76565b610896610d87565b61089e610d87565b6000805460048a90556003805467ffffffffffffffff199081166001600160401b038c8116919091179092557f4383189e399cb4bb64bc8b77fbaefcfe4c3c6472867bdd61de5eb1d4334a34c660019081556001600160e01b0319909316600160401b6001600160a01b038f16029091161790891617909155600255831561096057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050565b6000807f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0061051b565b61099d610b54565b600080546001600160a01b03909216600160401b0268010000000000000000600160e01b0319909216919091179055565b6109d6610b54565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b0319166001600160a01b0383169081178255610a1a6104f6565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b6000806001846040015111610a7b5783515115610a765750600090506001610b4c565b610aa1565b610a8d84602001518560400151610d8f565b84515114610aa15750600090506001610b4c565b8360400151846020015110610abc5750600090506002610b4c565b6000610ac784610e2d565b855151909150600003610afa578460400151600103610aed578514915060009050610b4c565b6000809250925050610b4c565b600080610b1587602001518860400151858a60000151610ea2565b90925090506000816005811115610b2e57610b2e611b04565b14610b4157600094509250610b4c915050565b508614925060009150505b935093915050565b33610b5d6104f6565b6001600160a01b0316146104a75760405163118cdaa760e01b81523360048201526024016104e1565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610c0d57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610c01600080516020611ba4833981519152546001600160a01b031690565b6001600160a01b031614155b156104a75760405163703e46dd60e11b815260040160405180910390fd5b6104f3610b54565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610c8d575060408051601f3d908101601f19168201909252610c8a91810190611a92565b60015b610cb557604051634c9c8ce360e01b81526001600160a01b03831660048201526024016104e1565b600080516020611ba48339815191528114610ce657604051632a87526960e21b8152600481018290526024016104e1565b610cf0838361102c565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104a75760405163703e46dd60e11b815260040160405180910390fd5b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b031916815561047482611082565b610d7e6110f3565b6104f38161113c565b6104a76110f3565b600060018211610da157506000610e27565b610daa8261116e565b610db690610100611b1a565b90506000610dc5600183611b1a565b6001901b9050600181610dd89190611b1a565b8411610de45750610e27565b80600103610df6576001915050610e27565b610e12610e038286611b1a565b610e0d8386611b1a565b610d8f565b610e1d906001611b2d565b915050610e27565b505b92915050565b60006002600060f81b83604051602001610e48929190611b40565b60408051601f1981840301815290829052610e6291611b71565b602060405180830381855afa158015610e7f573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610e279190611a92565b60008084600003610eb857508290506003611023565b84600103610edd57825115610ed257508290506004611023565b508290506000611023565b8251600003610ef157508290506005611023565b6000610efc8661119b565b90506000610f1985600060018851610f149190611b1a565b6111dc565b9050600082891015610f9d576000610f338a858a86610ea2565b925090506000826005811115610f4b57610f4b611b04565b14610f5e57508694509250611023915050565b610f8e818860018a51610f719190611b1a565b81518110610f8157610f81611b8d565b6020026020010151611361565b60009550955050505050611023565b6000610fbd610fac858c611b1a565b610fb6868c611b1a565b8a86610ea2565b925090506000826005811115610fd557610fd5611b04565b14610fe857508694509250611023915050565b6110188760018951610ffa9190611b1a565b8151811061100a5761100a611b8d565b602002602001015182611361565b600095509550505050505b94509492505050565b611035826113df565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561107a57610cf08282611444565b6104746114ba565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166104a757604051631afcd79f60e31b815260040160405180910390fd5b6111446110f3565b6001600160a01b0381166104ea57604051631e4fbdf760e01b8152600060048201526024016104e1565b60005b81816001901b101561118f57611188600182611b2d565b9050611171565b610e2781610100611b1a565b600060018210156111ab57600080fd5b60006111b6836114d9565b905060006111c5600183611b1a565b6001901b90508381036104225760011c9392505050565b6060818311156112415760405162461bcd60e51b815260206004820152602a60248201527f496e76616c69642072616e67653a205f626567696e2069732067726561746572604482015269081d1a185b8817d95b9960b21b60648201526084016104e1565b83518311806112505750835182115b156112b55760405162461bcd60e51b815260206004820152602f60248201527f496e76616c69642072616e67653a205f626567696e206f72205f656e6420617260448201526e65206f7574206f6620626f756e647360881b60648201526084016104e1565b60006112c18484611b1a565b6001600160401b038111156112d8576112d8611581565b604051908082528060200260200182016040528015611301578160200160208202803683370190505b509050835b838110156113585785818151811061132057611320611b8d565b60200260200101518286836113359190611b1a565b8151811061134557611345611b8d565b6020908102919091010152600101611306565b50949350505050565b604051600160f81b6020820152602181018390526041810182905260009060029060610160408051601f198184030181529082905261139f91611b71565b602060405180830381855afa1580156113bc573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906104229190611a92565b806001600160a01b03163b60000361141557604051634c9c8ce360e01b81526001600160a01b03821660048201526024016104e1565b600080516020611ba483398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516114619190611b71565b600060405180830381855af49150503d806000811461149c576040519150601f19603f3d011682016040523d82523d6000602084013e6114a1565b606091505b50915091506114b18583836114fc565b95945050505050565b34156104a75760405163b398979f60e01b815260040160405180910390fd5b6000805b8215610e2757806114ed81611aeb565b915050600183901c92506114dd565b6060826115115761150c82611558565b610422565b815115801561152857506001600160a01b0384163b155b1561155157604051639996b31560e01b81526001600160a01b03851660048201526024016104e1565b5080610422565b8051156115685780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156115b9576115b9611581565b60405290565b604051606081016001600160401b03811182821017156115b9576115b9611581565b604051601f8201601f191681016001600160401b038111828210171561160957611609611581565b604052919050565b6000806000838503608081121561162757600080fd5b8435935060206040601f198301121561163f57600080fd5b611647611597565b8682013581526040870135828201529350606086013591506001600160401b038083111561167457600080fd5b918601916060838903121561168857600080fd5b6116906115bf565b83358281111561169f57600080fd5b8401601f81018a136116b057600080fd5b8035838111156116c2576116c2611581565b8060051b93506116d38585016115e1565b818152938201850193858101908c8611156116ed57600080fd5b928601925b8584101561170b578335825292860192908601906116f2565b80855250505050828401358382015260408401356040820152809450505050509250925092565b80356001600160401b038116811461174957600080fd5b919050565b6000806040838503121561176157600080fd5b8235915061177160208401611732565b90509250929050565b6001600160a01b03811681146104f357600080fd5b600080604083850312156117a257600080fd5b82356117ad8161177a565b91506020838101356001600160401b03808211156117ca57600080fd5b818601915086601f8301126117de57600080fd5b8135818111156117f0576117f0611581565b611802601f8201601f191685016115e1565b9150808252878482850101111561181857600080fd5b80848401858401376000848284010152508093505050509250929050565b60006020828403121561184857600080fd5b5035919050565b60005b8381101561186a578181015183820152602001611852565b50506000910152565b602081526000825180602084015261189281604085016020870161184f565b601f01601f19169190910160400192915050565b60008083601f8401126118b857600080fd5b5081356001600160401b038111156118cf57600080fd5b6020830191508360208285010111156118e757600080fd5b9250929050565b6000806000806040858703121561190457600080fd5b84356001600160401b038082111561191b57600080fd5b611927888389016118a6565b9096509450602087013591508082111561194057600080fd5b5061194d878288016118a6565b95989497509550505050565b600080600080600060a0868803121561197157600080fd5b853561197c8161177a565b9450602086013561198c8161177a565b9350604086013592506119a160608701611732565b91506119af60808701611732565b90509295509295909350565b6000602082840312156119cd57600080fd5b81356104228161177a565b600060a082840312156119ea57600080fd5b60405160a081018181106001600160401b0382111715611a0c57611a0c611581565b60405282358152611a1f60208401611732565b60208201526040830135604082015260608301356060820152608083013560808201528091505092915050565b634e487b7160e01b600052601160045260246000fd5b6001600160401b03818116838216019080821115610e2557610e25611a4c565b8183823760009101908152919050565b600060208284031215611aa457600080fd5b5051919050565b606081528360608201528385608083013760006080858301015260006080601f19601f870116830101905083602083015282604083015295945050505050565b600060018201611afd57611afd611a4c565b5060010190565b634e487b7160e01b600052602160045260246000fd5b81810381811115610e2757610e27611a4c565b80820180821115610e2757610e27611a4c565b6001600160f81b0319831681528151600090611b6381600185016020870161184f565b919091016001019392505050565b60008251611b8381846020870161184f565b9190910192915050565b634e487b7160e01b600052603260045260246000fdfe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca26469706673582212203984129863954300b0e2923ca7f62278f5d6c3a44b383ac36d3ce1a4d845950e64736f6c63430008180033", + "object": "0x60a06040523060805234801561001457600080fd5b50608051611bf961003e60003960008181610b9101528181610bba0152610d000152611bf96000f3fe60806040526004361061011f5760003560e01c8063a7e47629116100a0578063e30c397811610064578063e30c397814610331578063e405bbc314610346578063e6679c2614610366578063ef3f7dd514610386578063f2fde38b1461039c57600080fd5b8063a7e476291461027d578063ad3cb1cc1461029d578063c532514b146102db578063ce0bb7e4146102fb578063d86ba0e21461031157600080fd5b80636c4f6ba9116100e75780636c4f6ba9146101f0578063715018a61461020657806379ba50971461021b5780637eeb1c67146102305780638da5cb5b1461026857600080fd5b80631f3302a91461012457806323a4608b146101595780632b7ac3f31461017b5780634f1ef286146101ba57806352d1902d146101cd575b600080fd5b34801561013057600080fd5b5061014461013f366004611611565b6103bc565b60405190151581526020015b60405180910390f35b34801561016557600080fd5b5061017961017436600461174e565b610429565b005b34801561018757600080fd5b506000546101a290600160401b90046001600160a01b031681565b6040516001600160a01b039091168152602001610150565b6101796101c836600461178f565b610459565b3480156101d957600080fd5b506101e2610478565b604051908152602001610150565b3480156101fc57600080fd5b506101e260045481565b34801561021257600080fd5b50610179610495565b34801561022757600080fd5b506101796104a9565b34801561023c57600080fd5b50600054610250906001600160401b031681565b6040516001600160401b039091168152602001610150565b34801561027457600080fd5b506101a26104f6565b34801561028957600080fd5b50610179610298366004611836565b61052b565b3480156102a957600080fd5b506102ce604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101509190611873565b3480156102e757600080fd5b506101796102f63660046118ee565b610538565b34801561030757600080fd5b506101e260025481565b34801561031d57600080fd5b5061017961032c366004611959565b6107ce565b34801561033d57600080fd5b506101a261096c565b34801561035257600080fd5b50600354610250906001600160401b031681565b34801561037257600080fd5b506101796103813660046119bb565b610995565b34801561039257600080fd5b506101e260015481565b3480156103a857600080fd5b506101796103b73660046119bb565b6109ce565b60008315806103cd57506002548410155b156103da57506000610422565b600084815260056020908152604080832054815187518185015292870151838301528151808403830181526060909301909152919061041c9083908690610a53565b50925050505b9392505050565b610431610b54565b6004919091556003805467ffffffffffffffff19166001600160401b03909216919091179055565b610461610b86565b61046a82610c2b565b6104748282610c33565b5050565b6000610482610cf5565b50600080516020611ba483398151915290565b61049d610b54565b6104a76000610d3e565b565b33806104b361096c565b6001600160a01b0316146104ea5760405163118cdaa760e01b81526001600160a01b03821660048201526024015b60405180910390fd5b6104f381610d3e565b50565b6000807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b546001600160a01b031692915050565b610533610b54565b600155565b6000610546848601866119d8565b600054600354919250610565916001600160401b039182169116611a62565b6001600160401b031681602001516001600160401b03161161059a5760405163145ce5ff60e11b815260040160405180910390fd5b6004548151146105bd576040516352c6046360e01b815260040160405180910390fd5b600060089054906101000a90046001600160a01b03166001600160a01b031663ab750e75848460015460028a8a6040516105f8929190611a82565b602060405180830381855afa158015610615573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906106389190611a92565b6040518563ffffffff1660e01b81526004016106579493929190611aab565b60006040518083038186803b15801561066f57600080fd5b505afa158015610683573d6000803e3d6000fd5b50505060608201516020808401516003546002546040519081529394506001600160401b03918216939116917f34dd3689f5bd77a60a3ff2e09483dcab032fa2f1fd7227af3e24bed21beab1cb910160405180910390a46003546020828101516080840151604080516001600160401b03958616815294909216928401929092528201527f034c7608fd99db72330fdb1bcf6386af42ee9b6125664743942b942a8df4a3519060600160405180910390a16020818101516003805467ffffffffffffffff19166001600160401b03909216918217905560408084015160048190558151928352928201929092527f292f5abc3167175400fca463fa99530cda826ec53ec5eb1f3a2776006dacd75d910160405180910390a16060810151600280546000908152600560205260408120929092558054916107c283611aeb565b91905055505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03166000811580156108135750825b90506000826001600160401b0316600114801561082f5750303b155b90508115801561083d575080155b1561085b5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561088557845460ff60401b1916600160401b1785555b61088e8a610d76565b610896610d87565b61089e610d87565b6000805460048a90556003805467ffffffffffffffff199081166001600160401b038c8116919091179092557f3229c3708db83fd93c3f28275361870e40d75740c5c09498196474da8fc65f8e60019081556001600160e01b0319909316600160401b6001600160a01b038f16029091161790891617909155600255831561096057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050565b6000807f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0061051b565b61099d610b54565b600080546001600160a01b03909216600160401b0268010000000000000000600160e01b0319909216919091179055565b6109d6610b54565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b0319166001600160a01b0383169081178255610a1a6104f6565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b6000806001846040015111610a7b5783515115610a765750600090506001610b4c565b610aa1565b610a8d84602001518560400151610d8f565b84515114610aa15750600090506001610b4c565b8360400151846020015110610abc5750600090506002610b4c565b6000610ac784610e2d565b855151909150600003610afa578460400151600103610aed578514915060009050610b4c565b6000809250925050610b4c565b600080610b1587602001518860400151858a60000151610ea2565b90925090506000816005811115610b2e57610b2e611b04565b14610b4157600094509250610b4c915050565b508614925060009150505b935093915050565b33610b5d6104f6565b6001600160a01b0316146104a75760405163118cdaa760e01b81523360048201526024016104e1565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610c0d57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610c01600080516020611ba4833981519152546001600160a01b031690565b6001600160a01b031614155b156104a75760405163703e46dd60e11b815260040160405180910390fd5b6104f3610b54565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610c8d575060408051601f3d908101601f19168201909252610c8a91810190611a92565b60015b610cb557604051634c9c8ce360e01b81526001600160a01b03831660048201526024016104e1565b600080516020611ba48339815191528114610ce657604051632a87526960e21b8152600481018290526024016104e1565b610cf0838361102c565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104a75760405163703e46dd60e11b815260040160405180910390fd5b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b031916815561047482611082565b610d7e6110f3565b6104f38161113c565b6104a76110f3565b600060018211610da157506000610e27565b610daa8261116e565b610db690610100611b1a565b90506000610dc5600183611b1a565b6001901b9050600181610dd89190611b1a565b8411610de45750610e27565b80600103610df6576001915050610e27565b610e12610e038286611b1a565b610e0d8386611b1a565b610d8f565b610e1d906001611b2d565b915050610e27565b505b92915050565b60006002600060f81b83604051602001610e48929190611b40565b60408051601f1981840301815290829052610e6291611b71565b602060405180830381855afa158015610e7f573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610e279190611a92565b60008084600003610eb857508290506003611023565b84600103610edd57825115610ed257508290506004611023565b508290506000611023565b8251600003610ef157508290506005611023565b6000610efc8661119b565b90506000610f1985600060018851610f149190611b1a565b6111dc565b9050600082891015610f9d576000610f338a858a86610ea2565b925090506000826005811115610f4b57610f4b611b04565b14610f5e57508694509250611023915050565b610f8e818860018a51610f719190611b1a565b81518110610f8157610f81611b8d565b6020026020010151611361565b60009550955050505050611023565b6000610fbd610fac858c611b1a565b610fb6868c611b1a565b8a86610ea2565b925090506000826005811115610fd557610fd5611b04565b14610fe857508694509250611023915050565b6110188760018951610ffa9190611b1a565b8151811061100a5761100a611b8d565b602002602001015182611361565b600095509550505050505b94509492505050565b611035826113df565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561107a57610cf08282611444565b6104746114ba565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166104a757604051631afcd79f60e31b815260040160405180910390fd5b6111446110f3565b6001600160a01b0381166104ea57604051631e4fbdf760e01b8152600060048201526024016104e1565b60005b81816001901b101561118f57611188600182611b2d565b9050611171565b610e2781610100611b1a565b600060018210156111ab57600080fd5b60006111b6836114d9565b905060006111c5600183611b1a565b6001901b90508381036104225760011c9392505050565b6060818311156112415760405162461bcd60e51b815260206004820152602a60248201527f496e76616c69642072616e67653a205f626567696e2069732067726561746572604482015269081d1a185b8817d95b9960b21b60648201526084016104e1565b83518311806112505750835182115b156112b55760405162461bcd60e51b815260206004820152602f60248201527f496e76616c69642072616e67653a205f626567696e206f72205f656e6420617260448201526e65206f7574206f6620626f756e647360881b60648201526084016104e1565b60006112c18484611b1a565b6001600160401b038111156112d8576112d8611581565b604051908082528060200260200182016040528015611301578160200160208202803683370190505b509050835b838110156113585785818151811061132057611320611b8d565b60200260200101518286836113359190611b1a565b8151811061134557611345611b8d565b6020908102919091010152600101611306565b50949350505050565b604051600160f81b6020820152602181018390526041810182905260009060029060610160408051601f198184030181529082905261139f91611b71565b602060405180830381855afa1580156113bc573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906104229190611a92565b806001600160a01b03163b60000361141557604051634c9c8ce360e01b81526001600160a01b03821660048201526024016104e1565b600080516020611ba483398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516114619190611b71565b600060405180830381855af49150503d806000811461149c576040519150601f19603f3d011682016040523d82523d6000602084013e6114a1565b606091505b50915091506114b18583836114fc565b95945050505050565b34156104a75760405163b398979f60e01b815260040160405180910390fd5b6000805b8215610e2757806114ed81611aeb565b915050600183901c92506114dd565b6060826115115761150c82611558565b610422565b815115801561152857506001600160a01b0384163b155b1561155157604051639996b31560e01b81526001600160a01b03851660048201526024016104e1565b5080610422565b8051156115685780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156115b9576115b9611581565b60405290565b604051606081016001600160401b03811182821017156115b9576115b9611581565b604051601f8201601f191681016001600160401b038111828210171561160957611609611581565b604052919050565b6000806000838503608081121561162757600080fd5b8435935060206040601f198301121561163f57600080fd5b611647611597565b8682013581526040870135828201529350606086013591506001600160401b038083111561167457600080fd5b918601916060838903121561168857600080fd5b6116906115bf565b83358281111561169f57600080fd5b8401601f81018a136116b057600080fd5b8035838111156116c2576116c2611581565b8060051b93506116d38585016115e1565b818152938201850193858101908c8611156116ed57600080fd5b928601925b8584101561170b578335825292860192908601906116f2565b80855250505050828401358382015260408401356040820152809450505050509250925092565b80356001600160401b038116811461174957600080fd5b919050565b6000806040838503121561176157600080fd5b8235915061177160208401611732565b90509250929050565b6001600160a01b03811681146104f357600080fd5b600080604083850312156117a257600080fd5b82356117ad8161177a565b91506020838101356001600160401b03808211156117ca57600080fd5b818601915086601f8301126117de57600080fd5b8135818111156117f0576117f0611581565b611802601f8201601f191685016115e1565b9150808252878482850101111561181857600080fd5b80848401858401376000848284010152508093505050509250929050565b60006020828403121561184857600080fd5b5035919050565b60005b8381101561186a578181015183820152602001611852565b50506000910152565b602081526000825180602084015261189281604085016020870161184f565b601f01601f19169190910160400192915050565b60008083601f8401126118b857600080fd5b5081356001600160401b038111156118cf57600080fd5b6020830191508360208285010111156118e757600080fd5b9250929050565b6000806000806040858703121561190457600080fd5b84356001600160401b038082111561191b57600080fd5b611927888389016118a6565b9096509450602087013591508082111561194057600080fd5b5061194d878288016118a6565b95989497509550505050565b600080600080600060a0868803121561197157600080fd5b853561197c8161177a565b9450602086013561198c8161177a565b9350604086013592506119a160608701611732565b91506119af60808701611732565b90509295509295909350565b6000602082840312156119cd57600080fd5b81356104228161177a565b600060a082840312156119ea57600080fd5b60405160a081018181106001600160401b0382111715611a0c57611a0c611581565b60405282358152611a1f60208401611732565b60208201526040830135604082015260608301356060820152608083013560808201528091505092915050565b634e487b7160e01b600052601160045260246000fd5b6001600160401b03818116838216019080821115610e2557610e25611a4c565b8183823760009101908152919050565b600060208284031215611aa457600080fd5b5051919050565b606081528360608201528385608083013760006080858301015260006080601f19601f870116830101905083602083015282604083015295945050505050565b600060018201611afd57611afd611a4c565b5060010190565b634e487b7160e01b600052602160045260246000fd5b81810381811115610e2757610e27611a4c565b80820180821115610e2757610e27611a4c565b6001600160f81b0319831681528151600090611b6381600185016020870161184f565b919091016001019392505050565b60008251611b8381846020870161184f565b9190910192915050565b634e487b7160e01b600052603260045260246000fdfe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca264697066735822122094536429a3ca68c21ec7e562a8ca0170d7d34a3afbb06c492caee707d6b1c49564736f6c63430008180033", "sourceMap": "1358:6665:21:-:0;;;1171:4:12;1128:48;;1358:6665:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;" }, "deployedBytecode": { @@ -581,7 +581,7 @@ ] }, "linkReferences": {}, - "object": "0x60806040526004361061011f5760003560e01c8063a7e47629116100a0578063e30c397811610064578063e30c397814610331578063e405bbc314610346578063e6679c2614610366578063ef3f7dd514610386578063f2fde38b1461039c57600080fd5b8063a7e476291461027d578063ad3cb1cc1461029d578063c532514b146102db578063ce0bb7e4146102fb578063d86ba0e21461031157600080fd5b80636c4f6ba9116100e75780636c4f6ba9146101f0578063715018a61461020657806379ba50971461021b5780637eeb1c67146102305780638da5cb5b1461026857600080fd5b80631f3302a91461012457806323a4608b146101595780632b7ac3f31461017b5780634f1ef286146101ba57806352d1902d146101cd575b600080fd5b34801561013057600080fd5b5061014461013f366004611611565b6103bc565b60405190151581526020015b60405180910390f35b34801561016557600080fd5b5061017961017436600461174e565b610429565b005b34801561018757600080fd5b506000546101a290600160401b90046001600160a01b031681565b6040516001600160a01b039091168152602001610150565b6101796101c836600461178f565b610459565b3480156101d957600080fd5b506101e2610478565b604051908152602001610150565b3480156101fc57600080fd5b506101e260045481565b34801561021257600080fd5b50610179610495565b34801561022757600080fd5b506101796104a9565b34801561023c57600080fd5b50600054610250906001600160401b031681565b6040516001600160401b039091168152602001610150565b34801561027457600080fd5b506101a26104f6565b34801561028957600080fd5b50610179610298366004611836565b61052b565b3480156102a957600080fd5b506102ce604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101509190611873565b3480156102e757600080fd5b506101796102f63660046118ee565b610538565b34801561030757600080fd5b506101e260025481565b34801561031d57600080fd5b5061017961032c366004611959565b6107ce565b34801561033d57600080fd5b506101a261096c565b34801561035257600080fd5b50600354610250906001600160401b031681565b34801561037257600080fd5b506101796103813660046119bb565b610995565b34801561039257600080fd5b506101e260015481565b3480156103a857600080fd5b506101796103b73660046119bb565b6109ce565b60008315806103cd57506002548410155b156103da57506000610422565b600084815260056020908152604080832054815187518185015292870151838301528151808403830181526060909301909152919061041c9083908690610a53565b50925050505b9392505050565b610431610b54565b6004919091556003805467ffffffffffffffff19166001600160401b03909216919091179055565b610461610b86565b61046a82610c2b565b6104748282610c33565b5050565b6000610482610cf5565b50600080516020611ba483398151915290565b61049d610b54565b6104a76000610d3e565b565b33806104b361096c565b6001600160a01b0316146104ea5760405163118cdaa760e01b81526001600160a01b03821660048201526024015b60405180910390fd5b6104f381610d3e565b50565b6000807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b546001600160a01b031692915050565b610533610b54565b600155565b6000610546848601866119d8565b600054600354919250610565916001600160401b039182169116611a62565b6001600160401b031681602001516001600160401b03161161059a5760405163145ce5ff60e11b815260040160405180910390fd5b6004548151146105bd576040516352c6046360e01b815260040160405180910390fd5b600060089054906101000a90046001600160a01b03166001600160a01b031663ab750e75848460015460028a8a6040516105f8929190611a82565b602060405180830381855afa158015610615573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906106389190611a92565b6040518563ffffffff1660e01b81526004016106579493929190611aab565b60006040518083038186803b15801561066f57600080fd5b505afa158015610683573d6000803e3d6000fd5b50505060608201516020808401516003546002546040519081529394506001600160401b03918216939116917f34dd3689f5bd77a60a3ff2e09483dcab032fa2f1fd7227af3e24bed21beab1cb910160405180910390a46003546020828101516080840151604080516001600160401b03958616815294909216928401929092528201527f034c7608fd99db72330fdb1bcf6386af42ee9b6125664743942b942a8df4a3519060600160405180910390a16020818101516003805467ffffffffffffffff19166001600160401b03909216918217905560408084015160048190558151928352928201929092527f292f5abc3167175400fca463fa99530cda826ec53ec5eb1f3a2776006dacd75d910160405180910390a16060810151600280546000908152600560205260408120929092558054916107c283611aeb565b91905055505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03166000811580156108135750825b90506000826001600160401b0316600114801561082f5750303b155b90508115801561083d575080155b1561085b5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561088557845460ff60401b1916600160401b1785555b61088e8a610d76565b610896610d87565b61089e610d87565b6000805460048a90556003805467ffffffffffffffff199081166001600160401b038c8116919091179092557f4383189e399cb4bb64bc8b77fbaefcfe4c3c6472867bdd61de5eb1d4334a34c660019081556001600160e01b0319909316600160401b6001600160a01b038f16029091161790891617909155600255831561096057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050565b6000807f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0061051b565b61099d610b54565b600080546001600160a01b03909216600160401b0268010000000000000000600160e01b0319909216919091179055565b6109d6610b54565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b0319166001600160a01b0383169081178255610a1a6104f6565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b6000806001846040015111610a7b5783515115610a765750600090506001610b4c565b610aa1565b610a8d84602001518560400151610d8f565b84515114610aa15750600090506001610b4c565b8360400151846020015110610abc5750600090506002610b4c565b6000610ac784610e2d565b855151909150600003610afa578460400151600103610aed578514915060009050610b4c565b6000809250925050610b4c565b600080610b1587602001518860400151858a60000151610ea2565b90925090506000816005811115610b2e57610b2e611b04565b14610b4157600094509250610b4c915050565b508614925060009150505b935093915050565b33610b5d6104f6565b6001600160a01b0316146104a75760405163118cdaa760e01b81523360048201526024016104e1565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610c0d57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610c01600080516020611ba4833981519152546001600160a01b031690565b6001600160a01b031614155b156104a75760405163703e46dd60e11b815260040160405180910390fd5b6104f3610b54565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610c8d575060408051601f3d908101601f19168201909252610c8a91810190611a92565b60015b610cb557604051634c9c8ce360e01b81526001600160a01b03831660048201526024016104e1565b600080516020611ba48339815191528114610ce657604051632a87526960e21b8152600481018290526024016104e1565b610cf0838361102c565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104a75760405163703e46dd60e11b815260040160405180910390fd5b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b031916815561047482611082565b610d7e6110f3565b6104f38161113c565b6104a76110f3565b600060018211610da157506000610e27565b610daa8261116e565b610db690610100611b1a565b90506000610dc5600183611b1a565b6001901b9050600181610dd89190611b1a565b8411610de45750610e27565b80600103610df6576001915050610e27565b610e12610e038286611b1a565b610e0d8386611b1a565b610d8f565b610e1d906001611b2d565b915050610e27565b505b92915050565b60006002600060f81b83604051602001610e48929190611b40565b60408051601f1981840301815290829052610e6291611b71565b602060405180830381855afa158015610e7f573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610e279190611a92565b60008084600003610eb857508290506003611023565b84600103610edd57825115610ed257508290506004611023565b508290506000611023565b8251600003610ef157508290506005611023565b6000610efc8661119b565b90506000610f1985600060018851610f149190611b1a565b6111dc565b9050600082891015610f9d576000610f338a858a86610ea2565b925090506000826005811115610f4b57610f4b611b04565b14610f5e57508694509250611023915050565b610f8e818860018a51610f719190611b1a565b81518110610f8157610f81611b8d565b6020026020010151611361565b60009550955050505050611023565b6000610fbd610fac858c611b1a565b610fb6868c611b1a565b8a86610ea2565b925090506000826005811115610fd557610fd5611b04565b14610fe857508694509250611023915050565b6110188760018951610ffa9190611b1a565b8151811061100a5761100a611b8d565b602002602001015182611361565b600095509550505050505b94509492505050565b611035826113df565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561107a57610cf08282611444565b6104746114ba565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166104a757604051631afcd79f60e31b815260040160405180910390fd5b6111446110f3565b6001600160a01b0381166104ea57604051631e4fbdf760e01b8152600060048201526024016104e1565b60005b81816001901b101561118f57611188600182611b2d565b9050611171565b610e2781610100611b1a565b600060018210156111ab57600080fd5b60006111b6836114d9565b905060006111c5600183611b1a565b6001901b90508381036104225760011c9392505050565b6060818311156112415760405162461bcd60e51b815260206004820152602a60248201527f496e76616c69642072616e67653a205f626567696e2069732067726561746572604482015269081d1a185b8817d95b9960b21b60648201526084016104e1565b83518311806112505750835182115b156112b55760405162461bcd60e51b815260206004820152602f60248201527f496e76616c69642072616e67653a205f626567696e206f72205f656e6420617260448201526e65206f7574206f6620626f756e647360881b60648201526084016104e1565b60006112c18484611b1a565b6001600160401b038111156112d8576112d8611581565b604051908082528060200260200182016040528015611301578160200160208202803683370190505b509050835b838110156113585785818151811061132057611320611b8d565b60200260200101518286836113359190611b1a565b8151811061134557611345611b8d565b6020908102919091010152600101611306565b50949350505050565b604051600160f81b6020820152602181018390526041810182905260009060029060610160408051601f198184030181529082905261139f91611b71565b602060405180830381855afa1580156113bc573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906104229190611a92565b806001600160a01b03163b60000361141557604051634c9c8ce360e01b81526001600160a01b03821660048201526024016104e1565b600080516020611ba483398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516114619190611b71565b600060405180830381855af49150503d806000811461149c576040519150601f19603f3d011682016040523d82523d6000602084013e6114a1565b606091505b50915091506114b18583836114fc565b95945050505050565b34156104a75760405163b398979f60e01b815260040160405180910390fd5b6000805b8215610e2757806114ed81611aeb565b915050600183901c92506114dd565b6060826115115761150c82611558565b610422565b815115801561152857506001600160a01b0384163b155b1561155157604051639996b31560e01b81526001600160a01b03851660048201526024016104e1565b5080610422565b8051156115685780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156115b9576115b9611581565b60405290565b604051606081016001600160401b03811182821017156115b9576115b9611581565b604051601f8201601f191681016001600160401b038111828210171561160957611609611581565b604052919050565b6000806000838503608081121561162757600080fd5b8435935060206040601f198301121561163f57600080fd5b611647611597565b8682013581526040870135828201529350606086013591506001600160401b038083111561167457600080fd5b918601916060838903121561168857600080fd5b6116906115bf565b83358281111561169f57600080fd5b8401601f81018a136116b057600080fd5b8035838111156116c2576116c2611581565b8060051b93506116d38585016115e1565b818152938201850193858101908c8611156116ed57600080fd5b928601925b8584101561170b578335825292860192908601906116f2565b80855250505050828401358382015260408401356040820152809450505050509250925092565b80356001600160401b038116811461174957600080fd5b919050565b6000806040838503121561176157600080fd5b8235915061177160208401611732565b90509250929050565b6001600160a01b03811681146104f357600080fd5b600080604083850312156117a257600080fd5b82356117ad8161177a565b91506020838101356001600160401b03808211156117ca57600080fd5b818601915086601f8301126117de57600080fd5b8135818111156117f0576117f0611581565b611802601f8201601f191685016115e1565b9150808252878482850101111561181857600080fd5b80848401858401376000848284010152508093505050509250929050565b60006020828403121561184857600080fd5b5035919050565b60005b8381101561186a578181015183820152602001611852565b50506000910152565b602081526000825180602084015261189281604085016020870161184f565b601f01601f19169190910160400192915050565b60008083601f8401126118b857600080fd5b5081356001600160401b038111156118cf57600080fd5b6020830191508360208285010111156118e757600080fd5b9250929050565b6000806000806040858703121561190457600080fd5b84356001600160401b038082111561191b57600080fd5b611927888389016118a6565b9096509450602087013591508082111561194057600080fd5b5061194d878288016118a6565b95989497509550505050565b600080600080600060a0868803121561197157600080fd5b853561197c8161177a565b9450602086013561198c8161177a565b9350604086013592506119a160608701611732565b91506119af60808701611732565b90509295509295909350565b6000602082840312156119cd57600080fd5b81356104228161177a565b600060a082840312156119ea57600080fd5b60405160a081018181106001600160401b0382111715611a0c57611a0c611581565b60405282358152611a1f60208401611732565b60208201526040830135604082015260608301356060820152608083013560808201528091505092915050565b634e487b7160e01b600052601160045260246000fd5b6001600160401b03818116838216019080821115610e2557610e25611a4c565b8183823760009101908152919050565b600060208284031215611aa457600080fd5b5051919050565b606081528360608201528385608083013760006080858301015260006080601f19601f870116830101905083602083015282604083015295945050505050565b600060018201611afd57611afd611a4c565b5060010190565b634e487b7160e01b600052602160045260246000fd5b81810381811115610e2757610e27611a4c565b80820180821115610e2757610e27611a4c565b6001600160f81b0319831681528151600090611b6381600185016020870161184f565b919091016001019392505050565b60008251611b8381846020870161184f565b9190910192915050565b634e487b7160e01b600052603260045260246000fdfe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca26469706673582212203984129863954300b0e2923ca7f62278f5d6c3a44b383ac36d3ce1a4d845950e64736f6c63430008180033", + "object": "0x60806040526004361061011f5760003560e01c8063a7e47629116100a0578063e30c397811610064578063e30c397814610331578063e405bbc314610346578063e6679c2614610366578063ef3f7dd514610386578063f2fde38b1461039c57600080fd5b8063a7e476291461027d578063ad3cb1cc1461029d578063c532514b146102db578063ce0bb7e4146102fb578063d86ba0e21461031157600080fd5b80636c4f6ba9116100e75780636c4f6ba9146101f0578063715018a61461020657806379ba50971461021b5780637eeb1c67146102305780638da5cb5b1461026857600080fd5b80631f3302a91461012457806323a4608b146101595780632b7ac3f31461017b5780634f1ef286146101ba57806352d1902d146101cd575b600080fd5b34801561013057600080fd5b5061014461013f366004611611565b6103bc565b60405190151581526020015b60405180910390f35b34801561016557600080fd5b5061017961017436600461174e565b610429565b005b34801561018757600080fd5b506000546101a290600160401b90046001600160a01b031681565b6040516001600160a01b039091168152602001610150565b6101796101c836600461178f565b610459565b3480156101d957600080fd5b506101e2610478565b604051908152602001610150565b3480156101fc57600080fd5b506101e260045481565b34801561021257600080fd5b50610179610495565b34801561022757600080fd5b506101796104a9565b34801561023c57600080fd5b50600054610250906001600160401b031681565b6040516001600160401b039091168152602001610150565b34801561027457600080fd5b506101a26104f6565b34801561028957600080fd5b50610179610298366004611836565b61052b565b3480156102a957600080fd5b506102ce604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101509190611873565b3480156102e757600080fd5b506101796102f63660046118ee565b610538565b34801561030757600080fd5b506101e260025481565b34801561031d57600080fd5b5061017961032c366004611959565b6107ce565b34801561033d57600080fd5b506101a261096c565b34801561035257600080fd5b50600354610250906001600160401b031681565b34801561037257600080fd5b506101796103813660046119bb565b610995565b34801561039257600080fd5b506101e260015481565b3480156103a857600080fd5b506101796103b73660046119bb565b6109ce565b60008315806103cd57506002548410155b156103da57506000610422565b600084815260056020908152604080832054815187518185015292870151838301528151808403830181526060909301909152919061041c9083908690610a53565b50925050505b9392505050565b610431610b54565b6004919091556003805467ffffffffffffffff19166001600160401b03909216919091179055565b610461610b86565b61046a82610c2b565b6104748282610c33565b5050565b6000610482610cf5565b50600080516020611ba483398151915290565b61049d610b54565b6104a76000610d3e565b565b33806104b361096c565b6001600160a01b0316146104ea5760405163118cdaa760e01b81526001600160a01b03821660048201526024015b60405180910390fd5b6104f381610d3e565b50565b6000807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b546001600160a01b031692915050565b610533610b54565b600155565b6000610546848601866119d8565b600054600354919250610565916001600160401b039182169116611a62565b6001600160401b031681602001516001600160401b03161161059a5760405163145ce5ff60e11b815260040160405180910390fd5b6004548151146105bd576040516352c6046360e01b815260040160405180910390fd5b600060089054906101000a90046001600160a01b03166001600160a01b031663ab750e75848460015460028a8a6040516105f8929190611a82565b602060405180830381855afa158015610615573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906106389190611a92565b6040518563ffffffff1660e01b81526004016106579493929190611aab565b60006040518083038186803b15801561066f57600080fd5b505afa158015610683573d6000803e3d6000fd5b50505060608201516020808401516003546002546040519081529394506001600160401b03918216939116917f34dd3689f5bd77a60a3ff2e09483dcab032fa2f1fd7227af3e24bed21beab1cb910160405180910390a46003546020828101516080840151604080516001600160401b03958616815294909216928401929092528201527f034c7608fd99db72330fdb1bcf6386af42ee9b6125664743942b942a8df4a3519060600160405180910390a16020818101516003805467ffffffffffffffff19166001600160401b03909216918217905560408084015160048190558151928352928201929092527f292f5abc3167175400fca463fa99530cda826ec53ec5eb1f3a2776006dacd75d910160405180910390a16060810151600280546000908152600560205260408120929092558054916107c283611aeb565b91905055505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03166000811580156108135750825b90506000826001600160401b0316600114801561082f5750303b155b90508115801561083d575080155b1561085b5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561088557845460ff60401b1916600160401b1785555b61088e8a610d76565b610896610d87565b61089e610d87565b6000805460048a90556003805467ffffffffffffffff199081166001600160401b038c8116919091179092557f3229c3708db83fd93c3f28275361870e40d75740c5c09498196474da8fc65f8e60019081556001600160e01b0319909316600160401b6001600160a01b038f16029091161790891617909155600255831561096057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050565b6000807f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0061051b565b61099d610b54565b600080546001600160a01b03909216600160401b0268010000000000000000600160e01b0319909216919091179055565b6109d6610b54565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b0319166001600160a01b0383169081178255610a1a6104f6565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b6000806001846040015111610a7b5783515115610a765750600090506001610b4c565b610aa1565b610a8d84602001518560400151610d8f565b84515114610aa15750600090506001610b4c565b8360400151846020015110610abc5750600090506002610b4c565b6000610ac784610e2d565b855151909150600003610afa578460400151600103610aed578514915060009050610b4c565b6000809250925050610b4c565b600080610b1587602001518860400151858a60000151610ea2565b90925090506000816005811115610b2e57610b2e611b04565b14610b4157600094509250610b4c915050565b508614925060009150505b935093915050565b33610b5d6104f6565b6001600160a01b0316146104a75760405163118cdaa760e01b81523360048201526024016104e1565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610c0d57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610c01600080516020611ba4833981519152546001600160a01b031690565b6001600160a01b031614155b156104a75760405163703e46dd60e11b815260040160405180910390fd5b6104f3610b54565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610c8d575060408051601f3d908101601f19168201909252610c8a91810190611a92565b60015b610cb557604051634c9c8ce360e01b81526001600160a01b03831660048201526024016104e1565b600080516020611ba48339815191528114610ce657604051632a87526960e21b8152600481018290526024016104e1565b610cf0838361102c565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104a75760405163703e46dd60e11b815260040160405180910390fd5b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b031916815561047482611082565b610d7e6110f3565b6104f38161113c565b6104a76110f3565b600060018211610da157506000610e27565b610daa8261116e565b610db690610100611b1a565b90506000610dc5600183611b1a565b6001901b9050600181610dd89190611b1a565b8411610de45750610e27565b80600103610df6576001915050610e27565b610e12610e038286611b1a565b610e0d8386611b1a565b610d8f565b610e1d906001611b2d565b915050610e27565b505b92915050565b60006002600060f81b83604051602001610e48929190611b40565b60408051601f1981840301815290829052610e6291611b71565b602060405180830381855afa158015610e7f573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610e279190611a92565b60008084600003610eb857508290506003611023565b84600103610edd57825115610ed257508290506004611023565b508290506000611023565b8251600003610ef157508290506005611023565b6000610efc8661119b565b90506000610f1985600060018851610f149190611b1a565b6111dc565b9050600082891015610f9d576000610f338a858a86610ea2565b925090506000826005811115610f4b57610f4b611b04565b14610f5e57508694509250611023915050565b610f8e818860018a51610f719190611b1a565b81518110610f8157610f81611b8d565b6020026020010151611361565b60009550955050505050611023565b6000610fbd610fac858c611b1a565b610fb6868c611b1a565b8a86610ea2565b925090506000826005811115610fd557610fd5611b04565b14610fe857508694509250611023915050565b6110188760018951610ffa9190611b1a565b8151811061100a5761100a611b8d565b602002602001015182611361565b600095509550505050505b94509492505050565b611035826113df565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561107a57610cf08282611444565b6104746114ba565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166104a757604051631afcd79f60e31b815260040160405180910390fd5b6111446110f3565b6001600160a01b0381166104ea57604051631e4fbdf760e01b8152600060048201526024016104e1565b60005b81816001901b101561118f57611188600182611b2d565b9050611171565b610e2781610100611b1a565b600060018210156111ab57600080fd5b60006111b6836114d9565b905060006111c5600183611b1a565b6001901b90508381036104225760011c9392505050565b6060818311156112415760405162461bcd60e51b815260206004820152602a60248201527f496e76616c69642072616e67653a205f626567696e2069732067726561746572604482015269081d1a185b8817d95b9960b21b60648201526084016104e1565b83518311806112505750835182115b156112b55760405162461bcd60e51b815260206004820152602f60248201527f496e76616c69642072616e67653a205f626567696e206f72205f656e6420617260448201526e65206f7574206f6620626f756e647360881b60648201526084016104e1565b60006112c18484611b1a565b6001600160401b038111156112d8576112d8611581565b604051908082528060200260200182016040528015611301578160200160208202803683370190505b509050835b838110156113585785818151811061132057611320611b8d565b60200260200101518286836113359190611b1a565b8151811061134557611345611b8d565b6020908102919091010152600101611306565b50949350505050565b604051600160f81b6020820152602181018390526041810182905260009060029060610160408051601f198184030181529082905261139f91611b71565b602060405180830381855afa1580156113bc573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906104229190611a92565b806001600160a01b03163b60000361141557604051634c9c8ce360e01b81526001600160a01b03821660048201526024016104e1565b600080516020611ba483398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516114619190611b71565b600060405180830381855af49150503d806000811461149c576040519150601f19603f3d011682016040523d82523d6000602084013e6114a1565b606091505b50915091506114b18583836114fc565b95945050505050565b34156104a75760405163b398979f60e01b815260040160405180910390fd5b6000805b8215610e2757806114ed81611aeb565b915050600183901c92506114dd565b6060826115115761150c82611558565b610422565b815115801561152857506001600160a01b0384163b155b1561155157604051639996b31560e01b81526001600160a01b03851660048201526024016104e1565b5080610422565b8051156115685780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156115b9576115b9611581565b60405290565b604051606081016001600160401b03811182821017156115b9576115b9611581565b604051601f8201601f191681016001600160401b038111828210171561160957611609611581565b604052919050565b6000806000838503608081121561162757600080fd5b8435935060206040601f198301121561163f57600080fd5b611647611597565b8682013581526040870135828201529350606086013591506001600160401b038083111561167457600080fd5b918601916060838903121561168857600080fd5b6116906115bf565b83358281111561169f57600080fd5b8401601f81018a136116b057600080fd5b8035838111156116c2576116c2611581565b8060051b93506116d38585016115e1565b818152938201850193858101908c8611156116ed57600080fd5b928601925b8584101561170b578335825292860192908601906116f2565b80855250505050828401358382015260408401356040820152809450505050509250925092565b80356001600160401b038116811461174957600080fd5b919050565b6000806040838503121561176157600080fd5b8235915061177160208401611732565b90509250929050565b6001600160a01b03811681146104f357600080fd5b600080604083850312156117a257600080fd5b82356117ad8161177a565b91506020838101356001600160401b03808211156117ca57600080fd5b818601915086601f8301126117de57600080fd5b8135818111156117f0576117f0611581565b611802601f8201601f191685016115e1565b9150808252878482850101111561181857600080fd5b80848401858401376000848284010152508093505050509250929050565b60006020828403121561184857600080fd5b5035919050565b60005b8381101561186a578181015183820152602001611852565b50506000910152565b602081526000825180602084015261189281604085016020870161184f565b601f01601f19169190910160400192915050565b60008083601f8401126118b857600080fd5b5081356001600160401b038111156118cf57600080fd5b6020830191508360208285010111156118e757600080fd5b9250929050565b6000806000806040858703121561190457600080fd5b84356001600160401b038082111561191b57600080fd5b611927888389016118a6565b9096509450602087013591508082111561194057600080fd5b5061194d878288016118a6565b95989497509550505050565b600080600080600060a0868803121561197157600080fd5b853561197c8161177a565b9450602086013561198c8161177a565b9350604086013592506119a160608701611732565b91506119af60808701611732565b90509295509295909350565b6000602082840312156119cd57600080fd5b81356104228161177a565b600060a082840312156119ea57600080fd5b60405160a081018181106001600160401b0382111715611a0c57611a0c611581565b60405282358152611a1f60208401611732565b60208201526040830135604082015260608301356060820152608083013560808201528091505092915050565b634e487b7160e01b600052601160045260246000fd5b6001600160401b03818116838216019080821115610e2557610e25611a4c565b8183823760009101908152919050565b600060208284031215611aa457600080fd5b5051919050565b606081528360608201528385608083013760006080858301015260006080601f19601f870116830101905083602083015282604083015295945050505050565b600060018201611afd57611afd611a4c565b5060010190565b634e487b7160e01b600052602160045260246000fd5b81810381811115610e2757610e27611a4c565b80820180821115610e2757610e27611a4c565b6001600160f81b0319831681528151600090611b6381600185016020870161184f565b919091016001019392505050565b60008251611b8381846020870161184f565b9190910192915050565b634e487b7160e01b600052603260045260246000fdfe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca264697066735822122094536429a3ca68c21ec7e562a8ca0170d7d34a3afbb06c492caee707d6b1c49564736f6c63430008180033", "sourceMap": "1358:6665:21:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7579:442;;;;;;;;;;-1:-1:-1;7579:442:21;;;;;:::i;:::-;;:::i;:::-;;;2830:14:25;;2823:22;2805:41;;2793:2;2778:18;7579:442:21;;;;;;;;5463:180;;;;;;;;;;-1:-1:-1;5463:180:21;;;;;:::i;:::-;;:::i;:::-;;3378:33;;;;;;;;;;-1:-1:-1;3378:33:21;;;;-1:-1:-1;;;3378:33:21;;-1:-1:-1;;;;;3378:33:21;;;;;;-1:-1:-1;;;;;3480:32:25;;;3462:51;;3450:2;3435:18;3378:33:21;3290:229:25;4158:214:12;;;;;;:::i;:::-;;:::i;3705:134::-;;;;;;;;;;;;;:::i;:::-;;;4709:25:25;;;4697:2;4682:18;3705:134:12;4563:177:25;4306:30:21;;;;;;;;;;;;;;;;3155:101:10;;;;;;;;;;;;;:::i;2774:229:9:-;;;;;;;;;;;;;:::i;3292:26:21:-;;;;;;;;;;-1:-1:-1;3292:26:21;;;;-1:-1:-1;;;;;3292:26:21;;;;;;-1:-1:-1;;;;;4907:31:25;;;4889:50;;4877:2;4862:18;3292:26:21;4745:200:25;2441:144:10;;;;;;;;;;;;;:::i;5739:97:21:-;;;;;;;;;;-1:-1:-1;5739:97:21;;;;;:::i;:::-;;:::i;1819:58:12:-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1819:58:12;;;;;;;;;;;;:::i;6111:1064:21:-;;;;;;;;;;-1:-1:-1;6111:1064:21;;;;;:::i;:::-;;:::i;3913:25::-;;;;;;;;;;;;;;;;4693:665;;;;;;;;;;-1:-1:-1;4693:665:21;;;;;:::i;:::-;;:::i;1680:168:9:-;;;;;;;;;;;;;:::i;4066:26:21:-;;;;;;;;;;-1:-1:-1;4066:26:21;;;;-1:-1:-1;;;;;4066:26:21;;;5924:111;;;;;;;;;;-1:-1:-1;5924:111:21;;;;;:::i;:::-;;:::i;3730:22::-;;;;;;;;;;;;;;;;2041:247:9;;;;;;;;;;-1:-1:-1;2041:247:9;;;;;:::i;:::-;;:::i;7579:442:21:-;7736:4;7760:16;;;:45;;;7795:10;;7780:11;:25;;7760:45;7756:88;;;-1:-1:-1;7828:5:21;7821:12;;7756:88;7854:12;7869:24;;;:11;:24;;;;;;;;;7965:18;;8638:13:25;;7965:18:21;;;8620:32:25;8696:17;;;8690:24;8668:20;;;8661:54;7965:18:21;;;;;;;;;8593::25;;;;7965::21;;;7869:24;7854:12;7927:57;;7869:24;;7957:6;;7927:23;:57::i;:::-;-1:-1:-1;7904:80:21;-1:-1:-1;;;7579:442:21;;;;;;:::o;5463:180::-;2334:13:10;:11;:13::i;:::-;5567:15:21::1;:30:::0;;;;5607:12:::1;:29:::0;;-1:-1:-1;;5607:29:21::1;-1:-1:-1::0;;;;;5607:29:21;;::::1;::::0;;;::::1;::::0;;5463:180::o;4158:214:12:-;2653:13;:11;:13::i;:::-;4273:36:::1;4291:17;4273;:36::i;:::-;4319:46;4341:17;4360:4;4319:21;:46::i;:::-;4158:214:::0;;:::o;3705:134::-;3774:7;2924:20;:18;:20::i;:::-;-1:-1:-1;;;;;;;;;;;;3705:134:12;:::o;3155:101:10:-;2334:13;:11;:13::i;:::-;3219:30:::1;3246:1;3219:18;:30::i;:::-;3155:101::o:0;2774:229:9:-;966:10:13;;2869:14:9;:12;:14::i;:::-;-1:-1:-1;;;;;2869:24:9;;2865:96;;2916:34;;-1:-1:-1;;;2916:34:9;;-1:-1:-1;;;;;3480:32:25;;2916:34:9;;;3462:51:25;3435:18;;2916:34:9;;;;;;;;2865:96;2970:26;2989:6;2970:18;:26::i;:::-;2816:187;2774:229::o;2441:144:10:-;2487:7;;1313:22;2533:20;2570:8;-1:-1:-1;;;;;2570:8:10;;2441:144;-1:-1:-1;;2441:144:10:o;5739:97:21:-;2334:13:10;:11;:13::i;:::-;5811:7:21::1;:18:::0;5739:97::o;6111:1064::-;6202:29;6234:43;;;;6245:12;6234:43;:::i;:::-;6327:12;;6312;;6202:75;;-1:-1:-1;6312:27:21;;-1:-1:-1;;;;;6327:12:21;;;;6312;:27;:::i;:::-;-1:-1:-1;;;;;6292:47:21;:6;:16;;;-1:-1:-1;;;;;6292:47:21;;6288:106;;6362:21;;-1:-1:-1;;;6362:21:21;;;;;;;;;;;6288:106;6435:15;;6407:24;;:43;6403:107;;6473:26;;-1:-1:-1;;;6473:26:21;;;;;;;;;;;6403:107;6519:8;;;;;;;;;-1:-1:-1;;;;;6519:8:21;-1:-1:-1;;;;;6519:15:21;;6535:5;;6542:7;;6551:20;6558:12;;6551:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6519:53;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;6653:17:21;;;;6635:16;;;;;6621:12;;6609:10;;6588:83;;4709:25:25;;;6653:17:21;;-1:-1:-1;;;;;;6588:83:21;;;;6621:12;;;6588:83;;4682:18:25;6588:83:21;;;;;;;6714:12;;6728:16;;;;;6746:22;;;;6686:83;;;-1:-1:-1;;;;;6714:12:21;;;11007:34:25;;11077:15;;;;11057:18;;;11050:43;;;;11109:18;;11102:34;6686:83:21;;10958:2:25;10943:18;6686:83:21;;;;;;;6835:16;;;;;6820:12;:31;;-1:-1:-1;;6820:31:21;-1:-1:-1;;;;;6820:31:21;;;;;;;;6879:20;;;;;6861:15;:38;;;6914:41;;11319:50:25;;;11385:18;;;11378:34;;;;6914:41:21;;11292:18:25;6914:41:21;;;;;;;7129:17;;;;7115:10;;;7103:23;;;;:11;:23;;;;;:43;;;;7156:12;;;;;;:::i;:::-;;;;;;6192:983;6111:1064;;;;:::o;4693:665::-;8870:21:11;4302:15;;-1:-1:-1;;;4302:15:11;;;;4301:16;;-1:-1:-1;;;;;4348:14:11;4158:30;4726:16;;:34;;;;;4746:14;4726:34;4706:54;;4770:17;4790:11;-1:-1:-1;;;;;4790:16:11;4805:1;4790:16;:50;;;;-1:-1:-1;4818:4:11;4810:25;:30;4790:50;4770:70;;4856:12;4855:13;:30;;;;;4873:12;4872:13;4855:30;4851:91;;;4908:23;;-1:-1:-1;;;4908:23:11;;;;;;;;;;;4851:91;4951:18;;-1:-1:-1;;4951:18:11;4968:1;4951:18;;;4979:67;;;;5013:22;;-1:-1:-1;;;;5013:22:11;-1:-1:-1;;;5013:22:11;;;4979:67;4900:22:21::1;4915:6;4900:14;:22::i;:::-;4932:21;:19;:21::i;:::-;4963:24;:22;:24::i;:::-;4998:8;:20:::0;;5028:15:::1;:30:::0;;;5068:12:::1;:29:::0;;-1:-1:-1;;5068:29:21;;::::1;-1:-1:-1::0;;;;;5068:29:21;;::::1;::::0;;;::::1;::::0;;;788:66:22::1;-1:-1:-1::0;5107:39:21;;;-1:-1:-1;;;;;;5156:28:21;;;-1:-1:-1;;;;;;;;4998:20:21;::::1;;5156:28:::0;;;;;;::::1;;::::0;;;-1:-1:-1;5337:14:21;5066:101:11;;;;5100:23;;-1:-1:-1;;;;5100:23:11;;;5142:14;;-1:-1:-1;4889:50:25;;5142:14:11;;4877:2:25;4862:18;5142:14:11;;;;;;;5066:101;4092:1081;;;;;4693:665:21;;;;;:::o;1680:168:9:-;1733:7;;1318:27;1784:25;1187:174;5924:111:21;2334:13:10;:11;:13::i;:::-;6008:8:21::1;:20:::0;;-1:-1:-1;;;;;6008:20:21;;::::1;-1:-1:-1::0;;;6008:20:21::1;-1:-1:-1::0;;;;;;6008:20:21;;::::1;::::0;;;::::1;::::0;;5924:111::o;2041:247:9:-;2334:13:10;:11;:13::i;:::-;1318:27:9;2197:26;;-1:-1:-1;;;;;;2197:26:9::1;-1:-1:-1::0;;;;;2197:26:9;::::1;::::0;;::::1;::::0;;2263:7:::1;:5;:7::i;:::-;-1:-1:-1::0;;;;;2238:43:9::1;;;;;;;;;;;2120:168;2041:247:::0;:::o;1381:1444:7:-;1509:4;1515:10;1631:1;1612:5;:15;;;:20;1608:326;;1652:15;;:22;:27;1648:117;;-1:-1:-1;1707:5:7;;-1:-1:-1;1714:35:7;1699:51;;1648:117;1608:326;;;1811:45;1829:5;:9;;;1840:5;:15;;;1811:17;:45::i;:::-;1785:15;;:22;:71;1781:153;;-1:-1:-1;1880:5:7;;-1:-1:-1;1887:35:7;1872:51;;1781:153;1993:5;:15;;;1980:5;:9;;;:28;1976:98;;-1:-1:-1;2032:5:7;;-1:-1:-1;2039:23:7;2024:39;;1976:98;2170:14;2187:16;2198:4;2187:10;:16::i;:::-;2320:15;;:22;2170:33;;-1:-1:-1;2320:15:7;:27;2316:232;;2367:5;:15;;;2386:1;2367:20;2363:175;;2415:14;;;-1:-1:-1;2431:18:7;;-1:-1:-1;2407:43:7;;2363:175;2497:5;2504:18;2489:34;;;;;;;2363:175;2559:20;2581:16;2601:68;2617:5;:9;;;2628:5;:15;;;2645:6;2653:5;:15;;;2601;:68::i;:::-;2558:111;;-1:-1:-1;2558:111:7;-1:-1:-1;2693:18:7;2684:5;:27;;;;;;;;:::i;:::-;;2680:79;;2735:5;;-1:-1:-1;2742:5:7;-1:-1:-1;2727:21:7;;-1:-1:-1;;2727:21:7;2680:79;-1:-1:-1;2777:20:7;;;-1:-1:-1;2799:18:7;;-1:-1:-1;;1381:1444:7;;;;;;;:::o;2658:162:10:-;966:10:13;2717:7:10;:5;:7::i;:::-;-1:-1:-1;;;;;2717:23:10;;2713:101;;2763:40;;-1:-1:-1;;;2763:40:10;;966:10:13;2763:40:10;;;3462:51:25;3435:18;;2763:40:10;3290:229:25;4599:312:12;4679:4;-1:-1:-1;;;;;4688:6:12;4671:23;;;:120;;;4785:6;-1:-1:-1;;;;;4749:42:12;:32;-1:-1:-1;;;;;;;;;;;2035:53:15;-1:-1:-1;;;;;2035:53:15;;1957:138;4749:32:12;-1:-1:-1;;;;;4749:42:12;;;4671:120;4654:251;;;4865:29;;-1:-1:-1;;;4865:29:12;;;;;;;;;;;4603:84:21;2334:13:10;:11;:13::i;6052:538:12:-;6169:17;-1:-1:-1;;;;;6151:50:12;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6151:52:12;;;;;;;;-1:-1:-1;;6151:52:12;;;;;;;;;;;;:::i;:::-;;;6147:437;;6513:60;;-1:-1:-1;;;6513:60:12;;-1:-1:-1;;;;;3480:32:25;;6513:60:12;;;3462:51:25;3435:18;;6513:60:12;3290:229:25;6147:437:12;-1:-1:-1;;;;;;;;;;;6245:40:12;;6241:120;;6312:34;;-1:-1:-1;;;6312:34:12;;;;;4709:25:25;;;4682:18;;6312:34:12;4563:177:25;6241:120:12;6374:54;6404:17;6423:4;6374:29;:54::i;:::-;6204:235;6052:538;;:::o;5028:213::-;5102:4;-1:-1:-1;;;;;5111:6:12;5094:23;;5090:145;;5195:29;;-1:-1:-1;;;5195:29:12;;;;;;;;;;;2472:222:9;1318:27;2621:22;;-1:-1:-1;;;;;;2621:22:9;;;2653:34;2678:8;2653:24;:34::i;1847:127:10:-;6931:20:11;:18;:20::i;:::-;1929:38:10::1;1954:12;1929:24;:38::i;1461:64:9:-:0;6931:20:11;:18;:20::i;936:1011:4:-;1009:18;1052:1;1039:9;:14;1035:125;;-1:-1:-1;1152:1:4;1145:8;;1035:125;1304:25;1319:9;1304:14;:25::i;:::-;1281:48;;245:3:2;1281:48:4;:::i;:::-;1268:61;-1:-1:-1;1394:28:4;1432:14;1445:1;1268:61;1432:14;:::i;:::-;1426:1;:21;;1394:54;;1567:1;1544:20;:24;;;;:::i;:::-;1537:3;:31;1533:412;;1580:17;;;1533:412;1711:20;1735:1;1711:25;1707:238;;1755:1;1748:8;;;;;1707:238;1859:79;1877:26;1883:20;1877:3;:26;:::i;:::-;1905:32;1917:20;1905:9;:32;:::i;:::-;1859:17;:79::i;:::-;1855:83;;:1;:83;:::i;:::-;1848:90;;;;;1707:238;1029:918;936:1011;;;;;:::o;868:140:8:-;921:14;952:53;340:4:2;976:21:8;;999:4;959:45;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;959:45:8;;;;;;;;;;952:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;7555:1463:7:-;7704:7;7713:10;7743:9;7756:1;7743:14;7739:103;;-1:-1:-1;7781:8:7;;-1:-1:-1;7791:39:7;7773:58;;7739:103;7855:9;7868:1;7855:14;7851:206;;7889:16;;:21;7885:111;;-1:-1:-1;7938:8:7;;-1:-1:-1;7948:32:7;7930:51;;7885:111;-1:-1:-1;8017:8:7;;-1:-1:-1;8027:18:7;8009:37;;7851:206;8070:9;:16;8090:1;8070:21;8066:109;;-1:-1:-1;8115:8:7;;-1:-1:-1;8125:38:7;8107:57;;8066:109;8184:15;8202:25;8217:9;8202:14;:25::i;:::-;8184:43;;8237:30;8270:41;8276:9;8287:1;8309;8290:9;:16;:20;;;;:::i;:::-;8270:5;:41::i;:::-;8237:74;;8321:16;8357:7;8351:3;:13;8347:347;;;8380:16;8430:54;8446:3;8451:7;8460:8;8470:13;8430:15;:54::i;:::-;8410:74;-1:-1:-1;8410:74:7;-1:-1:-1;8511:18:7;8502:5;:27;;;;;;;;:::i;:::-;;8498:90;;-1:-1:-1;8557:8:7;;-1:-1:-1;8567:5:7;-1:-1:-1;8549:24:7;;-1:-1:-1;;8549:24:7;8498:90;8609:53;8620:8;8630:9;8659:1;8640:9;:16;:20;;;;:::i;:::-;8630:31;;;;;;;;:::i;:::-;;;;;;;8609:10;:53::i;:::-;8664:18;8601:82;;;;;;;;;;8347:347;8703:17;8751:76;8767:13;8773:7;8767:3;:13;:::i;:::-;8782:19;8794:7;8782:9;:19;:::i;:::-;8803:8;8813:13;8751:15;:76::i;:::-;8730:97;-1:-1:-1;8730:97:7;-1:-1:-1;8850:18:7;8841:5;:27;;;;;;;;:::i;:::-;;8837:82;;-1:-1:-1;8892:8:7;;-1:-1:-1;8902:5:7;-1:-1:-1;8884:24:7;;-1:-1:-1;;8884:24:7;8837:82;8936:54;8947:9;8976:1;8957:9;:16;:20;;;;:::i;:::-;8947:31;;;;;;;;:::i;:::-;;;;;;;8980:9;8936:10;:54::i;:::-;8992:18;8928:83;;;;;;;;7555:1463;;;;;;;;:::o;2779:335:15:-;2870:37;2889:17;2870:18;:37::i;:::-;2922:27;;-1:-1:-1;;;;;2922:27:15;;;;;;;;2964:11;;:15;2960:148;;2995:53;3024:17;3043:4;2995:28;:53::i;2960:148::-;3079:18;:16;:18::i;3774:248:10:-;1313:22;3923:8;;-1:-1:-1;;;;;;3941:19:10;;-1:-1:-1;;;;;3941:19:10;;;;;;;;3975:40;;3923:8;;;;;3975:40;;3847:24;;3975:40;3837:185;;3774:248;:::o;7084:141:11:-;8870:21;8560:40;-1:-1:-1;;;8560:40:11;;;;7146:73;;7191:17;;-1:-1:-1;;;7191:17:11;;;;;;;;;;;1980:235:10;6931:20:11;:18;:20::i;:::-;-1:-1:-1;;;;;2076:26:10;::::1;2072:95;;2125:31;::::0;-1:-1:-1;;;2125:31:10;;2153:1:::1;2125:31;::::0;::::1;3462:51:25::0;3435:18;;2125:31:10::1;3290:229:25::0;315:362:4;372:19;556:72;584:9;569:11;564:1;:16;;563:30;556:72;;;605:16;620:1;605:16;;:::i;:::-;;;556:72;;;640:34;663:11;245:3:2;640:34:4;:::i;2318:492::-;2367:7;2680:1;2675;:6;;2667:15;;;;;;2689:14;2706:11;2715:1;2706:8;:11::i;:::-;2689:28;-1:-1:-1;2723:9:4;2741:10;2750:1;2689:28;2741:10;:::i;:::-;2735:1;:17;;2723:29;;2767:1;2762;:6;2758:36;;2786:1;2780:7;2806:1;2318:492;-1:-1:-1;;;2318:492:4:o;9485:544:7:-;9577:16;9618:4;9609:6;:13;9605:96;;;9638:52;;-1:-1:-1;;;9638:52:7;;13180:2:25;9638:52:7;;;13162:21:25;13219:2;13199:18;;;13192:30;13258:34;13238:18;;;13231:62;-1:-1:-1;;;13309:18:25;;;13302:40;13359:19;;9638:52:7;12978:406:25;9605:96:7;9723:5;:12;9714:6;:21;:44;;;;9746:5;:12;9739:4;:19;9714:44;9710:132;;;9774:57;;-1:-1:-1;;;9774:57:7;;13591:2:25;9774:57:7;;;13573:21:25;13630:2;13610:18;;;13603:30;13669:34;13649:18;;;13642:62;-1:-1:-1;;;13720:18:25;;;13713:45;13775:19;;9774:57:7;13389:411:25;9710:132:7;9851:20;9888:13;9895:6;9888:4;:13;:::i;:::-;-1:-1:-1;;;;;9874:28:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9874:28:7;-1:-1:-1;9851:51:7;-1:-1:-1;9929:6:7;9912:91;9941:4;9937:1;:8;9912:91;;;9984:5;9990:1;9984:8;;;;;;;;:::i;:::-;;;;;;;9966:3;9974:6;9970:1;:10;;;;:::i;:::-;9966:15;;;;;;;;:::i;:::-;;;;;;;;;;:26;9947:3;;9912:91;;;-1:-1:-1;10019:3:7;9485:544;-1:-1:-1;;;;9485:544:7:o;415:157:8:-;516:52;;-1:-1:-1;;;516:52:8;;;13988:39:25;14043:11;;;14036:27;;;14079:12;;;14072:28;;;478:14:8;;509:60;;14116:12:25;;516:52:8;;;-1:-1:-1;;516:52:8;;;;;;;;;;509:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;2186:281:15:-;2263:17;-1:-1:-1;;;;;2263:29:15;;2296:1;2263:34;2259:119;;2320:47;;-1:-1:-1;;;2320:47:15;;-1:-1:-1;;;;;3480:32:25;;2320:47:15;;;3462:51:25;3435:18;;2320:47:15;3290:229:25;2259:119:15;-1:-1:-1;;;;;;;;;;;2387:73:15;;-1:-1:-1;;;;;;2387:73:15;-1:-1:-1;;;;;2387:73:15;;;;;;;;;;2186:281::o;4106:253:17:-;4189:12;4214;4228:23;4255:6;-1:-1:-1;;;;;4255:19:17;4275:4;4255:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4213:67;;;;4297:55;4324:6;4332:7;4341:10;4297:26;:55::i;:::-;4290:62;4106:253;-1:-1:-1;;;;;4106:253:17:o;6598:122:15:-;6648:9;:13;6644:70;;6684:19;;-1:-1:-1;;;6684:19:15;;;;;;;;;;;2078:159:4;2121:7;;2160:56;2167:6;;2160:56;;2185:7;;;;:::i;:::-;;;;2208:1;2202:7;;;;;2160:56;;4625:582:17;4769:12;4798:7;4793:408;;4821:19;4829:10;4821:7;:19::i;:::-;4793:408;;;5045:17;;:22;:49;;;;-1:-1:-1;;;;;;5071:18:17;;;:23;5045:49;5041:119;;;5121:24;;-1:-1:-1;;;5121:24:17;;-1:-1:-1;;;;;3480:32:25;;5121:24:17;;;3462:51:25;3435:18;;5121:24:17;3290:229:25;5041:119:17;-1:-1:-1;5180:10:17;5173:17;;5743:516;5874:17;;:21;5870:383;;6102:10;6096:17;6158:15;6145:10;6141:2;6137:19;6130:44;5870:383;6225:17;;-1:-1:-1;;;6225:17:17;;;;;;;;;;;14:127:25;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:257;218:4;212:11;;;250:17;;-1:-1:-1;;;;;282:34:25;;318:22;;;279:62;276:88;;;344:18;;:::i;:::-;380:4;373:24;146:257;:::o;408:251::-;480:2;474:9;522:2;510:15;;-1:-1:-1;;;;;540:34:25;;576:22;;;537:62;534:88;;;602:18;;:::i;664:275::-;735:2;729:9;800:2;781:13;;-1:-1:-1;;777:27:25;765:40;;-1:-1:-1;;;;;820:34:25;;856:22;;;817:62;814:88;;;882:18;;:::i;:::-;918:2;911:22;664:275;;-1:-1:-1;664:275:25:o;944:1716::-;1083:6;1091;1099;1143:9;1134:7;1130:23;1173:3;1169:2;1165:12;1162:32;;;1190:1;1187;1180:12;1162:32;1213:23;;;-1:-1:-1;1255:2:25;1291:4;-1:-1:-1;;1273:16:25;;1269:27;1266:47;;;1309:1;1306;1299:12;1266:47;1335:22;;:::i;:::-;1393:18;;;1380:32;1366:47;;1473:4;1458:20;;1445:34;1429:14;;;1422:58;1322:35;-1:-1:-1;1555:2:25;1540:18;;1527:32;;-1:-1:-1;;;;;;1608:14:25;;;1605:34;;;1635:1;1632;1625:12;1605:34;1658:22;;;;1714:2;1696:16;;;1692:25;1689:45;;;1730:1;1727;1720:12;1689:45;1758:22;;:::i;:::-;1818:2;1805:16;1846:2;1836:8;1833:16;1830:36;;;1862:1;1859;1852:12;1830:36;1885:17;;1933:4;1925:13;;1921:27;-1:-1:-1;1911:55:25;;1962:1;1959;1952:12;1911:55;1998:2;1985:16;2020:2;2016;2013:10;2010:36;;;2026:18;;:::i;:::-;2072:2;2069:1;2065:10;2055:20;;2095:28;2119:2;2115;2111:11;2095:28;:::i;:::-;2157:15;;;2227:11;;;2223:20;;;2188:12;;;;2255:19;;;2252:39;;;2287:1;2284;2277:12;2252:39;2311:11;;;;2331:142;2347:6;2342:3;2339:15;2331:142;;;2413:17;;2401:30;;2364:12;;;;2451;;;;2331:142;;;2498:5;2489:7;2482:22;;;;;2559:2;2555;2551:11;2538:25;2533:2;2524:7;2520:16;2513:51;2621:4;2617:2;2613:13;2600:27;2593:4;2584:7;2580:18;2573:55;2647:7;2637:17;;;;;;944:1716;;;;;:::o;2857:171::-;2924:20;;-1:-1:-1;;;;;2973:30:25;;2963:41;;2953:69;;3018:1;3015;3008:12;2953:69;2857:171;;;:::o;3033:252::-;3100:6;3108;3161:2;3149:9;3140:7;3136:23;3132:32;3129:52;;;3177:1;3174;3167:12;3129:52;3213:9;3200:23;3190:33;;3242:37;3275:2;3264:9;3260:18;3242:37;:::i;:::-;3232:47;;3033:252;;;;;:::o;3524:131::-;-1:-1:-1;;;;;3599:31:25;;3589:42;;3579:70;;3645:1;3642;3635:12;3660:898;3737:6;3745;3798:2;3786:9;3777:7;3773:23;3769:32;3766:52;;;3814:1;3811;3804:12;3766:52;3853:9;3840:23;3872:31;3897:5;3872:31;:::i;:::-;3922:5;-1:-1:-1;3946:2:25;3984:18;;;3971:32;-1:-1:-1;;;;;4052:14:25;;;4049:34;;;4079:1;4076;4069:12;4049:34;4117:6;4106:9;4102:22;4092:32;;4162:7;4155:4;4151:2;4147:13;4143:27;4133:55;;4184:1;4181;4174:12;4133:55;4220:2;4207:16;4242:2;4238;4235:10;4232:36;;;4248:18;;:::i;:::-;4290:53;4333:2;4314:13;;-1:-1:-1;;4310:27:25;4306:36;;4290:53;:::i;:::-;4277:66;;4366:2;4359:5;4352:17;4406:7;4401:2;4396;4392;4388:11;4384:20;4381:33;4378:53;;;4427:1;4424;4417:12;4378:53;4482:2;4477;4473;4469:11;4464:2;4457:5;4453:14;4440:45;4526:1;4521:2;4516;4509:5;4505:14;4501:23;4494:34;;4547:5;4537:15;;;;;3660:898;;;;;:::o;5158:180::-;5217:6;5270:2;5258:9;5249:7;5245:23;5241:32;5238:52;;;5286:1;5283;5276:12;5238:52;-1:-1:-1;5309:23:25;;5158:180;-1:-1:-1;5158:180:25:o;5343:250::-;5428:1;5438:113;5452:6;5449:1;5446:13;5438:113;;;5528:11;;;5522:18;5509:11;;;5502:39;5474:2;5467:10;5438:113;;;-1:-1:-1;;5585:1:25;5567:16;;5560:27;5343:250::o;5598:396::-;5747:2;5736:9;5729:21;5710:4;5779:6;5773:13;5822:6;5817:2;5806:9;5802:18;5795:34;5838:79;5910:6;5905:2;5894:9;5890:18;5885:2;5877:6;5873:15;5838:79;:::i;:::-;5978:2;5957:15;-1:-1:-1;;5953:29:25;5938:45;;;;5985:2;5934:54;;5598:396;-1:-1:-1;;5598:396:25:o;5999:347::-;6050:8;6060:6;6114:3;6107:4;6099:6;6095:17;6091:27;6081:55;;6132:1;6129;6122:12;6081:55;-1:-1:-1;6155:20:25;;-1:-1:-1;;;;;6187:30:25;;6184:50;;;6230:1;6227;6220:12;6184:50;6267:4;6259:6;6255:17;6243:29;;6319:3;6312:4;6303:6;6295;6291:19;6287:30;6284:39;6281:59;;;6336:1;6333;6326:12;6281:59;5999:347;;;;;:::o;6351:717::-;6441:6;6449;6457;6465;6518:2;6506:9;6497:7;6493:23;6489:32;6486:52;;;6534:1;6531;6524:12;6486:52;6574:9;6561:23;-1:-1:-1;;;;;6644:2:25;6636:6;6633:14;6630:34;;;6660:1;6657;6650:12;6630:34;6699:58;6749:7;6740:6;6729:9;6725:22;6699:58;:::i;:::-;6776:8;;-1:-1:-1;6673:84:25;-1:-1:-1;6864:2:25;6849:18;;6836:32;;-1:-1:-1;6880:16:25;;;6877:36;;;6909:1;6906;6899:12;6877:36;;6948:60;7000:7;6989:8;6978:9;6974:24;6948:60;:::i;:::-;6351:717;;;;-1:-1:-1;7027:8:25;-1:-1:-1;;;;6351:717:25:o;7255:628::-;7374:6;7382;7390;7398;7406;7459:3;7447:9;7438:7;7434:23;7430:33;7427:53;;;7476:1;7473;7466:12;7427:53;7515:9;7502:23;7534:31;7559:5;7534:31;:::i;:::-;7584:5;-1:-1:-1;7641:2:25;7626:18;;7613:32;7654:33;7613:32;7654:33;:::i;:::-;7706:7;-1:-1:-1;7760:2:25;7745:18;;7732:32;;-1:-1:-1;7783:37:25;7816:2;7801:18;;7783:37;:::i;:::-;7773:47;;7839:38;7872:3;7861:9;7857:19;7839:38;:::i;:::-;7829:48;;7255:628;;;;;;;;:::o;7888:273::-;7973:6;8026:2;8014:9;8005:7;8001:23;7997:32;7994:52;;;8042:1;8039;8032:12;7994:52;8081:9;8068:23;8100:31;8125:5;8100:31;:::i;8726:719::-;8818:6;8871:3;8859:9;8850:7;8846:23;8842:33;8839:53;;;8888:1;8885;8878:12;8839:53;8921:2;8915:9;8963:3;8955:6;8951:16;9033:6;9021:10;9018:22;-1:-1:-1;;;;;8985:10:25;8982:34;8979:62;8976:88;;;9044:18;;:::i;:::-;9080:2;9073:22;9119:23;;9104:39;;9176:37;9209:2;9194:18;;9176:37;:::i;:::-;9171:2;9163:6;9159:15;9152:62;9275:2;9264:9;9260:18;9247:32;9242:2;9234:6;9230:15;9223:57;9341:2;9330:9;9326:18;9313:32;9308:2;9300:6;9296:15;9289:57;9408:3;9397:9;9393:19;9380:33;9374:3;9366:6;9362:16;9355:59;9433:6;9423:16;;;8726:719;;;;:::o;9450:127::-;9511:10;9506:3;9502:20;9499:1;9492:31;9542:4;9539:1;9532:15;9566:4;9563:1;9556:15;9582:180;-1:-1:-1;;;;;9687:10:25;;;9699;;;9683:27;;9722:11;;;9719:37;;;9736:18;;:::i;9767:271::-;9950:6;9942;9937:3;9924:33;9906:3;9976:16;;10001:13;;;9976:16;9767:271;-1:-1:-1;9767:271:25:o;10043:184::-;10113:6;10166:2;10154:9;10145:7;10141:23;10137:32;10134:52;;;10182:1;10179;10172:12;10134:52;-1:-1:-1;10205:16:25;;10043:184;-1:-1:-1;10043:184:25:o;10232:535::-;10445:2;10434:9;10427:21;10484:6;10479:2;10468:9;10464:18;10457:34;10542:6;10534;10528:3;10517:9;10513:19;10500:49;10599:1;10593:3;10584:6;10573:9;10569:22;10565:32;10558:43;10408:4;10669:3;10662:2;10658:7;10653:2;10645:6;10641:15;10637:29;10626:9;10622:45;10618:55;10610:63;;10711:6;10704:4;10693:9;10689:20;10682:36;10754:6;10749:2;10738:9;10734:18;10727:34;10232:535;;;;;;;:::o;11423:135::-;11462:3;11483:17;;;11480:43;;11503:18;;:::i;:::-;-1:-1:-1;11550:1:25;11539:13;;11423:135::o;11777:127::-;11838:10;11833:3;11829:20;11826:1;11819:31;11869:4;11866:1;11859:15;11893:4;11890:1;11883:15;11909:128;11976:9;;;11997:11;;;11994:37;;;12011:18;;:::i;12042:125::-;12107:9;;;12128:10;;;12125:36;;;12141:18;;:::i;12172:377::-;-1:-1:-1;;;;;;12357:26:25;;12345:39;;12407:13;;12327:3;;12429:74;12407:13;12492:1;12483:11;;12476:4;12464:17;;12429:74;:::i;:::-;12523:16;;;;12541:1;12519:24;;12172:377;-1:-1:-1;;;12172:377:25:o;12554:287::-;12683:3;12721:6;12715:13;12737:66;12796:6;12791:3;12784:4;12776:6;12772:17;12737:66;:::i;:::-;12819:16;;;;;12554:287;-1:-1:-1;;12554:287:25:o;12846:127::-;12907:10;12902:3;12898:20;12895:1;12888:31;12938:4;12935:1;12928:15;12962:4;12959:1;12952:15" }, "id": 21, @@ -1428,11 +1428,11 @@ ] }, "src/ImageID.sol": { - "keccak256": "0xe5c5d515bdcada16d71aec20889b6cdd059e477255012d572987fadc580c1a9a", + "keccak256": "0x0a4aace1c9d03ed7673a7d357353bcc48544df26a11db00b4424d78b1a05ab18", "license": "Apache-2.0", "urls": [ - "bzz-raw://c6a301d00b58e236c81950ba7de3ad893d06a668eb23138544adaf2f980a5a02", - "dweb:/ipfs/QmVDo4S2BobbNsM1hwUgnJ1ebQQ2fNYRA8H8Bmp5Udvg9J" + "bzz-raw://5c8704fdbd94eb7de7a84cac3a7e318a2edb73ecc8fd85985e2d871e065bf2f5", + "dweb:/ipfs/QmVRw7kDpKUAkTVfjqWSua62Fig3vhGqLmrW7S3dXuoXwx" ] }, "src/RangeCommitment.sol": { @@ -1468,5 +1468,5 @@ "verifier()": "2b7ac3f3", "verifyAttestation(uint256,(uint256,bytes32),(bytes32[],uint256,uint256))": "1f3302a9" }, - "rawMetadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"ERC1967InvalidImplementation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1967NonPayable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedInnerCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTargetHeight\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTrustedHeaderHash\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UUPSUnauthorizedCallContext\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"slot\",\"type\":\"bytes32\"}],\"name\":\"UUPSUnsupportedProxiableUUID\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proofNonce\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"startBlock\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"endBlock\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"dataCommitment\",\"type\":\"bytes32\"}],\"name\":\"DataCommitmentStored\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"blockNumber\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"headerHash\",\"type\":\"bytes32\"}],\"name\":\"HeadUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"trustedBlock\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"targetBlock\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"validatorBitmap\",\"type\":\"uint256\"}],\"name\":\"ValidatorBitmapEquivocation\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"UPGRADE_INTERFACE_VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_imageId\",\"type\":\"bytes32\"}],\"name\":\"adminSetImageId\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_trustedHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"_trustedHeight\",\"type\":\"uint64\"}],\"name\":\"adminSetTrustedState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRiscZeroVerifier\",\"name\":\"_verifier\",\"type\":\"address\"}],\"name\":\"adminSetVerifier\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"imageId\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_admin\",\"type\":\"address\"},{\"internalType\":\"contract IRiscZeroVerifier\",\"name\":\"_verifier\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"_trustedHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"_trustedHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"_minBatchSize\",\"type\":\"uint64\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestBlockHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestHeight\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"minBatchSize\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proofNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_commitBytes\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_seal\",\"type\":\"bytes\"}],\"name\":\"updateRange\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"verifier\",\"outputs\":[{\"internalType\":\"contract IRiscZeroVerifier\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_proofNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"height\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"dataRoot\",\"type\":\"bytes32\"}],\"internalType\":\"struct DataRootTuple\",\"name\":\"_tuple\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bytes32[]\",\"name\":\"sideNodes\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"key\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"numLeaves\",\"type\":\"uint256\"}],\"internalType\":\"struct BinaryMerkleProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"verifyAttestation\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AddressEmptyCode(address)\":[{\"details\":\"There's no code at `target` (it is not a contract).\"}],\"ERC1967InvalidImplementation(address)\":[{\"details\":\"The `implementation` of the proxy is invalid.\"}],\"ERC1967NonPayable()\":[{\"details\":\"An upgrade function sees `msg.value > 0` that may be lost.\"}],\"FailedInnerCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}],\"OwnableInvalidOwner(address)\":[{\"details\":\"The owner is not a valid owner account. (eg. `address(0)`)\"}],\"OwnableUnauthorizedAccount(address)\":[{\"details\":\"The caller account is not authorized to perform an operation.\"}],\"UUPSUnauthorizedCallContext()\":[{\"details\":\"The call is from an unauthorized context.\"}],\"UUPSUnsupportedProxiableUUID(bytes32)\":[{\"details\":\"The storage `slot` is unsupported as a UUID.\"}]},\"events\":{\"DataCommitmentStored(uint256,uint64,uint64,bytes32)\":{\"params\":{\"dataCommitment\":\"The data commitment for the block range.\",\"endBlock\":\"The end block of the block range.\",\"proofNonce\":\"The nonce of the proof.\",\"startBlock\":\"The start block of the block range.\"}},\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"},\"ValidatorBitmapEquivocation(uint64,uint64,uint256)\":{\"params\":{\"targetBlock\":\"The target block of the block range.\",\"trustedBlock\":\"The trusted block of the block range.\",\"validatorBitmap\":\"The validator bitmap for the block range.\"}}},\"kind\":\"dev\",\"methods\":{\"acceptOwnership()\":{\"details\":\"The new owner accepts the ownership transfer.\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"pendingOwner()\":{\"details\":\"Returns the address of the pending owner.\"},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. Can only be called by the current owner.\"},\"upgradeToAndCall(address,bytes)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"verifyAttestation(uint256,(uint256,bytes32),(bytes32[],uint256,uint256))\":{\"params\":{\"_proof\":\"Binary Merkle tree proof that `tuple` is in the root at `_tupleRootNonce`.\",\"_proofNonce\":\"Nonce of the tuple root to prove against.\",\"_tuple\":\"Data root tuple to prove inclusion of.\"},\"returns\":{\"_0\":\"`true` is proof is valid, `false` otherwise.\"}}},\"stateVariables\":{\"latestBlockHash\":{\"details\":\"always update this in tandem with `latestHeight`\"},\"latestHeight\":{\"details\":\"this value is 64 bits as is the max for heights in Tendermint.\"},\"minBatchSize\":{\"details\":\"This is to ensure there is no DOS condition from doing single/small batch updates.\"}},\"title\":\"A starter application using RISC Zero.\",\"version\":1},\"userdoc\":{\"errors\":{\"InvalidTargetHeight()\":[{\"notice\":\"Target height for next batch was below the current height.\"}],\"InvalidTrustedHeaderHash()\":[{\"notice\":\"Trusted block hash does not equal the commitment from the new batch.\"}]},\"events\":{\"DataCommitmentStored(uint256,uint64,uint64,bytes32)\":{\"notice\":\"Data commitment stored for the block range [startBlock, endBlock) with proof nonce. NOTE: This event matches existing Blobstream contracts, for ease of integration.\"},\"HeadUpdate(uint64,bytes32)\":{\"notice\":\"Emits event with the new head update. NOTE: Matches existing Blobstream contract, for ease of integration.\"},\"ValidatorBitmapEquivocation(uint64,uint64,uint256)\":{\"notice\":\"Validator bitmap of the intersection of validators that signed off on both the trusted block and the new header. This event is emitted to allow for slashing equivocations. NOTE: This event matches existing Blobstream contracts, for ease of integration.\"}},\"kind\":\"user\",\"methods\":{\"adminSetImageId(bytes32)\":{\"notice\":\"Only the admin can update. Updates the image ID to verify proofs against.\"},\"adminSetTrustedState(bytes32,uint64)\":{\"notice\":\"Only the admin can update. Updates the trusted height and block hash to sync from.\"},\"adminSetVerifier(address)\":{\"notice\":\"Only the admin can update. Updates the verifier contract address.\"},\"imageId()\":{\"notice\":\"Image ID of the only zkVM binary to accept verification from. The image ID is similar to the address of a smart contract. It uniquely represents the logic of that guest program, ensuring that only proofs generated from a pre-defined guest program.\"},\"latestBlockHash()\":{\"notice\":\"The latest block hash validated.\"},\"latestHeight()\":{\"notice\":\"The latest height validated.\"},\"minBatchSize()\":{\"notice\":\"Minimum number of blocks required for a valid batch update. The batch size must be larger than this value.\"},\"proofNonce()\":{\"notice\":\"nonce for mapping block ranges to block merkle roots. This value is used as the key to insert new roots in `merkleRoots`.\"},\"updateRange(bytes,bytes)\":{\"notice\":\"Validate a proof of a new header range, update state.\"},\"verifier()\":{\"notice\":\"RISC Zero verifier contract address.\"},\"verifyAttestation(uint256,(uint256,bytes32),(bytes32[],uint256,uint256))\":{\"notice\":\"Verify a Data Availability attestation. Method of IDAOracle from Blobstream contract.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/Blobstream0.sol\":\"Blobstream0\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":blobstream-contracts/=lib/blobstream-contracts/src/\",\":blobstream/=lib/blobstream-contracts/src/\",\":ds-test/=lib/blobstream-contracts/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin/=lib/openzeppelin-contracts/\",\":risc0-ethereum/=lib/risc0-ethereum/\",\":risc0/=lib/risc0-ethereum/contracts/src/\",\":tree/=lib/blobstream-contracts/src/lib/tree/\",\":verifier/=lib/blobstream-contracts/src/lib/verifier/\"]},\"sources\":{\"lib/blobstream-contracts/src/DataRootTuple.sol\":{\"keccak256\":\"0x0526597d14a6d7f258ec48e434a9b60c9a8781764a8f23c878d49926daeb5d1c\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://06ee253f8d0f58dbe66c64cb5d2945182ba3bced088167472d8f953cec421916\",\"dweb:/ipfs/QmUF9jjr6bH3pPgjGAZqYhsUn7EevqU7kZn8RBqQ4EoU2w\"]},\"lib/blobstream-contracts/src/IDAOracle.sol\":{\"keccak256\":\"0xc35648b17d3587bc3a627f67a328874db536ee24c11b970c3c57226d69a32eec\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://362610301e6057d10777c84111d4bb43af53af75a488fb8ab8666a775302a3fc\",\"dweb:/ipfs/QmURgSTYhiguV1oCUARaTTWrpFHg5nMEtxhPVcpUDuEKq6\"]},\"lib/blobstream-contracts/src/lib/tree/Constants.sol\":{\"keccak256\":\"0x2050b2be8a739ce250cc5cea1556936c7937915b5d7fde269dd70e8e7eb660c4\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://946ea30d1001048a800f60bb24d2ab7ecf5f92ae2abd212f3f855e37a6840ce7\",\"dweb:/ipfs/QmW2PnhAB5h2eCCM6Vafg8ZUpBttjLTbBhtXjJh3SSrYEN\"]},\"lib/blobstream-contracts/src/lib/tree/Types.sol\":{\"keccak256\":\"0xa47e9e20fef88264acdf1fc6bc0b3bb9f23c7022f5de8d203a1014895a606958\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://d480249b6adf8730bffcf26eed5902eb9fd1d56d11f931b35a9e19c6415b3f47\",\"dweb:/ipfs/QmPCrcMmQdNMYG232WxEg2zZRFvXQqdEZgwQNMaDJ2oNab\"]},\"lib/blobstream-contracts/src/lib/tree/Utils.sol\":{\"keccak256\":\"0xee3f228310a87022dbff84e35bc1c0b281fa1bb3722d3c5e43e578a76a98d234\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f59a41b4286c04a3382345b989a4536fa41b35af8babeabd40887bdbe44c77f6\",\"dweb:/ipfs/QmQTbyLnRY977aCidNGAUQi577qf7ABXe3xoR6yYa6xcVc\"]},\"lib/blobstream-contracts/src/lib/tree/binary/BinaryMerkleMultiproof.sol\":{\"keccak256\":\"0xbb0e2cc90b98961f000ee8ecec9a4af22f1fbabd01fd4f6da4366261caa95bcd\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://db56e64e241915f98a47991c512d61ed13bbc444f602b3f445e8635055dcd32c\",\"dweb:/ipfs/QmQxBdpnsqXaC81QXwar8AY9XroSWL7VxLCkdc3qtPLo6J\"]},\"lib/blobstream-contracts/src/lib/tree/binary/BinaryMerkleProof.sol\":{\"keccak256\":\"0x9fb953284b455b544091f058fdb11ac73928093517333909c0744d9319410688\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://938230a60210345fe7cc661708c4fe0db663a5f5b5306f05fe4023b44f104b6e\",\"dweb:/ipfs/QmUvcJuDmwnbRzXX5qgV4Mckg6ujvMeo46SrTPvgpPhFSF\"]},\"lib/blobstream-contracts/src/lib/tree/binary/BinaryMerkleTree.sol\":{\"keccak256\":\"0x5ec8b9caa0c9cfd0917107090c108484ac909ee50735cd507278b4ed68c15cf4\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://0110303440a7123bd17175bec4010943c953c6223e5c2a7f40cfa49599e20979\",\"dweb:/ipfs/QmYMMzShtUxdn5MuzqgNzdKrtDdXQWfWHRN6pZJfZLuckc\"]},\"lib/blobstream-contracts/src/lib/tree/binary/TreeHasher.sol\":{\"keccak256\":\"0x2f16501eac14f6e2a61de29d3aa10e3aaf8e0a594fc9cf8dc2d955bb2f6d54e0\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://984a2e5d52cfdd38f2c597bddc4a2de8ad1e4dd9c81008376569a29c74fa963e\",\"dweb:/ipfs/QmaXhfHD58Jv4nSw3qw2hGwbDSPKDjFzPNYWm9Y4KWiigm\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/access/Ownable2StepUpgradeable.sol\":{\"keccak256\":\"0xbca4a4f66d98028293dba695851d1b20d3e0ba2fff7453fb241f192fa3fc6b6f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://013b3cfd9d1e34dad409c3b9a340860e8651e61cda509de33599fb5102f62fe7\",\"dweb:/ipfs/QmTVjDKofM9Nst8w8LAA3HHgi1eCnGYBpFb7Nbat71e2xz\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0xc163fcf9bb10138631a9ba5564df1fa25db9adff73bd9ee868a8ae1858fe093a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9706d43a0124053d9880f6e31a59f31bc0a6a3dc1acd66ce0a16e1111658c5f6\",\"dweb:/ipfs/QmUFmfowzkRwGtDu36cXV9SPTBHJ3n7dG9xQiK5B28jTf2\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609\",\"dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol\":{\"keccak256\":\"0x3f13b947637c4969c0644cab4ef399cdc4b67f101463b8775c5a43b118558e53\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c6683e6ade6985d394d32baaef5eea0d8b9ff0b3eca86ae413d6cdde114a9930\",\"dweb:/ipfs/QmdBE8T1BTddZxpdECMsb3KiCFyjNWmxcCddYrWFTXmWPj\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://08e39f23d5b4692f9a40803e53a8156b72b4c1f9902a88cd65ba964db103dab9\",\"dweb:/ipfs/QmPKn6EYDgpga7KtpkA8wV2yJCYGMtc9K4LkJfhKX2RVSV\"]},\"lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol\":{\"keccak256\":\"0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ef381843676aec64421200ee85eaa0b1356a35f28b9fc67e746a6bbb832077d9\",\"dweb:/ipfs/QmY8aorMYA2TeTCnu6ejDjzb4rW4t7TCtW4GZ6LoxTFm7v\"]},\"lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Utils.sol\":{\"keccak256\":\"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a\",\"dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE\"]},\"lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol\":{\"keccak256\":\"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa\",\"dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM\"]},\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245\",\"dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y\"]},\"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c\",\"dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR\"]},\"lib/risc0-ethereum/contracts/src/IRiscZeroVerifier.sol\":{\"keccak256\":\"0x19341f62c8fe3c0945ebffa4f25d49706ded741af98eaacb7ade824c947f61a4\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5d443c7187fd565e25acdfd3df63f14421d06dda0839470cb475546f7c9908c0\",\"dweb:/ipfs/QmeaHPjKmGZBC15iiYKsDCY1k2UY3iYZiNB6Pdc8ow6aVX\"]},\"lib/risc0-ethereum/contracts/src/Util.sol\":{\"keccak256\":\"0x230a9a58bb2b0c68d4921ecc3672783f941890a2fa3a238dbe5188cfb7658b82\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://586cb5296c564761609ca8aaae5b1fbbdb19ab1e174f7197f602572d9e82b70c\",\"dweb:/ipfs/QmWxDmucSfg3Wgdk1rVcheDHwkziTsXWvKpKSCnxtpQBqg\"]},\"src/Blobstream0.sol\":{\"keccak256\":\"0x6397ef609581ad923f2acbfb08981795a4f71ffeec3b3581a42c3f0eb7a5617b\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://cf6412935bfc839d02a7e2246b35c4bc5eb748f396de6f088e570506ec7ef9ac\",\"dweb:/ipfs/QmZAjwPwL4P13PiWm11e34gMd1QoC5P1d1jSLXAzww2Ajp\"]},\"src/ImageID.sol\":{\"keccak256\":\"0xe5c5d515bdcada16d71aec20889b6cdd059e477255012d572987fadc580c1a9a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c6a301d00b58e236c81950ba7de3ad893d06a668eb23138544adaf2f980a5a02\",\"dweb:/ipfs/QmVDo4S2BobbNsM1hwUgnJ1ebQQ2fNYRA8H8Bmp5Udvg9J\"]},\"src/RangeCommitment.sol\":{\"keccak256\":\"0x66fb6ad1bd00e6b4bb3d3e2a8a2c7c5c224257ff4fc34043d1e8bbd507a22c1a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://9067a0704579a69248972a133be63dfe67dccb8797bc0c16358b7bde9188424d\",\"dweb:/ipfs/QmWDW5YoJ6Scfn9HRnpgwoVehvkdFoSi9p9FY86eLYh2X7\"]}},\"version\":1}" + "rawMetadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"ERC1967InvalidImplementation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1967NonPayable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedInnerCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTargetHeight\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTrustedHeaderHash\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UUPSUnauthorizedCallContext\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"slot\",\"type\":\"bytes32\"}],\"name\":\"UUPSUnsupportedProxiableUUID\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proofNonce\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"startBlock\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"endBlock\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"dataCommitment\",\"type\":\"bytes32\"}],\"name\":\"DataCommitmentStored\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"blockNumber\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"headerHash\",\"type\":\"bytes32\"}],\"name\":\"HeadUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"trustedBlock\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"targetBlock\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"validatorBitmap\",\"type\":\"uint256\"}],\"name\":\"ValidatorBitmapEquivocation\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"UPGRADE_INTERFACE_VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_imageId\",\"type\":\"bytes32\"}],\"name\":\"adminSetImageId\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_trustedHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"_trustedHeight\",\"type\":\"uint64\"}],\"name\":\"adminSetTrustedState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRiscZeroVerifier\",\"name\":\"_verifier\",\"type\":\"address\"}],\"name\":\"adminSetVerifier\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"imageId\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_admin\",\"type\":\"address\"},{\"internalType\":\"contract IRiscZeroVerifier\",\"name\":\"_verifier\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"_trustedHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"_trustedHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"_minBatchSize\",\"type\":\"uint64\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestBlockHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestHeight\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"minBatchSize\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proofNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_commitBytes\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_seal\",\"type\":\"bytes\"}],\"name\":\"updateRange\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"verifier\",\"outputs\":[{\"internalType\":\"contract IRiscZeroVerifier\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_proofNonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"height\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"dataRoot\",\"type\":\"bytes32\"}],\"internalType\":\"struct DataRootTuple\",\"name\":\"_tuple\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bytes32[]\",\"name\":\"sideNodes\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"key\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"numLeaves\",\"type\":\"uint256\"}],\"internalType\":\"struct BinaryMerkleProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"verifyAttestation\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AddressEmptyCode(address)\":[{\"details\":\"There's no code at `target` (it is not a contract).\"}],\"ERC1967InvalidImplementation(address)\":[{\"details\":\"The `implementation` of the proxy is invalid.\"}],\"ERC1967NonPayable()\":[{\"details\":\"An upgrade function sees `msg.value > 0` that may be lost.\"}],\"FailedInnerCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}],\"OwnableInvalidOwner(address)\":[{\"details\":\"The owner is not a valid owner account. (eg. `address(0)`)\"}],\"OwnableUnauthorizedAccount(address)\":[{\"details\":\"The caller account is not authorized to perform an operation.\"}],\"UUPSUnauthorizedCallContext()\":[{\"details\":\"The call is from an unauthorized context.\"}],\"UUPSUnsupportedProxiableUUID(bytes32)\":[{\"details\":\"The storage `slot` is unsupported as a UUID.\"}]},\"events\":{\"DataCommitmentStored(uint256,uint64,uint64,bytes32)\":{\"params\":{\"dataCommitment\":\"The data commitment for the block range.\",\"endBlock\":\"The end block of the block range.\",\"proofNonce\":\"The nonce of the proof.\",\"startBlock\":\"The start block of the block range.\"}},\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"},\"ValidatorBitmapEquivocation(uint64,uint64,uint256)\":{\"params\":{\"targetBlock\":\"The target block of the block range.\",\"trustedBlock\":\"The trusted block of the block range.\",\"validatorBitmap\":\"The validator bitmap for the block range.\"}}},\"kind\":\"dev\",\"methods\":{\"acceptOwnership()\":{\"details\":\"The new owner accepts the ownership transfer.\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"pendingOwner()\":{\"details\":\"Returns the address of the pending owner.\"},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. Can only be called by the current owner.\"},\"upgradeToAndCall(address,bytes)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"verifyAttestation(uint256,(uint256,bytes32),(bytes32[],uint256,uint256))\":{\"params\":{\"_proof\":\"Binary Merkle tree proof that `tuple` is in the root at `_tupleRootNonce`.\",\"_proofNonce\":\"Nonce of the tuple root to prove against.\",\"_tuple\":\"Data root tuple to prove inclusion of.\"},\"returns\":{\"_0\":\"`true` is proof is valid, `false` otherwise.\"}}},\"stateVariables\":{\"latestBlockHash\":{\"details\":\"always update this in tandem with `latestHeight`\"},\"latestHeight\":{\"details\":\"this value is 64 bits as is the max for heights in Tendermint.\"},\"minBatchSize\":{\"details\":\"This is to ensure there is no DOS condition from doing single/small batch updates.\"}},\"title\":\"A starter application using RISC Zero.\",\"version\":1},\"userdoc\":{\"errors\":{\"InvalidTargetHeight()\":[{\"notice\":\"Target height for next batch was below the current height.\"}],\"InvalidTrustedHeaderHash()\":[{\"notice\":\"Trusted block hash does not equal the commitment from the new batch.\"}]},\"events\":{\"DataCommitmentStored(uint256,uint64,uint64,bytes32)\":{\"notice\":\"Data commitment stored for the block range [startBlock, endBlock) with proof nonce. NOTE: This event matches existing Blobstream contracts, for ease of integration.\"},\"HeadUpdate(uint64,bytes32)\":{\"notice\":\"Emits event with the new head update. NOTE: Matches existing Blobstream contract, for ease of integration.\"},\"ValidatorBitmapEquivocation(uint64,uint64,uint256)\":{\"notice\":\"Validator bitmap of the intersection of validators that signed off on both the trusted block and the new header. This event is emitted to allow for slashing equivocations. NOTE: This event matches existing Blobstream contracts, for ease of integration.\"}},\"kind\":\"user\",\"methods\":{\"adminSetImageId(bytes32)\":{\"notice\":\"Only the admin can update. Updates the image ID to verify proofs against.\"},\"adminSetTrustedState(bytes32,uint64)\":{\"notice\":\"Only the admin can update. Updates the trusted height and block hash to sync from.\"},\"adminSetVerifier(address)\":{\"notice\":\"Only the admin can update. Updates the verifier contract address.\"},\"imageId()\":{\"notice\":\"Image ID of the only zkVM binary to accept verification from. The image ID is similar to the address of a smart contract. It uniquely represents the logic of that guest program, ensuring that only proofs generated from a pre-defined guest program.\"},\"latestBlockHash()\":{\"notice\":\"The latest block hash validated.\"},\"latestHeight()\":{\"notice\":\"The latest height validated.\"},\"minBatchSize()\":{\"notice\":\"Minimum number of blocks required for a valid batch update. The batch size must be larger than this value.\"},\"proofNonce()\":{\"notice\":\"nonce for mapping block ranges to block merkle roots. This value is used as the key to insert new roots in `merkleRoots`.\"},\"updateRange(bytes,bytes)\":{\"notice\":\"Validate a proof of a new header range, update state.\"},\"verifier()\":{\"notice\":\"RISC Zero verifier contract address.\"},\"verifyAttestation(uint256,(uint256,bytes32),(bytes32[],uint256,uint256))\":{\"notice\":\"Verify a Data Availability attestation. Method of IDAOracle from Blobstream contract.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/Blobstream0.sol\":\"Blobstream0\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":blobstream-contracts/=lib/blobstream-contracts/src/\",\":blobstream/=lib/blobstream-contracts/src/\",\":ds-test/=lib/blobstream-contracts/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin/=lib/openzeppelin-contracts/\",\":risc0-ethereum/=lib/risc0-ethereum/\",\":risc0/=lib/risc0-ethereum/contracts/src/\",\":tree/=lib/blobstream-contracts/src/lib/tree/\",\":verifier/=lib/blobstream-contracts/src/lib/verifier/\"]},\"sources\":{\"lib/blobstream-contracts/src/DataRootTuple.sol\":{\"keccak256\":\"0x0526597d14a6d7f258ec48e434a9b60c9a8781764a8f23c878d49926daeb5d1c\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://06ee253f8d0f58dbe66c64cb5d2945182ba3bced088167472d8f953cec421916\",\"dweb:/ipfs/QmUF9jjr6bH3pPgjGAZqYhsUn7EevqU7kZn8RBqQ4EoU2w\"]},\"lib/blobstream-contracts/src/IDAOracle.sol\":{\"keccak256\":\"0xc35648b17d3587bc3a627f67a328874db536ee24c11b970c3c57226d69a32eec\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://362610301e6057d10777c84111d4bb43af53af75a488fb8ab8666a775302a3fc\",\"dweb:/ipfs/QmURgSTYhiguV1oCUARaTTWrpFHg5nMEtxhPVcpUDuEKq6\"]},\"lib/blobstream-contracts/src/lib/tree/Constants.sol\":{\"keccak256\":\"0x2050b2be8a739ce250cc5cea1556936c7937915b5d7fde269dd70e8e7eb660c4\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://946ea30d1001048a800f60bb24d2ab7ecf5f92ae2abd212f3f855e37a6840ce7\",\"dweb:/ipfs/QmW2PnhAB5h2eCCM6Vafg8ZUpBttjLTbBhtXjJh3SSrYEN\"]},\"lib/blobstream-contracts/src/lib/tree/Types.sol\":{\"keccak256\":\"0xa47e9e20fef88264acdf1fc6bc0b3bb9f23c7022f5de8d203a1014895a606958\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://d480249b6adf8730bffcf26eed5902eb9fd1d56d11f931b35a9e19c6415b3f47\",\"dweb:/ipfs/QmPCrcMmQdNMYG232WxEg2zZRFvXQqdEZgwQNMaDJ2oNab\"]},\"lib/blobstream-contracts/src/lib/tree/Utils.sol\":{\"keccak256\":\"0xee3f228310a87022dbff84e35bc1c0b281fa1bb3722d3c5e43e578a76a98d234\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f59a41b4286c04a3382345b989a4536fa41b35af8babeabd40887bdbe44c77f6\",\"dweb:/ipfs/QmQTbyLnRY977aCidNGAUQi577qf7ABXe3xoR6yYa6xcVc\"]},\"lib/blobstream-contracts/src/lib/tree/binary/BinaryMerkleMultiproof.sol\":{\"keccak256\":\"0xbb0e2cc90b98961f000ee8ecec9a4af22f1fbabd01fd4f6da4366261caa95bcd\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://db56e64e241915f98a47991c512d61ed13bbc444f602b3f445e8635055dcd32c\",\"dweb:/ipfs/QmQxBdpnsqXaC81QXwar8AY9XroSWL7VxLCkdc3qtPLo6J\"]},\"lib/blobstream-contracts/src/lib/tree/binary/BinaryMerkleProof.sol\":{\"keccak256\":\"0x9fb953284b455b544091f058fdb11ac73928093517333909c0744d9319410688\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://938230a60210345fe7cc661708c4fe0db663a5f5b5306f05fe4023b44f104b6e\",\"dweb:/ipfs/QmUvcJuDmwnbRzXX5qgV4Mckg6ujvMeo46SrTPvgpPhFSF\"]},\"lib/blobstream-contracts/src/lib/tree/binary/BinaryMerkleTree.sol\":{\"keccak256\":\"0x5ec8b9caa0c9cfd0917107090c108484ac909ee50735cd507278b4ed68c15cf4\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://0110303440a7123bd17175bec4010943c953c6223e5c2a7f40cfa49599e20979\",\"dweb:/ipfs/QmYMMzShtUxdn5MuzqgNzdKrtDdXQWfWHRN6pZJfZLuckc\"]},\"lib/blobstream-contracts/src/lib/tree/binary/TreeHasher.sol\":{\"keccak256\":\"0x2f16501eac14f6e2a61de29d3aa10e3aaf8e0a594fc9cf8dc2d955bb2f6d54e0\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://984a2e5d52cfdd38f2c597bddc4a2de8ad1e4dd9c81008376569a29c74fa963e\",\"dweb:/ipfs/QmaXhfHD58Jv4nSw3qw2hGwbDSPKDjFzPNYWm9Y4KWiigm\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/access/Ownable2StepUpgradeable.sol\":{\"keccak256\":\"0xbca4a4f66d98028293dba695851d1b20d3e0ba2fff7453fb241f192fa3fc6b6f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://013b3cfd9d1e34dad409c3b9a340860e8651e61cda509de33599fb5102f62fe7\",\"dweb:/ipfs/QmTVjDKofM9Nst8w8LAA3HHgi1eCnGYBpFb7Nbat71e2xz\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0xc163fcf9bb10138631a9ba5564df1fa25db9adff73bd9ee868a8ae1858fe093a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9706d43a0124053d9880f6e31a59f31bc0a6a3dc1acd66ce0a16e1111658c5f6\",\"dweb:/ipfs/QmUFmfowzkRwGtDu36cXV9SPTBHJ3n7dG9xQiK5B28jTf2\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609\",\"dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol\":{\"keccak256\":\"0x3f13b947637c4969c0644cab4ef399cdc4b67f101463b8775c5a43b118558e53\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c6683e6ade6985d394d32baaef5eea0d8b9ff0b3eca86ae413d6cdde114a9930\",\"dweb:/ipfs/QmdBE8T1BTddZxpdECMsb3KiCFyjNWmxcCddYrWFTXmWPj\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://08e39f23d5b4692f9a40803e53a8156b72b4c1f9902a88cd65ba964db103dab9\",\"dweb:/ipfs/QmPKn6EYDgpga7KtpkA8wV2yJCYGMtc9K4LkJfhKX2RVSV\"]},\"lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol\":{\"keccak256\":\"0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ef381843676aec64421200ee85eaa0b1356a35f28b9fc67e746a6bbb832077d9\",\"dweb:/ipfs/QmY8aorMYA2TeTCnu6ejDjzb4rW4t7TCtW4GZ6LoxTFm7v\"]},\"lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Utils.sol\":{\"keccak256\":\"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a\",\"dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE\"]},\"lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol\":{\"keccak256\":\"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa\",\"dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM\"]},\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245\",\"dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y\"]},\"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c\",\"dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR\"]},\"lib/risc0-ethereum/contracts/src/IRiscZeroVerifier.sol\":{\"keccak256\":\"0x19341f62c8fe3c0945ebffa4f25d49706ded741af98eaacb7ade824c947f61a4\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5d443c7187fd565e25acdfd3df63f14421d06dda0839470cb475546f7c9908c0\",\"dweb:/ipfs/QmeaHPjKmGZBC15iiYKsDCY1k2UY3iYZiNB6Pdc8ow6aVX\"]},\"lib/risc0-ethereum/contracts/src/Util.sol\":{\"keccak256\":\"0x230a9a58bb2b0c68d4921ecc3672783f941890a2fa3a238dbe5188cfb7658b82\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://586cb5296c564761609ca8aaae5b1fbbdb19ab1e174f7197f602572d9e82b70c\",\"dweb:/ipfs/QmWxDmucSfg3Wgdk1rVcheDHwkziTsXWvKpKSCnxtpQBqg\"]},\"src/Blobstream0.sol\":{\"keccak256\":\"0x6397ef609581ad923f2acbfb08981795a4f71ffeec3b3581a42c3f0eb7a5617b\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://cf6412935bfc839d02a7e2246b35c4bc5eb748f396de6f088e570506ec7ef9ac\",\"dweb:/ipfs/QmZAjwPwL4P13PiWm11e34gMd1QoC5P1d1jSLXAzww2Ajp\"]},\"src/ImageID.sol\":{\"keccak256\":\"0x0a4aace1c9d03ed7673a7d357353bcc48544df26a11db00b4424d78b1a05ab18\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5c8704fdbd94eb7de7a84cac3a7e318a2edb73ecc8fd85985e2d871e065bf2f5\",\"dweb:/ipfs/QmVRw7kDpKUAkTVfjqWSua62Fig3vhGqLmrW7S3dXuoXwx\"]},\"src/RangeCommitment.sol\":{\"keccak256\":\"0x66fb6ad1bd00e6b4bb3d3e2a8a2c7c5c224257ff4fc34043d1e8bbd507a22c1a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://9067a0704579a69248972a133be63dfe67dccb8797bc0c16358b7bde9188424d\",\"dweb:/ipfs/QmWDW5YoJ6Scfn9HRnpgwoVehvkdFoSi9p9FY86eLYh2X7\"]}},\"version\":1}" } \ No newline at end of file diff --git a/contracts/src/ImageID.sol b/contracts/src/ImageID.sol index c314e8a..cf64014 100644 --- a/contracts/src/ImageID.sol +++ b/contracts/src/ImageID.sol @@ -20,5 +20,5 @@ pragma solidity ^0.8.20; library ImageID { bytes32 public constant LIGHT_CLIENT_GUEST_ID = - bytes32(0x4383189e399cb4bb64bc8b77fbaefcfe4c3c6472867bdd61de5eb1d4334a34c6); + bytes32(0x3229c3708db83fd93c3f28275361870e40d75740c5c09498196474da8fc65f8e); } diff --git a/core/Cargo.toml b/core/Cargo.toml index 6c7abeb..6ae731b 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -18,3 +18,6 @@ tendermint-proto = { workspace = true } tendermint-rpc = { workspace = true, features = ["http-client"] } tokio = { version = "1.38.0", features = ["rt", "macros", "fs"] } tracing = "0.1.40" + +[features] +prebuilt-docker = ["light-client-guest/prebuilt-docker"] \ No newline at end of file diff --git a/core/src/lib.rs b/core/src/lib.rs index 17b86f6..3878dcb 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -20,7 +20,7 @@ use blobstream0_primitives::{ IBlobstream::IBlobstreamInstance, LightBlockProveData, RangeCommitment, }; -use light_client_guest::LIGHT_CLIENT_GUEST_ELF; +// use light_client_guest::LIGHT_CLIENT_GUEST_ELF; use risc0_ethereum_contracts::groth16; use risc0_zkvm::{default_prover, is_dev_mode, sha::Digestible, ExecutorEnv, ProverOpts, Receipt}; use std::{ops::Range, sync::Arc, time::Duration}; @@ -34,6 +34,15 @@ use tracing::{instrument, Level}; mod range_iterator; use range_iterator::LightBlockRangeIterator; +// This is configured to use the default docker build path. The reason for the feature flag is +// because we want a consistent docker image to build the program, which should not be run within +// the dockerized service container. +#[cfg(feature = "prebuilt-docker")] +const LIGHT_CLIENT_GUEST_ELF: &[u8] = + include_bytes!("../../target/riscv-guest/riscv32im-risc0-zkvm-elf/docker/light_client_guest/light-client-guest"); +#[cfg(not(feature = "prebuilt-docker"))] +use light_client_guest::LIGHT_CLIENT_GUEST_ELF; + /// Currently set to the max allowed by tendermint RPC const HEADER_REQ_COUNT: u64 = 20; diff --git a/dockerfiles/blobstream0.Dockerfile b/dockerfiles/blobstream0.Dockerfile index 69ea7f6..1981e52 100644 --- a/dockerfiles/blobstream0.Dockerfile +++ b/dockerfiles/blobstream0.Dockerfile @@ -28,7 +28,7 @@ WORKDIR /app COPY . . # Build the project -RUN cargo build -p blobstream0 --release +RUN cargo build -p blobstream0 --release --features prebuilt-docker # Create a new stage for a smaller final image FROM debian:bullseye-slim as final diff --git a/light-client-guest/Cargo.toml b/light-client-guest/Cargo.toml index 72fd2e1..0b1e968 100644 --- a/light-client-guest/Cargo.toml +++ b/light-client-guest/Cargo.toml @@ -10,5 +10,8 @@ risc0-build-ethereum = { git = "https://github.com/risc0/risc0-ethereum", tag = # Currently just used to format built artifact serde_json = "1.0" +[features] +prebuilt-docker = [] + [package.metadata.risc0] -methods = ["guest"] +methods = ["guest"] \ No newline at end of file diff --git a/light-client-guest/build.rs b/light-client-guest/build.rs index a5309f6..b612e42 100644 --- a/light-client-guest/build.rs +++ b/light-client-guest/build.rs @@ -29,6 +29,12 @@ const SOLIDITY_IMAGE_ID_PATH: &str = "../contracts/src/ImageID.sol"; const SOLIDITY_ELF_PATH: &str = "../contracts/test/Elf.sol"; fn main() { + // If this feature is enabled, skip build and just use pre-built guest and EVM artifacts. + if cfg!(feature = "prebuilt-docker") { + println!("cargo:rerun-if-env-changed=CARGO_FEATURE_PREBUILT_DOCKER"); + return; + } + // Builds can be made deterministic, and thereby reproducible, by using Docker to build the // guest. Check the RISC0_USE_DOCKER variable and use Docker to build the guest if set. let use_docker = env::var("RISC0_USE_DOCKER").ok().map(|_| DockerOptions { diff --git a/light-client-guest/src/lib.rs b/light-client-guest/src/lib.rs index ae9d61e..b970a13 100644 --- a/light-client-guest/src/lib.rs +++ b/light-client-guest/src/lib.rs @@ -12,4 +12,5 @@ // See the License for the specific language governing permissions and // limitations under the License. +#[cfg(not(feature = "prebuilt-docker"))] include!(concat!(env!("OUT_DIR"), "/methods.rs"));