diff --git a/precompiles/Precompiles.sol b/precompiles/Precompiles.sol index 95174a4..7d68b9c 100644 --- a/precompiles/Precompiles.sol +++ b/precompiles/Precompiles.sol @@ -11,7 +11,7 @@ import { ISablierMerkleFactory } from "./../src//interfaces/ISablierMerkleFactor /// but allows for execution in test environments, such as a local development network or a testnet. contract Precompiles { bytes public constant BYTECODE_MERKLE_FACTORY = - hex"608034609357601f615d0338819003918201601f19168301916001600160401b03831184841017609757808492602094604052833981010312609357516001600160a01b038116908190036093575f80546001600160a01b0319168217815560405191907fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a3615c5790816100ac8239f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80633f693dcb146109fb578063474a7634146108b15780634d419abc146108415780634d7c0f111461076e5780635a6c72d01461075157806375829def146106cb578063949251f01461033a578063a480ca7914610250578063a4ab5432146101c9578063c93a6c8414610170578063d49466a8146100c65763f851a4401461009d575f80fd5b346100c2575f3660031901126100c25760206001600160a01b035f5416604051908152f35b5f80fd5b346100c25760403660031901126100c2576100df610de6565b602435906001600160a01b035f541633810361015a57506001600160a01b031690815f52600260205280600160405f20805460ff81161561014c575b5001556040519081527f2cd7b20ee8b62492029a3c64fecf1603b5550673e9c2a72ea38044568108a08860203392a3005b60ff1916821781558561011b565b6331b339a960e21b5f526004523360245260445ffd5b346100c25760203660031901126100c2576004356001600160a01b035f541633810361015a5750806001556040519081527ff20c52fd919086f2a3380c19e51ff1fb508de65b5eb8e07c1a69695a32af651960203392a2005b346100c25760203660031901126100c2576101e2610de6565b6001600160a01b035f541690338203610239576001600160a01b0316805f5260026020525f6001604082208281550155337f633e9c50ac98dfb667e9ab9e544db6b3f26f93fbde630f500afe6bf0cd78d8ab5f80a3005b506331b339a960e21b5f526004523360245260445ffd5b346100c25760203660031901126100c2576004356001600160a01b0381168091036100c2576001600160a01b035f5416604051907fa480ca7900000000000000000000000000000000000000000000000000000000825260048201526020816024815f865af190811561032f575f916102fd575b507fbf461a00c2a56d50c1ffe10b436b0da1a2b3a86fa5154599854bbf6be334d85060206001600160a01b035f541692604051908152a3005b90506020813d602011610327575b8161031860209383610d9e565b810103126100c25751826102c4565b3d915061030b565b6040513d5f823e3d90fd5b346100c2576101603660031901126100c25760043567ffffffffffffffff81116100c25761036c903690600401610e52565b610374610f38565b61037c610f4e565b90610385610f5d565b9060a03660831901126100c25760405160a0810181811067ffffffffffffffff8211176106b7576040526103b7610dc0565b815260a4356001600160801b03811681036100c257602082015260c43564ffffffffff811681036100c257604082015260e4356001600160801b03811681036100c25760608201526101043564ffffffffff811681036100c257608082015260405161051b61052c601660208401602081526104488561043a604082018d610fb2565b03601f198101875286610d9e565b60346040519960208b01906104a2828a64ffffffffff608080928281511685526001600160801b0360208201511660208601528260408201511660408601526001600160801b036060820151166060860152015116910152565b60a08c526104b160c08d610d9e565b6040519687946104d1602087019a3360601b8c5251809287890190610f6c565b8501916001600160a01b038c169b6bffffffffffffffffffffffff199060601b168584015215159b8c60f81b604884015215159c8d60f81b6049840152518093604a840190610f6c565b01010301601f198101835282610d9e565b5190209461053933611085565b95604051611a5580820182811067ffffffffffffffff8211176106b75782916122708339610140815289610120610574610140840188610fb2565b928960208201528a60408201528b60608201526105d9608082018a64ffffffffff608080928281511685526001600160801b0360208201511660208601528260408201511660408601526001600160801b036060820151166060860152015116910152565b015203905ff592831561032f57602096610692610634946001600160a01b037f380460f75a129fa9df7ca8f9e4627aa1c7abf14d7f3f87f408cc3cd7ae2b1c4797169889986040519788976101808952610180890190610fb2565b958c88015260408701526060860152608085019064ffffffffff608080928281511685526001600160801b0360208201511660208601528260408201511660408601526001600160801b036060820151166060860152015116910152565b61012435610120840152610144356101408401526101608301520390a2604051908152f35b634e487b7160e01b5f52604160045260245ffd5b346100c25760203660031901126100c2576106e4610de6565b5f546001600160a01b03811633810361015a57506001600160a01b037fffffffffffffffffffffffff0000000000000000000000000000000000000000921691829116175f55337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf805f80a3005b346100c2575f3660031901126100c2576020600154604051908152f35b346100c25760203660031901126100c25760043567ffffffffffffffff81116100c257366023820112156100c25780600401359067ffffffffffffffff82116100c2573660248360061b830101116100c2575f90815b838310156108225760248360061b830101359067ffffffffffffffff82168092036100c25767ffffffffffffffff160167ffffffffffffffff811161080e576001909201916107c4565b634e487b7160e01b5f52601160045260245ffd5b602090670de0b6b3a764000067ffffffffffffffff6040519216148152f35b346100c25760203660031901126100c2576001600160a01b03610862610de6565b5f602060405161087181610d82565b8281520152165f5260026020526040805f20815161088e81610d82565b6020600160ff845416151593848452015491019081528251918252516020820152f35b346100c25760603660031901126100c25760043567ffffffffffffffff81116100c2576108e2903690600401610e52565b604051602081016020815261090c826108fe6040820186610fb2565b03601f198101845283610d9e565b6109416034604051809361093060208301963360601b885251809285850190610f6c565b81010301601f198101835282610d9e565b5190209061094e33611085565b916040516111b280820182811067ffffffffffffffff8211176106b75782916110be8339604081528560206109866040840188610fb2565b92015203905ff591821561032f577fca58fb398f60b2cc5e664a08608a6aabe7077d2684a2d82a7d5b83322fd2b2a76109db6001600160a01b0360209516938493604051928392608084526080840190610fb2565b9060243588840152604435604084015260608301520390a2604051908152f35b346100c2576101003660031901126100c25760043567ffffffffffffffff81116100c257610a2d903690600401610e52565b610a35610f38565b90610a3e610f4e565b90610a47610f5d565b90610a50610dc0565b60a4359167ffffffffffffffff83116100c257366023840112156100c257826004013567ffffffffffffffff81116106b75760405193610a9660208360051b0186610d9e565b8185526024602086019260061b820101903682116100c257602401915b818310610d355750505082515f905f905b808210610cf657505033610ad790611085565b6040516020810197602089528160408101610af29087610fb2565b03601f1981018352610b049083610d9e565b6040519860208a01602081528a60408101610b1f908b611035565b03601f1981018c52610b31908c610d9e565b8b60405193849360208501963360601b885251908160348701610b5392610f6c565b8401916001600160a01b03169d6bffffffffffffffffffffffff199060601b16603483015215159a8b60f81b604883015215159b8c60f81b604983015264ffffffffff8a169960d81b7fffffffffff00000000000000000000000000000000000000000000000000000016604a830152519182604f8301610bd392610f6c565b0160340103601b01601f1981018252610bec9082610d9e565b519020604051611f8680820182811067ffffffffffffffff8211176106b7578460c0610c518e8e8e8897613cc5893960e08752610c2d8d60e0890190610fb2565b926020880152604087015260608601528b608086015284810360a08601528c611035565b92015203905ff5801561032f576020987f7f4d78094331349dd7faaa3e5d7de64176340a988e70586fac394de324566ce296610cad966001600160a01b03610cce94169a8b9a604051998a996101408b526101408b0190610fb2565b948e8a015260408901526060880152608087015285820360a0870152611035565b9160c084015260c43560e084015260e4356101008401526101208301520390a2604051908152f35b90918551831015610d215760019064ffffffffff6020808660051b8a01015101511601920190610ac4565b634e487b7160e01b5f52603260045260245ffd5b6040833603126100c25760405190610d4c82610d82565b83359067ffffffffffffffff821682036100c2578260209260409452610d73838701610dd4565b83820152815201920191610ab3565b6040810190811067ffffffffffffffff8211176106b757604052565b90601f8019910116810190811067ffffffffffffffff8211176106b757604052565b6084359064ffffffffff821682036100c257565b359064ffffffffff821682036100c257565b600435906001600160a01b03821682036100c257565b81601f820112156100c25780359067ffffffffffffffff82116106b75760405192610e31601f8401601f191660200185610d9e565b828452602083830101116100c257815f926020809301838601378301015290565b919060e0838203126100c2576040519060e0820182811067ffffffffffffffff8211176106b757604052819380356001600160a01b03811681036100c2578352610e9e60208201610dd4565b602084015260408101356001600160a01b03811681036100c2576040840152606081013567ffffffffffffffff81116100c25782610edd918301610dfc565b60608401526080810135608084015260a081013567ffffffffffffffff81116100c25782610f0c918301610dfc565b60a084015260c08101359167ffffffffffffffff83116100c25760c092610f339201610dfc565b910152565b602435906001600160a01b03821682036100c257565b6044359081151582036100c257565b6064359081151582036100c257565b5f5b838110610f7d5750505f910152565b8181015183820152602001610f6e565b90602091610fa681518092818552858086019101610f6c565b601f01601f1916010190565b611032916001600160a01b03825116815264ffffffffff60208301511660208201526001600160a01b03604083015116604082015260c0611021611005606085015160e0606086015260e0850190610f8d565b6080850151608085015260a085015184820360a0860152610f8d565b9201519060c0818403910152610f8d565b90565b90602080835192838152019201905f5b8181106110525750505090565b8251805167ffffffffffffffff16855260209081015164ffffffffff168186015260409094019390920191600101611045565b6001600160a01b0316805f52600260205260ff60405f2054165f146110b6575f526002602052600160405f20015490565b506001549056fe61016080604052346103f7576111b2803803809161001d82856103fb565b833981016040828203126103f75781516001600160401b0381116103f757820160e0818303126103f7576040519060e082016001600160401b038111838210176103e35760405280516001600160a01b03811681036103f757825260208101519064ffffffffff821682036103f757602083019182526040810151936001600160a01b03851685036103f7576040840194855260608201516001600160401b0381116103f757816100cf91840161043f565b94606085019586526080830151946080810195865260a084015160018060401b0381116103f7578361010291860161043f565b60a0820190815260c0850151969091906001600160401b0388116103f757602061013581966101db9a6101d6990161043f565b60c084019081529a015193515f80546001600160a01b0319166001600160a01b039290921691821781556040519889969264ffffffffff927fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a3511660a0523360c05260e0525161010052516001600160a01b031661014052518051906101c590829084860190860161041e565b81010301601f1981018352826103fb565b610493565b60805251805191906001600160401b0383116103e357600154600181811c911680156103d9575b60208210146103c557601f8111610362575b50602090601f84116001146102fa5761026293915f91836102ef575b50508160011b915f199060031b1c1916176001555b516101d66020604051836101c5829551809285808601910161041e565b61012052604051610cfc90816104b6823960805181610a4f015260a05181818161018c015281816108170152818161097f0152610b1d015260c0518181816101d3015261085e015260e05181818161014c015261058f0152610100518181816103ae015261068f01526101205181610a060152610140518181816102be0152818161070a01526108f10152f35b015190505f80610230565b90601f1984169160015f52815f20925f5b81811061034a5750916001939186610262979410610332575b505050811b01600155610245565b01515f1960f88460031b161c191690555f8080610324565b9293602060018192878601518155019501930161030b565b60015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6601f850160051c810191602086106103bb575b601f0160051c01905b8181106103b05750610214565b5f81556001016103a3565b909150819061039a565b634e487b7160e01b5f52602260045260245ffd5b90607f1690610202565b634e487b7160e01b5f52604160045260245ffd5b5f80fd5b601f909101601f19168101906001600160401b038211908210176103e357604052565b5f5b83811061042f5750505f910152565b8181015183820152602001610420565b81601f820112156103f75780516001600160401b0381116103e35760405192610472601f8301601f1916602001856103fb565b818452602082840101116103f757610490916020808501910161041e565b90565b6020815191015190602081106104a7575090565b5f199060200360031b1b169056fe6080806040526004361015610012575f80fd5b5f3560e01c9081630724fda914610a39575080630f7514a2146109ee5780631686c909146108825780632dd310001461083f5780633f31ae3f146104f957806349fc73dd146103f55780634e390d3e146103d157806351e75e8b1461039757806375829def146102e257806382bfefc81461029f57806390e64d1314610285578063a480ca79146101b0578063bb4b57341461016f578063c57981b514610135578063ce516507146100f55763f851a440146100cc575f80fd5b346100f1575f3660031901126100f15760206001600160a01b035f5416604051908152f35b5f80fd5b346100f15760203660031901126100f157602061012b60043560ff6001918060081c5f526002602052161b60405f205416151590565b6040519015158152f35b346100f1575f3660031901126100f15760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346100f1575f3660031901126100f157602060405164ffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f15760203660031901126100f1576101c9610ac9565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016803303610256575047905f80808085855af161020d610b52565b501561021e57602082604051908152f35b6001600160a01b03907f245bf0c0000000000000000000000000000000000000000000000000000000005f521660045260245260445ffd5b7f4e3ddeed000000000000000000000000000000000000000000000000000000005f526004523360245260445ffd5b346100f1575f3660031901126100f157602061012b610b15565b346100f1575f3660031901126100f15760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f15760203660031901126100f1576102fb610ac9565b5f546001600160a01b03811633810361036857506001600160a01b037fffffffffffffffffffffffff0000000000000000000000000000000000000000921691829116175f55337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf805f80a3005b7fc6cce6a4000000000000000000000000000000000000000000000000000000005f526004523360245260445ffd5b346100f1575f3660031901126100f15760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346100f1575f3660031901126100f157602064ffffffffff60035416604051908152f35b346100f1575f3660031901126100f1576040515f6001548060011c906001811680156104ef575b6020831081146104db578285529081156104b75750600114610459575b6104558361044981850382610adf565b60405191829182610a82565b0390f35b91905060015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6915f905b80821061049d57509091508101602001610449610439565b919260018160209254838588010152019101909291610485565b60ff191660208086019190915291151560051b840190910191506104499050610439565b634e487b7160e01b5f52602260045260245ffd5b91607f169161041c565b60803660031901126100f157600435602435906001600160a01b038216918281036100f157604435926fffffffffffffffffffffffffffffffff84168094036100f1576064359367ffffffffffffffff85116100f157366023860112156100f157846004013567ffffffffffffffff81116100f1578060051b95602487820101903682116100f157610589610b15565b6107e8577f00000000000000000000000000000000000000000000000000000000000000008034106107b957506105d78760ff6001918060081c5f526002602052161b60405f205416151590565b61078d57604051602081019088825286604082015285606082015260608152610601608082610adf565b519020604051602081019182526020815261061d604082610adf565b5190209261063160206040519a018a610adf565b8852602401602088015b82821061077d57505050925f935b865185101561068b5760208560051b88010151908181105f1461067a575f52602052600160405f205b940193610649565b905f52602052600160405f20610672565b85907f000000000000000000000000000000000000000000000000000000000000000003610755578261072e7f1dcd2362ae467d43bf31cbcac0526c0958b23eb063e011ab49a5179c839ed9a99460409460035464ffffffffff81161561073b575b508460081c5f526002602052855f20600160ff87161b81541790557f0000000000000000000000000000000000000000000000000000000000000000610b91565b82519182526020820152a2005b64ffffffffff19164264ffffffffff1617600355886106ed565b7fb4f06787000000000000000000000000000000000000000000000000000000005f5260045ffd5b813581526020918201910161063b565b867febe6f30d000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7fa164c6b4000000000000000000000000000000000000000000000000000000005f523460045260245260445ffd5b7fdf4bae05000000000000000000000000000000000000000000000000000000005f524260045264ffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660245260445ffd5b346100f1575f3660031901126100f15760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f15760403660031901126100f15761089b610ac9565b602435906fffffffffffffffffffffffffffffffff82168092036100f1576001600160a01b035f5416338103610368575064ffffffffff60035416801515806109b9575b806109aa575b610950575061091582827f0000000000000000000000000000000000000000000000000000000000000000610b91565b7f2e9d425ba8b27655048400b366d7b6a1f7180ebdb088e06bb7389704860ffe1f60206001600160a01b03805f5416936040519586521693a3005b7fe2e40a0c000000000000000000000000000000000000000000000000000000005f524260045264ffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660245260445260645ffd5b506109b3610b15565b156108e5565b5062093a80810164ffffffffff81116109da5764ffffffffff1642116108df565b634e487b7160e01b5f52601160045260245ffd5b346100f1575f3660031901126100f1576104556040517f0000000000000000000000000000000000000000000000000000000000000000602082015260208152610449604082610adf565b346100f1575f3660031901126100f157610455907f0000000000000000000000000000000000000000000000000000000000000000602082015260208152610449604082610adf565b9190916020815282518060208301525f5b818110610ab3575060409293505f838284010152601f8019910116010190565b8060208092870101516040828601015201610a93565b600435906001600160a01b03821682036100f157565b90601f8019910116810190811067ffffffffffffffff821117610b0157604052565b634e487b7160e01b5f52604160045260245ffd5b64ffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015159081610b4a575090565b905042101590565b3d15610b8c573d9067ffffffffffffffff8211610b015760405191610b81601f8201601f191660200184610adf565b82523d5f602084013e565b606090565b5f610bfe926001600160a01b038293604051968260208901947fa9059cbb000000000000000000000000000000000000000000000000000000008652166024890152604488015260448752610be7606488610adf565b1694519082865af1610bf7610b52565b9083610c63565b8051908115159182610c3f575b5050610c145750565b7f5274afe7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b81925090602091810103126100f157602001518015908115036100f1575f80610c0b565b90610ca05750805115610c7857805190602001fd5b7f1425ea42000000000000000000000000000000000000000000000000000000005f5260045ffd5b81511580610ce6575b610cb1575090565b6001600160a01b03907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b15610ca956fea164736f6c634300081a000a6101c06040523461055757611a55803803809161001e826101c0610664565b6101c0396101c08101906101408112610557576101c0516001600160401b038111610557576101c0019160e0838203126105575760405160e081016001600160401b038111828210176106505760405283516001600160a01b038116810361055757815261008e60208501610687565b602082019081526040850151909490936001600160a01b0385168503610557576040830194855260608201516001600160401b03811161055757846100d49184016106d5565b95606084019687526080830151926080850193845260a081015160018060401b03811161055757866101079183016106d5565b60a0860190815260c08201519096906001600160401b0381116105575761012e92016106d5565b60c085019081526101e0516001600160a01b038116989091908983036105575761015961020061071a565b9360a061016761022061071a565b96607f190112610557576040519960a08b01996001600160401b038b118c8c1017610650578b9a6040526101c06080016101a090610687565b8b526101ad610260610727565b60208c01908152996101c0610280610687565b60408d01908152996101d36102a0610727565b6060909d019c8d528d6101e76102c0610687565b6080909101526102e05193515f80546001600160a01b0319166001600160a01b039290921691821781556040519687969290917fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a35164ffffffffff1660a0523360c05260e0525161010052516001600160a01b03166101405251805190610279908290602085810191016106b4565b81010380825261028c9060200182610664565b6102959061073b565b608052518051906001600160401b03821161065057600154600181811c91168015610646575b602082101461063257601f81116105cf575b50602090601f8311600114610566576103329392915f918361055b575b50508160011b915f199060031b1c1916176001555b5161032d60206040518361031c82955180928580860191016106b4565b81010301601f198101835282610664565b61073b565b6101205261016052610180526101a05264ffffffffff8451166004549265010000000000600160a81b03905160281b169164ffffffffff60a81b905160a81b169260018060d01b03191617171760045560018060801b0390511660055491608064ffffffffff811b91015160801b169160018060a81b031916171760055560018060a01b036101405116604051905f806020840163095ea7b360e01b815285602486015281196044860152604485526103ec606486610664565b84519082855af16103fb61075d565b81610520575b5080610516575b156104d1575b6040516111f7908161085e823960805181611000015260a05181818161023001528181610c5401528181610f3001526110ea015260c0518181816102770152610c9b015260e0518181816101b4015261067301526101005181818161049501526107730152610120518181816108340152610fb70152610140518181816103a5015281816108b30152610e300152610160518181816103620152610a7601526101805181818161017801526108e401526101a0518181816101ee015261090e0152f35b61050961050e936040519063095ea7b360e01b602083015260248201525f604482015260448152610503606482610664565b8261078c565b61078c565b5f808061040e565b50803b1515610408565b8051801592508215610535575b50505f610401565b8192509060209181010312610557576020610550910161071a565b5f8061052d565b5f80fd5b015190505f806102ea565b90601f1983169160015f52815f20925f5b8181106105b757509160019391856103329796941061059f575b505050811b016001556102ff565b01515f1960f88460031b161c191690555f8080610591565b92936020600181928786015181550195019301610577565b60015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6601f840160051c81019160208510610628575b601f0160051c01905b81811061061d57506102cd565b5f8155600101610610565b9091508190610607565b634e487b7160e01b5f52602260045260245ffd5b90607f16906102bb565b634e487b7160e01b5f52604160045260245ffd5b601f909101601f19168101906001600160401b0382119082101761065057604052565b519064ffffffffff8216820361055757565b6001600160401b03811161065057601f01601f191660200190565b5f5b8381106106c55750505f910152565b81810151838201526020016106b6565b81601f820112156105575780516106eb81610699565b926106f96040519485610664565b818452602082840101116105575761071791602080850191016106b4565b90565b5190811515820361055757565b51906001600160801b038216820361055757565b60208151910151906020811061074f575090565b5f199060200360031b1b1690565b3d15610787573d9061076e82610699565b9161077c6040519384610664565b82523d5f602084013e565b606090565b5f806107b49260018060a01b03169360208151910182865af16107ad61075d565b90836107ff565b80519081151591826107dc575b50506107ca5750565b635274afe760e01b5f5260045260245ffd5b81925090602091810103126105575760206107f7910161071a565b155f806107c1565b90610823575080511561081457805190602001fd5b630a12f52160e11b5f5260045ffd5b81511580610854575b610834575090565b639996b31560e01b5f9081526001600160a01b0391909116600452602490fd5b50803b1561082c56fe6080806040526004361015610012575f80fd5b5f3560e01c9081630724fda914610fea575080630f7514a214610f9f5780631686c90914610d7357806326fadbe214610cbf5780632dd3100014610c7c5780633f31ae3f146105e857806349fc73dd146104dc5780634e390d3e146104b857806351e75e8b1461047e57806375829def146103c957806382bfefc814610386578063845aef4b1461034357806390e64d1314610329578063a480ca7914610254578063bb4b573414610213578063bf44497a146101d7578063c57981b51461019d578063cbe9e5ef14610161578063ce516507146101215763f851a440146100f8575f80fd5b3461011d575f36600319011261011d5760206001600160a01b035f5416604051908152f35b5f80fd5b3461011d57602036600319011261011d57602061015760043560ff6001918060081c5f526002602052161b60405f205416151590565b6040519015158152f35b3461011d575f36600319011261011d5760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b3461011d575f36600319011261011d5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461011d575f36600319011261011d5760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b3461011d575f36600319011261011d57602060405164ffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461011d57602036600319011261011d5761026d611072565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168033036102fa575047905f80808085855af16102b161111f565b50156102c257602082604051908152f35b6001600160a01b03907f245bf0c0000000000000000000000000000000000000000000000000000000005f521660045260245260445ffd5b7f4e3ddeed000000000000000000000000000000000000000000000000000000005f526004523360245260445ffd5b3461011d575f36600319011261011d5760206101576110e2565b3461011d575f36600319011261011d5760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461011d575f36600319011261011d5760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461011d57602036600319011261011d576103e2611072565b5f546001600160a01b03811633810361044f57506001600160a01b037fffffffffffffffffffffffff0000000000000000000000000000000000000000921691829116175f55337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf805f80a3005b7fc6cce6a4000000000000000000000000000000000000000000000000000000005f526004523360245260445ffd5b3461011d575f36600319011261011d5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461011d575f36600319011261011d57602064ffffffffff60035416604051908152f35b3461011d575f36600319011261011d576040515f6001548060011c906001811680156105de575b6020831081146105ca578285529081156105a65750600114610548575b61054483610530818503826110c0565b604051918291602083526020830190611033565b0390f35b91905060015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6915f905b80821061058c57509091508101602001610530610520565b919260018160209254838588010152019101909291610574565b60ff191660208086019190915291151560051b840190910191506105309050610520565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610503565b608036600319011261011d57600435602435906001600160a01b03821680920361011d576044356001600160801b03811680910361011d576064359067ffffffffffffffff821161011d573660238301121561011d57816004013567ffffffffffffffff811161011d578060051b926024848201019036821161011d5761066d6110e2565b610c25577f0000000000000000000000000000000000000000000000000000000000000000803410610bf657506106bb8660ff6001918060081c5f526002602052161b60405f205416151590565b610bca576040516020810190878252886040820152856060820152606081526106e56080826110c0565b51902060405160208101918252602081526107016040826110c0565b5190209261071560206040519701876110c0565b8552602401602085015b828210610bba57505050935f945b835186101561076f5760208660051b85010151908181105f1461075e575f52602052600160405f205b95019461072d565b905f52602052600160405f20610756565b84907f000000000000000000000000000000000000000000000000000000000000000003610b925760035464ffffffffff811615610b78575b508060081c5f52600260205260405f20600160ff83161b8154179055604051926107d1846110a4565b60045464ffffffffff811680610b71575064ffffffffff421685525b5f9064ffffffffff8160a81c1680610b5b575b5064ffffffffff8651169164ffffffffff60055493818560801c16011660208801526001600160a01b035f541692604051927f00000000000000000000000000000000000000000000000000000000000000006020850152602084526108676040856110c0565b60405193610874856110a4565b5f85525f602086015260405195610120870187811067ffffffffffffffff821117610b475760405286526020860199898b5260408701888152606088017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815260808901907f00000000000000000000000000000000000000000000000000000000000000001515825260a08a01927f00000000000000000000000000000000000000000000000000000000000000001515845260c08b0194855260e08b019586526101008b01998a5260405196610954886110a4565b60281c6001600160801b0316875260208701976001600160801b031688526040519e8f9b7f7a695841000000000000000000000000000000000000000000000000000000008d5260048d0160809052516001600160a01b031660848d0152516001600160a01b031660a48c0152516001600160801b031660c48b0152516001600160a01b031660e48a015251151561010489015251151561012488015251805164ffffffffff166101448801526020015164ffffffffff1661016487015251610184860161016090526101e48601610a2b91611033565b935180516001600160a01b03166101a4870152602001516101c4860152516001600160801b03166024850152516001600160801b0316604484015264ffffffffff16606483015203847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691815a6020945f91f1938415610b3c575f94610ae8575b507f28b58397e03322f670d6b223cc863f8c148e368b8b615412e6798a641a22842d9160409182519182526020820152a3005b9093506020813d602011610b34575b81610b04602093836110c0565b8101031261011d5751927f28b58397e03322f670d6b223cc863f8c148e368b8b615412e6798a641a22842d610ab5565b3d9150610af7565b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b64ffffffffff8092935087511601169086610800565b85526107ed565b64ffffffffff19164264ffffffffff1617600355836107a8565b7fb4f06787000000000000000000000000000000000000000000000000000000005f5260045ffd5b813581526020918201910161071f565b857febe6f30d000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7fa164c6b4000000000000000000000000000000000000000000000000000000005f523460045260245260445ffd5b7fdf4bae05000000000000000000000000000000000000000000000000000000005f524260045264ffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660245260445ffd5b3461011d575f36600319011261011d5760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461011d575f36600319011261011d575f6080604051610cde81611088565b828152826020820152826040820152826060820152015260a0604051610d0381611088565b64ffffffffff6004546001600160801b0382821693848152836020820193838160281c16855281604084019160a81c16815283600554958360806060870196848a168852019760801c16875260405198895251166020880152511660408601525116606084015251166080820152f35b3461011d57604036600319011261011d57610d8c611072565b6024356001600160801b03811680910361011d576001600160a01b035f541633810361044f575064ffffffffff6003541680151580610f6a575b80610f5b575b610f015750604051610e665f806001600160a01b0360208501967fa9059cbb000000000000000000000000000000000000000000000000000000008852169586602486015285604486015260448552610e266064866110c0565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001694519082865af1610e5f61111f565b908361115e565b8051908115159182610edd575b5050610eb257507f2e9d425ba8b27655048400b366d7b6a1f7180ebdb088e06bb7389704860ffe1f60206001600160a01b035f541692604051908152a3005b7f5274afe7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b819250906020918101031261011d576020015180159081150361011d578480610e73565b7fe2e40a0c000000000000000000000000000000000000000000000000000000005f524260045264ffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660245260445260645ffd5b50610f646110e2565b15610dcc565b5062093a80810164ffffffffff8111610f8b5764ffffffffff164211610dc6565b634e487b7160e01b5f52601160045260245ffd5b3461011d575f36600319011261011d576105446040517f00000000000000000000000000000000000000000000000000000000000000006020820152602081526105306040826110c0565b3461011d575f36600319011261011d57610544907f00000000000000000000000000000000000000000000000000000000000000006020820152602081526105306040826110c0565b91908251928382525f5b84811061105d575050825f602080949584010152601f8019910116010190565b8060208092840101518282860101520161103d565b600435906001600160a01b038216820361011d57565b60a0810190811067ffffffffffffffff821117610b4757604052565b6040810190811067ffffffffffffffff821117610b4757604052565b90601f8019910116810190811067ffffffffffffffff821117610b4757604052565b64ffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015159081611117575090565b905042101590565b3d15611159573d9067ffffffffffffffff8211610b47576040519161114e601f8201601f1916602001846110c0565b82523d5f602084013e565b606090565b9061119b575080511561117357805190602001fd5b7f1425ea42000000000000000000000000000000000000000000000000000000005f5260045ffd5b815115806111e1575b6111ac575090565b6001600160a01b03907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b156111a456fea164736f6c634300081a000a610200806040523461050c57611f86803803809161001d828561073f565b833981019060e08183031261050c5780516001600160401b03811161050c5781019060e08284031261050c576040519160e083016001600160401b038111848210176105c65760405280516001600160a01b038116810361050c57835261008660208201610762565b6020840190815260408201519093906001600160a01b038116810361050c576040820190815260608301516001600160401b03811161050c57866100cb9185016107b0565b6060830190815260808481015190840190815260a08501519096906001600160401b03811161050c57886101009187016107b0565b60a0850190815260c086015190956001600160401b03821161050c57610128918a91016107b0565b60c085019081526020870151959093906001600160a01b038716870361050c57610154604089016107f5565b9561016160608a016107f5565b9961016e60808b01610762565b60a08b0151909a906001600160401b03811161050c5781018d601f8201121561050c578051906001600160401b0382116105c6576040519e8f8360051b6020016101b8908261073f565b8381526020019260061b82016020019181831161050c57602001925b8284106106e357505050509260209261028796959260c06102829601519360018060a01b03905116938460018060a01b03195f5416175f5564ffffffffff6040519889965f7fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a3511660a0523360c05260e0525161010052516001600160a01b0316610140525180519061027190829084860190860161078f565b81010301601f19810183528261073f565b610816565b608052518051906001600160401b0382116105c657600154600181811c911680156106d9575b60208210146106c557601f8111610662575b50602090601f83116001146105f95761030e9392915f91836105ee575b50508160011b915f199060031b1c1916176001555b51610282602060405183610271829551809285808601910161078f565b6101205261018052610160526101a0526101c0528051905f915f915b81831061051057836101e05260018060a01b03610140511660018060a01b03610160511690604051905f806020840163095ea7b360e01b8152856024860152811960448601526044855261037f60648661073f565b84519082855af161038e610838565b816104d5575b50806104cb575b15610486575b60405161164d908161093982396080518161129e015260a05181818161030001528181610fa6015281816111ce0152611384015260c0518181816103470152610fed015260e05181818161020b01526107870152610100518181816105a9015261088e015261012051818181610a7301526112550152610140518181816104b901528181610af801526110ce0152610160518181816104760152610c980152610180518181816101cf0152610b2901526101a051818181610194015261091c01526101c0518181816102be0152610b5301526101e05181818161041901526108ea0152f35b6104be6104c3936040519063095ea7b360e01b602083015260248201525f6044820152604481526104b860648261073f565b82610867565b610867565b8080806103a1565b50803b151561039b565b80518015925082156104ea575b505084610394565b819250906020918101031261050c57602061050591016107f5565b84806104e2565b5f80fd5b91929091906001600160401b036105278584610802565b5151166001600160401b03918216019081116105da57926105488183610802565b519060045491680100000000000000008310156105c65760018301806004558310156105b25760019260045f5260205f200190838060401b038151166cffffffffff00000000000000006020845493015160401b1691858060681b0319161717905501919061032a565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b015190505f806102dc565b90601f1983169160015f52815f20925f5b81811061064a575091600193918561030e97969410610632575b505050811b016001556102f1565b01515f1960f88460031b161c191690555f8080610624565b9293602060018192878601518155019501930161060a565b60015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6601f840160051c810191602085106106bb575b601f0160051c01905b8181106106b057506102bf565b5f81556001016106a3565b909150819061069a565b634e487b7160e01b5f52602260045260245ffd5b90607f16906102ad565b60408483031261050c5760408051919082016001600160401b038111838210176105c6576040528451906001600160401b038216820361050c578260209260409452610730838801610762565b838201528152019301926101d4565b601f909101601f19168101906001600160401b038211908210176105c657604052565b519064ffffffffff8216820361050c57565b6001600160401b0381116105c657601f01601f191660200190565b5f5b8381106107a05750505f910152565b8181015183820152602001610791565b81601f8201121561050c5780516107c681610774565b926107d4604051948561073f565b8184526020828401011161050c576107f2916020808501910161078f565b90565b5190811515820361050c57565b80518210156105b25760209160051b010190565b60208151910151906020811061082a575090565b5f199060200360031b1b1690565b3d15610862573d9061084982610774565b91610857604051938461073f565b82523d5f602084013e565b606090565b5f8061088f9260018060a01b03169360208151910182865af1610888610838565b90836108da565b80519081151591826108b7575b50506108a55750565b635274afe760e01b5f5260045260245ffd5b819250906020918101031261050c5760206108d291016107f5565b155f8061089c565b906108fe57508051156108ef57805190602001fd5b630a12f52160e11b5f5260045ffd5b8151158061092f575b61090f575090565b639996b31560e01b5f9081526001600160a01b0391909116600452602490fd5b50803b1561090756fe6080806040526004361015610012575f80fd5b5f3560e01c9081630724fda914611288575080630f7514a21461123d5780631686c909146110115780632dd3100014610fce5780633f31ae3f146106fc57806349fc73dd146105f05780634e390d3e146105cc57806351e75e8b1461059257806375829def146104dd57806382bfefc81461049a578063845aef4b1461045757806390e64d131461043d578063936c63d9146103f9578063a480ca7914610324578063bb4b5734146102e3578063bf44497a146102a7578063bf4ed03f1461022e578063c57981b5146101f4578063cbe9e5ef146101b8578063ce36b33514610177578063ce516507146101375763f851a4401461010e575f80fd5b34610133575f3660031901126101335760206001600160a01b035f5416604051908152f35b5f80fd5b3461013357602036600319011261013357602061016d60043560ff6001918060081c5f526002602052161b60405f205416151590565b6040519015158152f35b34610133575f36600319011261013357602060405164ffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610133575f3660031901126101335760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b34610133575f3660031901126101335760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34610133575f366003190112610133576102466113f8565b6040518091602082016020835281518091526020604084019201905f5b818110610271575050500390f35b8251805167ffffffffffffffff16855260209081015164ffffffffff168186015286955060409094019390920191600101610263565b34610133575f3660031901126101335760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b34610133575f36600319011261013357602060405164ffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101335760203660031901126101335761033d611310565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168033036103ca575047905f80808085855af16103816113b9565b501561039257602082604051908152f35b6001600160a01b03907f245bf0c0000000000000000000000000000000000000000000000000000000005f521660045260245260445ffd5b7f4e3ddeed000000000000000000000000000000000000000000000000000000005f526004523360245260445ffd5b34610133575f36600319011261013357602060405167ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610133575f36600319011261013357602061016d61137c565b34610133575f3660031901126101335760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610133575f3660031901126101335760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610133576020366003190112610133576104f6611310565b5f546001600160a01b03811633810361056357506001600160a01b037fffffffffffffffffffffffff0000000000000000000000000000000000000000921691829116175f55337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf805f80a3005b7fc6cce6a4000000000000000000000000000000000000000000000000000000005f526004523360245260445ffd5b34610133575f3660031901126101335760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34610133575f36600319011261013357602064ffffffffff60035416604051908152f35b34610133575f366003190112610133576040515f6001548060011c906001811680156106f2575b6020831081146106de578285529081156106ba575060011461065c575b6106588361064481850382611342565b6040519182916020835260208301906112d1565b0390f35b91905060015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6915f905b8082106106a057509091508101602001610644610634565b919260018160209254838588010152019101909291610688565b60ff191660208086019190915291151560051b840190910191506106449050610634565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610617565b608036600319011261013357600435602435906001600160a01b03821680920361013357604435906001600160801b03821691828103610133576064359367ffffffffffffffff851161013357366023860112156101335784600401359467ffffffffffffffff86116101335760248660051b8201013681116101335761078161137c565b610f77577f0000000000000000000000000000000000000000000000000000000000000000803410610f4857506107cf8560ff6001918060081c5f526002602052161b60405f205416151590565b610f1c576040516020810190868252846040820152876060820152606081526107f9608082611342565b5190206040516020810191825260208152610815604082611342565b5190209161082288611364565b97610830604051998a611342565b8852602401602088015b828210610f0c57505050925f935b865185101561088a5761085b85886114ad565b519081811015610879575f52602052600160405f205b940193610848565b905f52602052600160405f20610871565b85907f000000000000000000000000000000000000000000000000000000000000000003610ee45760035464ffffffffff811615610eca575b508160081c5f52600260205260405f20600160ff84161b815417905567ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016670de0b6b3a76400008103610e9f57507f000000000000000000000000000000000000000000000000000000000000000064ffffffffff8116610e99575064ffffffffff4216935b61095a6113f8565b9081519161096783611364565b926109756040519485611342565b808452601f1961098482611364565b015f5b818110610e765750506109b66109b167ffffffffffffffff6109a88561148c565b51511687611506565b6114c1565b64ffffffffff8060206109c88661148c565b510151168a0116906001600160801b03604051916109e583611326565b169182825260208201526109f88661148c565b52610a028561148c565b50916001905b828210610de25750506001600160801b038216858111610dce578511610da3575b50505064ffffffffff6020610a425f19845101846114ad565b51015116946001600160a01b035f54169564ffffffffff60405192610a6684611326565b16825260208201526040517f0000000000000000000000000000000000000000000000000000000000000000602082015260208152610aa6604082611342565b60405191610ab383611326565b5f83525f602084015260405197610120890189811067ffffffffffffffff821117610d8f576040999594939299528452602084019787895260408501868152606086017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815260808701907f00000000000000000000000000000000000000000000000000000000000000001515825260a08801927f00000000000000000000000000000000000000000000000000000000000000001515845260c0890194855260e0890195865261010089019687526040519c8d997f7ee21391000000000000000000000000000000000000000000000000000000008b5260048b0160409052516001600160a01b031660448b0152516001600160a01b031660648a0152516001600160801b03166084890152516001600160a01b031660a488015251151560c487015251151560e486015251805164ffffffffff166101048601526020015164ffffffffff1661012485015251610144840161016090526101a48401610c43916112d1565b905180516001600160a01b03166101648501526020015161018484015260031983820301602484015281519081815260200191602001905f5b818110610d5a57505050908060209203815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af1938415610d4f575f94610cfb575b507f28b58397e03322f670d6b223cc863f8c148e368b8b615412e6798a641a22842d9160409182519182526020820152a3005b9093506020813d602011610d47575b81610d1760209383611342565b810103126101335751927f28b58397e03322f670d6b223cc863f8c148e368b8b615412e6798a641a22842d610cc8565b3d9150610d0a565b6040513d5f823e3d90fd5b825180516001600160801b0316855260209081015164ffffffffff168186015289955060409094019390920191600101610c7c565b634e487b7160e01b5f52604160045260245ffd5b6001600160801b0391610dba83925f1901866114ad565b519303168183511601169052858080610a29565b634e487b7160e01b5f52600160045260245ffd5b90926001600160801b03600191610e116109b167ffffffffffffffff610e0889886114ad565b5151168b611506565b9064ffffffffff806020610e285f198b018d6114ad565b51015116816020610e398b8a6114ad565b51015116011660405190610e4c82611326565b84841682526020820152610e60888b6114ad565b52610e6b878a6114ad565b500116930190610a08565b602090604051610e8581611326565b5f81525f8382015282828901015201610987565b93610952565b7f36d385ef000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b64ffffffffff19164264ffffffffff1617600355846108c3565b7fb4f06787000000000000000000000000000000000000000000000000000000005f5260045ffd5b813581526020918201910161083a565b847febe6f30d000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7fa164c6b4000000000000000000000000000000000000000000000000000000005f523460045260245260445ffd5b7fdf4bae05000000000000000000000000000000000000000000000000000000005f524260045264ffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660245260445ffd5b34610133575f3660031901126101335760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101335760403660031901126101335761102a611310565b6024356001600160801b038116809103610133576001600160a01b035f5416338103610563575064ffffffffff6003541680151580611208575b806111f9575b61119f57506040516111045f806001600160a01b0360208501967fa9059cbb0000000000000000000000000000000000000000000000000000000088521695866024860152856044860152604485526110c4606486611342565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001694519082865af16110fd6113b9565b90836115b4565b805190811515918261117b575b505061115057507f2e9d425ba8b27655048400b366d7b6a1f7180ebdb088e06bb7389704860ffe1f60206001600160a01b035f541692604051908152a3005b7f5274afe7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b81925090602091810103126101335760200151801590811503610133578480611111565b7fe2e40a0c000000000000000000000000000000000000000000000000000000005f524260045264ffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660245260445260645ffd5b5061120261137c565b1561106a565b5062093a80810164ffffffffff81116112295764ffffffffff164211611064565b634e487b7160e01b5f52601160045260245ffd5b34610133575f366003190112610133576106586040517f0000000000000000000000000000000000000000000000000000000000000000602082015260208152610644604082611342565b34610133575f36600319011261013357610658907f0000000000000000000000000000000000000000000000000000000000000000602082015260208152610644604082611342565b91908251928382525f5b8481106112fb575050825f602080949584010152601f8019910116010190565b806020809284010151828286010152016112db565b600435906001600160a01b038216820361013357565b6040810190811067ffffffffffffffff821117610d8f57604052565b90601f8019910116810190811067ffffffffffffffff821117610d8f57604052565b67ffffffffffffffff8111610d8f5760051b60200190565b64ffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680151590816113b1575090565b905042101590565b3d156113f3573d9067ffffffffffffffff8211610d8f57604051916113e8601f8201601f191660200184611342565b82523d5f602084013e565b606090565b6004549061140582611364565b916114136040519384611342565b80835260045f9081527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b602085015b83831061144f5750505050565b60016020819260405161146181611326565b64ffffffffff865467ffffffffffffffff8116835260401c1683820152815201920192019190611442565b8051156114995760200190565b634e487b7160e01b5f52603260045260245ffd5b80518210156114995760209160051b010190565b6001600160801b0381116114db576001600160801b031690565b7f4916adce000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b9091905f19838209838202918280831092039180830392146115a357670de0b6b3a7640000821015611573577faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac106699394670de0b6b3a7640000910990828211900360ee1b910360121c170290565b84907f5173648d000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b5050670de0b6b3a764000090049150565b906115f157508051156115c957805190602001fd5b7f1425ea42000000000000000000000000000000000000000000000000000000005f5260045ffd5b81511580611637575b611602575090565b6001600160a01b03907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b156115fa56fea164736f6c634300081a000aa164736f6c634300081a000a"; + hex"608034609357601f615e5738819003918201601f19168301916001600160401b03831184841017609757808492602094604052833981010312609357516001600160a01b038116908190036093575f80546001600160a01b0319168217815560405191907fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a3615dab90816100ac8239f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c8063050d535a14610a055780633f693dcb1461067e578063474a7634146105205780634d419abc146104b05780634d7c0f11146103dd5780635a6c72d0146103c057806375829def1461033a578063a480ca7914610250578063a4ab5432146101c9578063c93a6c8414610170578063d49466a8146100c65763f851a4401461009d575f80fd5b346100c2575f3660031901126100c25760206001600160a01b035f5416604051908152f35b5f80fd5b346100c25760403660031901126100c2576100df610dee565b602435906001600160a01b035f541633810361015a57506001600160a01b031690815f52600260205280600160405f20805460ff81161561014c575b5001556040519081527f2cd7b20ee8b62492029a3c64fecf1603b5550673e9c2a72ea38044568108a08860203392a3005b60ff1916821781558561011b565b6331b339a960e21b5f526004523360245260445ffd5b346100c25760203660031901126100c2576004356001600160a01b035f541633810361015a5750806001556040519081527ff20c52fd919086f2a3380c19e51ff1fb508de65b5eb8e07c1a69695a32af651960203392a2005b346100c25760203660031901126100c2576101e2610dee565b6001600160a01b035f541690338203610239576001600160a01b0316805f5260026020525f6001604082208281550155337f633e9c50ac98dfb667e9ab9e544db6b3f26f93fbde630f500afe6bf0cd78d8ab5f80a3005b506331b339a960e21b5f526004523360245260445ffd5b346100c25760203660031901126100c2576004356001600160a01b0381168091036100c2576001600160a01b035f5416604051907fa480ca7900000000000000000000000000000000000000000000000000000000825260048201526020816024815f865af190811561032f575f916102fd575b507fbf461a00c2a56d50c1ffe10b436b0da1a2b3a86fa5154599854bbf6be334d85060206001600160a01b035f541692604051908152a3005b90506020813d602011610327575b8161031860209383610da6565b810103126100c25751826102c4565b3d915061030b565b6040513d5f823e3d90fd5b346100c25760203660031901126100c257610353610dee565b5f546001600160a01b03811633810361015a57506001600160a01b037fffffffffffffffffffffffff0000000000000000000000000000000000000000921691829116175f55337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf805f80a3005b346100c2575f3660031901126100c2576020600154604051908152f35b346100c25760203660031901126100c25760043567ffffffffffffffff81116100c257366023820112156100c25780600401359067ffffffffffffffff82116100c2573660248360061b830101116100c2575f90815b838310156104915760248360061b830101359067ffffffffffffffff82168092036100c25767ffffffffffffffff160167ffffffffffffffff811161047d57600190920191610433565b634e487b7160e01b5f52601160045260245ffd5b602090670de0b6b3a764000067ffffffffffffffff6040519216148152f35b346100c25760203660031901126100c2576001600160a01b036104d1610dee565b5f60206040516104e081610d8a565b8281520152165f5260026020526040805f2081516104fd81610d8a565b6020600160ff845416151593848452015491019081528251918252516020820152f35b346100c25760603660031901126100c25760043567ffffffffffffffff81116100c257610551903690600401610e5a565b604051602081016020815261057b8261056d6040820186610fba565b03601f198101845283610da6565b6105b06034604051809361059f60208301963360601b885251809285850190610f74565b81010301601f198101835282610da6565b519020906105bd3361108d565b916040516111b280820182811067ffffffffffffffff82111761066a5782916110c68339604081528560206105f56040840188610fba565b92015203905ff591821561032f577fca58fb398f60b2cc5e664a08608a6aabe7077d2684a2d82a7d5b83322fd2b2a761064a6001600160a01b0360209516938493604051928392608084526080840190610fba565b9060243588840152604435604084015260608301520390a2604051908152f35b634e487b7160e01b5f52604160045260245ffd5b346100c2576101003660031901126100c25760043567ffffffffffffffff81116100c2576106b0903690600401610e5a565b6106b8610f40565b906106c1610f56565b906106ca610f65565b906106d3610dc8565b60a4359167ffffffffffffffff83116100c257366023840112156100c257826004013567ffffffffffffffff811161066a576040519361071960208360051b0186610da6565b8185526024602086019260061b820101903682116100c257602401915b8183106109b85750505082515f905f905b8082106109795750503361075a9061108d565b60405160208101976020895281604081016107759087610fba565b03601f19810183526107879083610da6565b6040519860208a01602081528a604081016107a2908b61103d565b03601f1981018c526107b4908c610da6565b8b60405193849360208501963360601b8852519081603487016107d692610f74565b8401916001600160a01b03169d6bffffffffffffffffffffffff199060601b16603483015215159a8b60f81b604883015215159b8c60f81b604983015264ffffffffff8a169960d81b7fffffffffff00000000000000000000000000000000000000000000000000000016604a830152519182604f830161085692610f74565b0160340103601b01601f198101825261086f9082610da6565b519020604051611f8680820182811067ffffffffffffffff82111761066a578460c06108d48e8e8e8897613e19893960e087526108b08d60e0890190610fba565b926020880152604087015260608601528b608086015284810360a08601528c61103d565b92015203905ff5801561032f576020987f7f4d78094331349dd7faaa3e5d7de64176340a988e70586fac394de324566ce296610930966001600160a01b0361095194169a8b9a604051998a996101408b526101408b0190610fba565b948e8a015260408901526060880152608087015285820360a087015261103d565b9160c084015260c43560e084015260e4356101008401526101208301520390a2604051908152f35b909185518310156109a45760019064ffffffffff6020808660051b8a01015101511601920190610747565b634e487b7160e01b5f52603260045260245ffd5b6040833603126100c257604051906109cf82610d8a565b83359067ffffffffffffffff821682036100c25782602092604094526109f6838701610ddc565b83820152815201920191610736565b346100c2576101603660031901126100c25760043567ffffffffffffffff81116100c257610a37903690600401610e5a565b610a3f610f40565b610a47610f56565b90610a50610f65565b9060a03660831901126100c25760405160a0810181811067ffffffffffffffff82111761066a57604052610a82610dc8565b815260a43567ffffffffffffffff811681036100c257602082015260c43564ffffffffff811681036100c257604082015260e43567ffffffffffffffff811681036100c25760608201526101043564ffffffffff811681036100c2576080820152604051610bea610bfb60166020840160208152610b1585610b07604082018d610fba565b03601f198101875286610da6565b60346040519960208b0190610b71828a64ffffffffff6080809282815116855267ffffffffffffffff602082015116602086015282604082015116604086015267ffffffffffffffff6060820151166060860152015116910152565b60a08c52610b8060c08d610da6565b604051968794610ba0602087019a3360601b8c5251809287890190610f74565b8501916001600160a01b038c169b6bffffffffffffffffffffffff199060601b168584015215159b8c60f81b604884015215159c8d60f81b6049840152518093604a840190610f74565b01010301601f198101835282610da6565b51902094610c083361108d565b95604051611ba180820182811067ffffffffffffffff82111761066a5782916122788339610140815289610120610c43610140840188610fba565b928960208201528a60408201528b6060820152610caa608082018a64ffffffffff6080809282815116855267ffffffffffffffff602082015116602086015282604082015116604086015267ffffffffffffffff6060820151166060860152015116910152565b015203905ff592831561032f57602096610d65610d05946001600160a01b037f8ecd3adfa7cae76abab946b73ca62f03f8d77535fb2547a0f0883faef143b56097169889986040519788976101808952610180890190610fba565b958c88015260408701526060860152608085019064ffffffffff6080809282815116855267ffffffffffffffff602082015116602086015282604082015116604086015267ffffffffffffffff6060820151166060860152015116910152565b61012435610120840152610144356101408401526101608301520390a2604051908152f35b6040810190811067ffffffffffffffff82111761066a57604052565b90601f8019910116810190811067ffffffffffffffff82111761066a57604052565b6084359064ffffffffff821682036100c257565b359064ffffffffff821682036100c257565b600435906001600160a01b03821682036100c257565b81601f820112156100c25780359067ffffffffffffffff821161066a5760405192610e39601f8401601f191660200185610da6565b828452602083830101116100c257815f926020809301838601378301015290565b919060e0838203126100c2576040519060e0820182811067ffffffffffffffff82111761066a57604052819380356001600160a01b03811681036100c2578352610ea660208201610ddc565b602084015260408101356001600160a01b03811681036100c2576040840152606081013567ffffffffffffffff81116100c25782610ee5918301610e04565b60608401526080810135608084015260a081013567ffffffffffffffff81116100c25782610f14918301610e04565b60a084015260c08101359167ffffffffffffffff83116100c25760c092610f3b9201610e04565b910152565b602435906001600160a01b03821682036100c257565b6044359081151582036100c257565b6064359081151582036100c257565b5f5b838110610f855750505f910152565b8181015183820152602001610f76565b90602091610fae81518092818552858086019101610f74565b601f01601f1916010190565b61103a916001600160a01b03825116815264ffffffffff60208301511660208201526001600160a01b03604083015116604082015260c061102961100d606085015160e0606086015260e0850190610f95565b6080850151608085015260a085015184820360a0860152610f95565b9201519060c0818403910152610f95565b90565b90602080835192838152019201905f5b81811061105a5750505090565b8251805167ffffffffffffffff16855260209081015164ffffffffff16818601526040909401939092019160010161104d565b6001600160a01b0316805f52600260205260ff60405f2054165f146110be575f526002602052600160405f20015490565b506001549056fe61016080604052346103f7576111b2803803809161001d82856103fb565b833981016040828203126103f75781516001600160401b0381116103f757820160e0818303126103f7576040519060e082016001600160401b038111838210176103e35760405280516001600160a01b03811681036103f757825260208101519064ffffffffff821682036103f757602083019182526040810151936001600160a01b03851685036103f7576040840194855260608201516001600160401b0381116103f757816100cf91840161043f565b94606085019586526080830151946080810195865260a084015160018060401b0381116103f7578361010291860161043f565b60a0820190815260c0850151969091906001600160401b0388116103f757602061013581966101db9a6101d6990161043f565b60c084019081529a015193515f80546001600160a01b0319166001600160a01b039290921691821781556040519889969264ffffffffff927fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a3511660a0523360c05260e0525161010052516001600160a01b031661014052518051906101c590829084860190860161041e565b81010301601f1981018352826103fb565b610493565b60805251805191906001600160401b0383116103e357600154600181811c911680156103d9575b60208210146103c557601f8111610362575b50602090601f84116001146102fa5761026293915f91836102ef575b50508160011b915f199060031b1c1916176001555b516101d66020604051836101c5829551809285808601910161041e565b61012052604051610cfc90816104b6823960805181610a4f015260a05181818161018c015281816108170152818161097f0152610b1d015260c0518181816101d3015261085e015260e05181818161014c015261058f0152610100518181816103ae015261068f01526101205181610a060152610140518181816102be0152818161070a01526108f10152f35b015190505f80610230565b90601f1984169160015f52815f20925f5b81811061034a5750916001939186610262979410610332575b505050811b01600155610245565b01515f1960f88460031b161c191690555f8080610324565b9293602060018192878601518155019501930161030b565b60015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6601f850160051c810191602086106103bb575b601f0160051c01905b8181106103b05750610214565b5f81556001016103a3565b909150819061039a565b634e487b7160e01b5f52602260045260245ffd5b90607f1690610202565b634e487b7160e01b5f52604160045260245ffd5b5f80fd5b601f909101601f19168101906001600160401b038211908210176103e357604052565b5f5b83811061042f5750505f910152565b8181015183820152602001610420565b81601f820112156103f75780516001600160401b0381116103e35760405192610472601f8301601f1916602001856103fb565b818452602082840101116103f757610490916020808501910161041e565b90565b6020815191015190602081106104a7575090565b5f199060200360031b1b169056fe6080806040526004361015610012575f80fd5b5f3560e01c9081630724fda914610a39575080630f7514a2146109ee5780631686c909146108825780632dd310001461083f5780633f31ae3f146104f957806349fc73dd146103f55780634e390d3e146103d157806351e75e8b1461039757806375829def146102e257806382bfefc81461029f57806390e64d1314610285578063a480ca79146101b0578063bb4b57341461016f578063c57981b514610135578063ce516507146100f55763f851a440146100cc575f80fd5b346100f1575f3660031901126100f15760206001600160a01b035f5416604051908152f35b5f80fd5b346100f15760203660031901126100f157602061012b60043560ff6001918060081c5f526002602052161b60405f205416151590565b6040519015158152f35b346100f1575f3660031901126100f15760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346100f1575f3660031901126100f157602060405164ffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f15760203660031901126100f1576101c9610ac9565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016803303610256575047905f80808085855af161020d610b52565b501561021e57602082604051908152f35b6001600160a01b03907f245bf0c0000000000000000000000000000000000000000000000000000000005f521660045260245260445ffd5b7f4e3ddeed000000000000000000000000000000000000000000000000000000005f526004523360245260445ffd5b346100f1575f3660031901126100f157602061012b610b15565b346100f1575f3660031901126100f15760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f15760203660031901126100f1576102fb610ac9565b5f546001600160a01b03811633810361036857506001600160a01b037fffffffffffffffffffffffff0000000000000000000000000000000000000000921691829116175f55337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf805f80a3005b7fc6cce6a4000000000000000000000000000000000000000000000000000000005f526004523360245260445ffd5b346100f1575f3660031901126100f15760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346100f1575f3660031901126100f157602064ffffffffff60035416604051908152f35b346100f1575f3660031901126100f1576040515f6001548060011c906001811680156104ef575b6020831081146104db578285529081156104b75750600114610459575b6104558361044981850382610adf565b60405191829182610a82565b0390f35b91905060015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6915f905b80821061049d57509091508101602001610449610439565b919260018160209254838588010152019101909291610485565b60ff191660208086019190915291151560051b840190910191506104499050610439565b634e487b7160e01b5f52602260045260245ffd5b91607f169161041c565b60803660031901126100f157600435602435906001600160a01b038216918281036100f157604435926fffffffffffffffffffffffffffffffff84168094036100f1576064359367ffffffffffffffff85116100f157366023860112156100f157846004013567ffffffffffffffff81116100f1578060051b95602487820101903682116100f157610589610b15565b6107e8577f00000000000000000000000000000000000000000000000000000000000000008034106107b957506105d78760ff6001918060081c5f526002602052161b60405f205416151590565b61078d57604051602081019088825286604082015285606082015260608152610601608082610adf565b519020604051602081019182526020815261061d604082610adf565b5190209261063160206040519a018a610adf565b8852602401602088015b82821061077d57505050925f935b865185101561068b5760208560051b88010151908181105f1461067a575f52602052600160405f205b940193610649565b905f52602052600160405f20610672565b85907f000000000000000000000000000000000000000000000000000000000000000003610755578261072e7f1dcd2362ae467d43bf31cbcac0526c0958b23eb063e011ab49a5179c839ed9a99460409460035464ffffffffff81161561073b575b508460081c5f526002602052855f20600160ff87161b81541790557f0000000000000000000000000000000000000000000000000000000000000000610b91565b82519182526020820152a2005b64ffffffffff19164264ffffffffff1617600355886106ed565b7fb4f06787000000000000000000000000000000000000000000000000000000005f5260045ffd5b813581526020918201910161063b565b867febe6f30d000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7fa164c6b4000000000000000000000000000000000000000000000000000000005f523460045260245260445ffd5b7fdf4bae05000000000000000000000000000000000000000000000000000000005f524260045264ffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660245260445ffd5b346100f1575f3660031901126100f15760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f15760403660031901126100f15761089b610ac9565b602435906fffffffffffffffffffffffffffffffff82168092036100f1576001600160a01b035f5416338103610368575064ffffffffff60035416801515806109b9575b806109aa575b610950575061091582827f0000000000000000000000000000000000000000000000000000000000000000610b91565b7f2e9d425ba8b27655048400b366d7b6a1f7180ebdb088e06bb7389704860ffe1f60206001600160a01b03805f5416936040519586521693a3005b7fe2e40a0c000000000000000000000000000000000000000000000000000000005f524260045264ffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660245260445260645ffd5b506109b3610b15565b156108e5565b5062093a80810164ffffffffff81116109da5764ffffffffff1642116108df565b634e487b7160e01b5f52601160045260245ffd5b346100f1575f3660031901126100f1576104556040517f0000000000000000000000000000000000000000000000000000000000000000602082015260208152610449604082610adf565b346100f1575f3660031901126100f157610455907f0000000000000000000000000000000000000000000000000000000000000000602082015260208152610449604082610adf565b9190916020815282518060208301525f5b818110610ab3575060409293505f838284010152601f8019910116010190565b8060208092870101516040828601015201610a93565b600435906001600160a01b03821682036100f157565b90601f8019910116810190811067ffffffffffffffff821117610b0157604052565b634e487b7160e01b5f52604160045260245ffd5b64ffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015159081610b4a575090565b905042101590565b3d15610b8c573d9067ffffffffffffffff8211610b015760405191610b81601f8201601f191660200184610adf565b82523d5f602084013e565b606090565b5f610bfe926001600160a01b038293604051968260208901947fa9059cbb000000000000000000000000000000000000000000000000000000008652166024890152604488015260448752610be7606488610adf565b1694519082865af1610bf7610b52565b9083610c63565b8051908115159182610c3f575b5050610c145750565b7f5274afe7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b81925090602091810103126100f157602001518015908115036100f1575f80610c0b565b90610ca05750805115610c7857805190602001fd5b7f1425ea42000000000000000000000000000000000000000000000000000000005f5260045ffd5b81511580610ce6575b610cb1575090565b6001600160a01b03907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b15610ca956fea164736f6c634300081a000a6101c0806040523461057057611ba1803803809161001d8285610687565b833981018181039161014083126105705780516001600160401b03811161057057810160e0818403126105705760405160e081016001600160401b038111828210176106735760405281516001600160a01b0381168103610570578152610086602083016106aa565b60208201908152604083015190956001600160a01b0382168203610570576040830191825260608401516001600160401b03811161057057866100ca9186016106f8565b96606084019788526080850151946080850195865260a081015160018060401b03811161057057886100fd9183016106f8565b60a0860190815260c08201519098906001600160401b0381116105705761012492016106f8565b60c0850190815260208701516001600160a01b038116999091908a83036105705761015160408a0161073d565b9360a061016060608c0161073d565b96607f190112610570576040519660a088016001600160401b038111898210176106735760405261019360808c016106aa565b88526101a160a08c0161074a565b602089019081529b6101b560c08d016106aa565b60408a01908152996101c960e08e0161074a565b60608b019081529b6101de6101008f016106aa565b60808c01908152610120909e015193515f80546001600160a01b0319166001600160a01b039290921691821781556040519687969290917fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a35164ffffffffff1660a0523360c05260e0525161010052516001600160a01b03166101405251805190610274908290602085810191016106d7565b8101038082526102879060200182610687565b6102909061075e565b608052518051906001600160401b03821161067357600154600181811c91168015610669575b602082101461065557601f81116105f2575b50602090601f831160011461057f57918064ffffffffff989796959492610338945f92610574575b50508160011b915f199060031b1c1916176001555b5161033360206040518361032282955180928580860191016106d7565b81010301601f198101835282610687565b61075e565b6101205261016052610180526101a05251169071ffffffffff000000000000000000000000006004549565010000000000600160681b03905160281b16915160681b1692600160901b600160d01b03905160901b169364ffffffffff60d01b905160d01b169464ffffffffff60d01b1992600160901b600160d01b03199160018060901b0319161716171617171760045560018060a01b036101405116604051905f806020840163095ea7b360e01b81528560248601528119604486015260448552610405606486610687565b84519082855af1610414610780565b81610539575b508061052f575b156104ea575b6040516113209081610881823960805181611036015260a05181818161023001528181610c8a01528181610f660152611120015260c0518181816102770152610cd1015260e0518181816101b4015261067301526101005181818161049501526107730152610120518181816108950152610fed0152610140518181816103a5015281816109140152610e660152610160518181816103620152610aac015261018051818181610178015261094501526101a0518181816101ee015261096f0152f35b610522610527936040519063095ea7b360e01b602083015260248201525f60448201526044815261051c606482610687565b826107af565b6107af565b5f8080610427565b50803b1515610421565b805180159250821561054e575b50505f61041a565b8192509060209181010312610570576020610569910161073d565b5f80610546565b5f80fd5b015190505f806102f0565b90601f1983169160015f52815f20925f5b8181106105da57509260019285926103389664ffffffffff9c9b9a999896106105c2575b505050811b01600155610305565b01515f1960f88460031b161c191690555f80806105b4565b92936020600181928786015181550195019301610590565b60015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6601f840160051c8101916020851061064b575b601f0160051c01905b81811061064057506102c8565b5f8155600101610633565b909150819061062a565b634e487b7160e01b5f52602260045260245ffd5b90607f16906102b6565b634e487b7160e01b5f52604160045260245ffd5b601f909101601f19168101906001600160401b0382119082101761067357604052565b519064ffffffffff8216820361057057565b6001600160401b03811161067357601f01601f191660200190565b5f5b8381106106e85750505f910152565b81810151838201526020016106d9565b81601f8201121561057057805161070e816106bc565b9261071c6040519485610687565b818452602082840101116105705761073a91602080850191016106d7565b90565b5190811515820361057057565b51906001600160401b038216820361057057565b602081519101519060208110610772575090565b5f199060200360031b1b1690565b3d156107aa573d90610791826106bc565b9161079f6040519384610687565b82523d5f602084013e565b606090565b5f806107d79260018060a01b03169360208151910182865af16107d0610780565b9083610822565b80519081151591826107ff575b50506107ed5750565b635274afe760e01b5f5260045260245ffd5b819250906020918101031261057057602061081a910161073d565b155f806107e4565b90610846575080511561083757805190602001fd5b630a12f52160e11b5f5260045ffd5b81511580610877575b610857575090565b639996b31560e01b5f9081526001600160a01b0391909116600452602490fd5b50803b1561084f56fe6080806040526004361015610012575f80fd5b5f3560e01c9081630724fda914611020575080630f7514a214610fd55780631686c90914610da957806326fadbe214610cf55780632dd3100014610cb25780633f31ae3f146105e857806349fc73dd146104dc5780634e390d3e146104b857806351e75e8b1461047e57806375829def146103c957806382bfefc814610386578063845aef4b1461034357806390e64d1314610329578063a480ca7914610254578063bb4b573414610213578063bf44497a146101d7578063c57981b51461019d578063cbe9e5ef14610161578063ce516507146101215763f851a440146100f8575f80fd5b3461011d575f36600319011261011d5760206001600160a01b035f5416604051908152f35b5f80fd5b3461011d57602036600319011261011d57602061015760043560ff6001918060081c5f526002602052161b60405f205416151590565b6040519015158152f35b3461011d575f36600319011261011d5760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b3461011d575f36600319011261011d5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461011d575f36600319011261011d5760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b3461011d575f36600319011261011d57602060405164ffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461011d57602036600319011261011d5761026d6110a8565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168033036102fa575047905f80808085855af16102b1611155565b50156102c257602082604051908152f35b6001600160a01b03907f245bf0c0000000000000000000000000000000000000000000000000000000005f521660045260245260445ffd5b7f4e3ddeed000000000000000000000000000000000000000000000000000000005f526004523360245260445ffd5b3461011d575f36600319011261011d576020610157611118565b3461011d575f36600319011261011d5760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461011d575f36600319011261011d5760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461011d57602036600319011261011d576103e26110a8565b5f546001600160a01b03811633810361044f57506001600160a01b037fffffffffffffffffffffffff0000000000000000000000000000000000000000921691829116175f55337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf805f80a3005b7fc6cce6a4000000000000000000000000000000000000000000000000000000005f526004523360245260445ffd5b3461011d575f36600319011261011d5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461011d575f36600319011261011d57602064ffffffffff60035416604051908152f35b3461011d575f36600319011261011d576040515f6001548060011c906001811680156105de575b6020831081146105ca578285529081156105a65750600114610548575b61054483610530818503826110f6565b604051918291602083526020830190611069565b0390f35b91905060015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6915f905b80821061058c57509091508101602001610530610520565b919260018160209254838588010152019101909291610574565b60ff191660208086019190915291151560051b840190910191506105309050610520565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610503565b608036600319011261011d57600435602435906001600160a01b03821680920361011d576044356001600160801b03811680910361011d576064359067ffffffffffffffff821161011d573660238301121561011d57816004013567ffffffffffffffff811161011d578060051b926024848201019036821161011d5761066d611118565b610c5b577f0000000000000000000000000000000000000000000000000000000000000000803410610c2c57506106bb8660ff6001918060081c5f526002602052161b60405f205416151590565b610c00576040516020810190878252886040820152856060820152606081526106e56080826110f6565b51902060405160208101918252602081526107016040826110f6565b5190209261071560206040519701876110f6565b8552602401602085015b828210610bf057505050935f945b835186101561076f5760208660051b85010151908181105f1461075e575f52602052600160405f205b95019461072d565b905f52602052600160405f20610756565b84907f000000000000000000000000000000000000000000000000000000000000000003610bc85760035464ffffffffff811615610bae575b508060081c5f52600260205260405f20600160ff83161b8154179055604051926107d1846110da565b5f808552602085015260045464ffffffffff811680610ba7575064ffffffffff421685525b5f9064ffffffffff8160681c1680610b91575b5064ffffffffff80875116818360d01c160116602087015261087261086067ffffffffffffffff6040519361083d856110da565b5f85525f60208601526001600160801b03610865610860848460281c168a6111d9565b611194565b16855260901c16856111d9565b916001600160801b0360208301931683526001600160a01b035f541692604051927f00000000000000000000000000000000000000000000000000000000000000006020850152602084526108c86040856110f6565b604051936108d5856110da565b5f85525f602086015260405195610120870187811067ffffffffffffffff821117610b7d5760405286526020860199898b5260408701888152606088017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815260808901907f00000000000000000000000000000000000000000000000000000000000000001515825260a08a01927f00000000000000000000000000000000000000000000000000000000000000001515845260c08b0194855260e08b019586526101008b01998a526040519e8f9b7f7a695841000000000000000000000000000000000000000000000000000000008d5260048d0160809052516001600160a01b031660848d0152516001600160a01b031660a48c0152516001600160801b031660c48b0152516001600160a01b031660e48a015251151561010489015251151561012488015251805164ffffffffff166101448801526020015164ffffffffff1661016487015251610184860161016090526101e48601610a6191611069565b935180516001600160a01b03166101a4870152602001516101c4860152516001600160801b03166024850152516001600160801b0316604484015264ffffffffff16606483015203847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691815a6020945f91f1938415610b72575f94610b1e575b507f28b58397e03322f670d6b223cc863f8c148e368b8b615412e6798a641a22842d9160409182519182526020820152a3005b9093506020813d602011610b6a575b81610b3a602093836110f6565b8101031261011d5751927f28b58397e03322f670d6b223cc863f8c148e368b8b615412e6798a641a22842d610aeb565b3d9150610b2d565b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b64ffffffffff8092935087511601169086610809565b85526107f6565b64ffffffffff19164264ffffffffff1617600355836107a8565b7fb4f06787000000000000000000000000000000000000000000000000000000005f5260045ffd5b813581526020918201910161071f565b857febe6f30d000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7fa164c6b4000000000000000000000000000000000000000000000000000000005f523460045260245260445ffd5b7fdf4bae05000000000000000000000000000000000000000000000000000000005f524260045264ffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660245260445ffd5b3461011d575f36600319011261011d5760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461011d575f36600319011261011d575f6080604051610d14816110be565b828152826020820152826040820152826060820152015260a0604051610d39816110be565b64ffffffffff60045467ffffffffffffffff828216938481528360208201838560281c168152836040840191838760681c1683528360806060870196848a60901c168852019760d01c16875260405198895251166020880152511660408601525116606084015251166080820152f35b3461011d57604036600319011261011d57610dc26110a8565b6024356001600160801b03811680910361011d576001600160a01b035f541633810361044f575064ffffffffff6003541680151580610fa0575b80610f91575b610f375750604051610e9c5f806001600160a01b0360208501967fa9059cbb000000000000000000000000000000000000000000000000000000008852169586602486015285604486015260448552610e5c6064866110f6565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001694519082865af1610e95611155565b9083611287565b8051908115159182610f13575b5050610ee857507f2e9d425ba8b27655048400b366d7b6a1f7180ebdb088e06bb7389704860ffe1f60206001600160a01b035f541692604051908152a3005b7f5274afe7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b819250906020918101031261011d576020015180159081150361011d578480610ea9565b7fe2e40a0c000000000000000000000000000000000000000000000000000000005f524260045264ffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660245260445260645ffd5b50610f9a611118565b15610e02565b5062093a80810164ffffffffff8111610fc15764ffffffffff164211610dfc565b634e487b7160e01b5f52601160045260245ffd5b3461011d575f36600319011261011d576105446040517f00000000000000000000000000000000000000000000000000000000000000006020820152602081526105306040826110f6565b3461011d575f36600319011261011d57610544907f00000000000000000000000000000000000000000000000000000000000000006020820152602081526105306040826110f6565b91908251928382525f5b848110611093575050825f602080949584010152601f8019910116010190565b80602080928401015182828601015201611073565b600435906001600160a01b038216820361011d57565b60a0810190811067ffffffffffffffff821117610b7d57604052565b6040810190811067ffffffffffffffff821117610b7d57604052565b90601f8019910116810190811067ffffffffffffffff821117610b7d57604052565b64ffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801515908161114d575090565b905042101590565b3d1561118f573d9067ffffffffffffffff8211610b7d5760405191611184601f8201601f1916602001846110f6565b82523d5f602084013e565b606090565b6001600160801b0381116111ae576001600160801b031690565b7f4916adce000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b9091905f198382098382029182808310920391808303921461127657670de0b6b3a7640000821015611246577faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac106699394670de0b6b3a7640000910990828211900360ee1b910360121c170290565b84907f5173648d000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b5050670de0b6b3a764000090049150565b906112c4575080511561129c57805190602001fd5b7f1425ea42000000000000000000000000000000000000000000000000000000005f5260045ffd5b8151158061130a575b6112d5575090565b6001600160a01b03907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b156112cd56fea164736f6c634300081a000a610200806040523461050c57611f86803803809161001d828561073f565b833981019060e08183031261050c5780516001600160401b03811161050c5781019060e08284031261050c576040519160e083016001600160401b038111848210176105c65760405280516001600160a01b038116810361050c57835261008660208201610762565b6020840190815260408201519093906001600160a01b038116810361050c576040820190815260608301516001600160401b03811161050c57866100cb9185016107b0565b6060830190815260808481015190840190815260a08501519096906001600160401b03811161050c57886101009187016107b0565b60a0850190815260c086015190956001600160401b03821161050c57610128918a91016107b0565b60c085019081526020870151959093906001600160a01b038716870361050c57610154604089016107f5565b9561016160608a016107f5565b9961016e60808b01610762565b60a08b0151909a906001600160401b03811161050c5781018d601f8201121561050c578051906001600160401b0382116105c6576040519e8f8360051b6020016101b8908261073f565b8381526020019260061b82016020019181831161050c57602001925b8284106106e357505050509260209261028796959260c06102829601519360018060a01b03905116938460018060a01b03195f5416175f5564ffffffffff6040519889965f7fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a3511660a0523360c05260e0525161010052516001600160a01b0316610140525180519061027190829084860190860161078f565b81010301601f19810183528261073f565b610816565b608052518051906001600160401b0382116105c657600154600181811c911680156106d9575b60208210146106c557601f8111610662575b50602090601f83116001146105f95761030e9392915f91836105ee575b50508160011b915f199060031b1c1916176001555b51610282602060405183610271829551809285808601910161078f565b6101205261018052610160526101a0526101c0528051905f915f915b81831061051057836101e05260018060a01b03610140511660018060a01b03610160511690604051905f806020840163095ea7b360e01b8152856024860152811960448601526044855261037f60648661073f565b84519082855af161038e610838565b816104d5575b50806104cb575b15610486575b60405161164d908161093982396080518161129e015260a05181818161030001528181610fa6015281816111ce0152611384015260c0518181816103470152610fed015260e05181818161020b01526107870152610100518181816105a9015261088e015261012051818181610a7301526112550152610140518181816104b901528181610af801526110ce0152610160518181816104760152610c980152610180518181816101cf0152610b2901526101a051818181610194015261091c01526101c0518181816102be0152610b5301526101e05181818161041901526108ea0152f35b6104be6104c3936040519063095ea7b360e01b602083015260248201525f6044820152604481526104b860648261073f565b82610867565b610867565b8080806103a1565b50803b151561039b565b80518015925082156104ea575b505084610394565b819250906020918101031261050c57602061050591016107f5565b84806104e2565b5f80fd5b91929091906001600160401b036105278584610802565b5151166001600160401b03918216019081116105da57926105488183610802565b519060045491680100000000000000008310156105c65760018301806004558310156105b25760019260045f5260205f200190838060401b038151166cffffffffff00000000000000006020845493015160401b1691858060681b0319161717905501919061032a565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b015190505f806102dc565b90601f1983169160015f52815f20925f5b81811061064a575091600193918561030e97969410610632575b505050811b016001556102f1565b01515f1960f88460031b161c191690555f8080610624565b9293602060018192878601518155019501930161060a565b60015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6601f840160051c810191602085106106bb575b601f0160051c01905b8181106106b057506102bf565b5f81556001016106a3565b909150819061069a565b634e487b7160e01b5f52602260045260245ffd5b90607f16906102ad565b60408483031261050c5760408051919082016001600160401b038111838210176105c6576040528451906001600160401b038216820361050c578260209260409452610730838801610762565b838201528152019301926101d4565b601f909101601f19168101906001600160401b038211908210176105c657604052565b519064ffffffffff8216820361050c57565b6001600160401b0381116105c657601f01601f191660200190565b5f5b8381106107a05750505f910152565b8181015183820152602001610791565b81601f8201121561050c5780516107c681610774565b926107d4604051948561073f565b8184526020828401011161050c576107f2916020808501910161078f565b90565b5190811515820361050c57565b80518210156105b25760209160051b010190565b60208151910151906020811061082a575090565b5f199060200360031b1b1690565b3d15610862573d9061084982610774565b91610857604051938461073f565b82523d5f602084013e565b606090565b5f8061088f9260018060a01b03169360208151910182865af1610888610838565b90836108da565b80519081151591826108b7575b50506108a55750565b635274afe760e01b5f5260045260245ffd5b819250906020918101031261050c5760206108d291016107f5565b155f8061089c565b906108fe57508051156108ef57805190602001fd5b630a12f52160e11b5f5260045ffd5b8151158061092f575b61090f575090565b639996b31560e01b5f9081526001600160a01b0391909116600452602490fd5b50803b1561090756fe6080806040526004361015610012575f80fd5b5f3560e01c9081630724fda914611288575080630f7514a21461123d5780631686c909146110115780632dd3100014610fce5780633f31ae3f146106fc57806349fc73dd146105f05780634e390d3e146105cc57806351e75e8b1461059257806375829def146104dd57806382bfefc81461049a578063845aef4b1461045757806390e64d131461043d578063936c63d9146103f9578063a480ca7914610324578063bb4b5734146102e3578063bf44497a146102a7578063bf4ed03f1461022e578063c57981b5146101f4578063cbe9e5ef146101b8578063ce36b33514610177578063ce516507146101375763f851a4401461010e575f80fd5b34610133575f3660031901126101335760206001600160a01b035f5416604051908152f35b5f80fd5b3461013357602036600319011261013357602061016d60043560ff6001918060081c5f526002602052161b60405f205416151590565b6040519015158152f35b34610133575f36600319011261013357602060405164ffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610133575f3660031901126101335760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b34610133575f3660031901126101335760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34610133575f366003190112610133576102466113f8565b6040518091602082016020835281518091526020604084019201905f5b818110610271575050500390f35b8251805167ffffffffffffffff16855260209081015164ffffffffff168186015286955060409094019390920191600101610263565b34610133575f3660031901126101335760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b34610133575f36600319011261013357602060405164ffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101335760203660031901126101335761033d611310565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168033036103ca575047905f80808085855af16103816113b9565b501561039257602082604051908152f35b6001600160a01b03907f245bf0c0000000000000000000000000000000000000000000000000000000005f521660045260245260445ffd5b7f4e3ddeed000000000000000000000000000000000000000000000000000000005f526004523360245260445ffd5b34610133575f36600319011261013357602060405167ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610133575f36600319011261013357602061016d61137c565b34610133575f3660031901126101335760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610133575f3660031901126101335760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610133576020366003190112610133576104f6611310565b5f546001600160a01b03811633810361056357506001600160a01b037fffffffffffffffffffffffff0000000000000000000000000000000000000000921691829116175f55337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf805f80a3005b7fc6cce6a4000000000000000000000000000000000000000000000000000000005f526004523360245260445ffd5b34610133575f3660031901126101335760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34610133575f36600319011261013357602064ffffffffff60035416604051908152f35b34610133575f366003190112610133576040515f6001548060011c906001811680156106f2575b6020831081146106de578285529081156106ba575060011461065c575b6106588361064481850382611342565b6040519182916020835260208301906112d1565b0390f35b91905060015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6915f905b8082106106a057509091508101602001610644610634565b919260018160209254838588010152019101909291610688565b60ff191660208086019190915291151560051b840190910191506106449050610634565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610617565b608036600319011261013357600435602435906001600160a01b03821680920361013357604435906001600160801b03821691828103610133576064359367ffffffffffffffff851161013357366023860112156101335784600401359467ffffffffffffffff86116101335760248660051b8201013681116101335761078161137c565b610f77577f0000000000000000000000000000000000000000000000000000000000000000803410610f4857506107cf8560ff6001918060081c5f526002602052161b60405f205416151590565b610f1c576040516020810190868252846040820152876060820152606081526107f9608082611342565b5190206040516020810191825260208152610815604082611342565b5190209161082288611364565b97610830604051998a611342565b8852602401602088015b828210610f0c57505050925f935b865185101561088a5761085b85886114ad565b519081811015610879575f52602052600160405f205b940193610848565b905f52602052600160405f20610871565b85907f000000000000000000000000000000000000000000000000000000000000000003610ee45760035464ffffffffff811615610eca575b508160081c5f52600260205260405f20600160ff84161b815417905567ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016670de0b6b3a76400008103610e9f57507f000000000000000000000000000000000000000000000000000000000000000064ffffffffff8116610e99575064ffffffffff4216935b61095a6113f8565b9081519161096783611364565b926109756040519485611342565b808452601f1961098482611364565b015f5b818110610e765750506109b66109b167ffffffffffffffff6109a88561148c565b51511687611506565b6114c1565b64ffffffffff8060206109c88661148c565b510151168a0116906001600160801b03604051916109e583611326565b169182825260208201526109f88661148c565b52610a028561148c565b50916001905b828210610de25750506001600160801b038216858111610dce578511610da3575b50505064ffffffffff6020610a425f19845101846114ad565b51015116946001600160a01b035f54169564ffffffffff60405192610a6684611326565b16825260208201526040517f0000000000000000000000000000000000000000000000000000000000000000602082015260208152610aa6604082611342565b60405191610ab383611326565b5f83525f602084015260405197610120890189811067ffffffffffffffff821117610d8f576040999594939299528452602084019787895260408501868152606086017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815260808701907f00000000000000000000000000000000000000000000000000000000000000001515825260a08801927f00000000000000000000000000000000000000000000000000000000000000001515845260c0890194855260e0890195865261010089019687526040519c8d997f7ee21391000000000000000000000000000000000000000000000000000000008b5260048b0160409052516001600160a01b031660448b0152516001600160a01b031660648a0152516001600160801b03166084890152516001600160a01b031660a488015251151560c487015251151560e486015251805164ffffffffff166101048601526020015164ffffffffff1661012485015251610144840161016090526101a48401610c43916112d1565b905180516001600160a01b03166101648501526020015161018484015260031983820301602484015281519081815260200191602001905f5b818110610d5a57505050908060209203815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af1938415610d4f575f94610cfb575b507f28b58397e03322f670d6b223cc863f8c148e368b8b615412e6798a641a22842d9160409182519182526020820152a3005b9093506020813d602011610d47575b81610d1760209383611342565b810103126101335751927f28b58397e03322f670d6b223cc863f8c148e368b8b615412e6798a641a22842d610cc8565b3d9150610d0a565b6040513d5f823e3d90fd5b825180516001600160801b0316855260209081015164ffffffffff168186015289955060409094019390920191600101610c7c565b634e487b7160e01b5f52604160045260245ffd5b6001600160801b0391610dba83925f1901866114ad565b519303168183511601169052858080610a29565b634e487b7160e01b5f52600160045260245ffd5b90926001600160801b03600191610e116109b167ffffffffffffffff610e0889886114ad565b5151168b611506565b9064ffffffffff806020610e285f198b018d6114ad565b51015116816020610e398b8a6114ad565b51015116011660405190610e4c82611326565b84841682526020820152610e60888b6114ad565b52610e6b878a6114ad565b500116930190610a08565b602090604051610e8581611326565b5f81525f8382015282828901015201610987565b93610952565b7f36d385ef000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b64ffffffffff19164264ffffffffff1617600355846108c3565b7fb4f06787000000000000000000000000000000000000000000000000000000005f5260045ffd5b813581526020918201910161083a565b847febe6f30d000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7fa164c6b4000000000000000000000000000000000000000000000000000000005f523460045260245260445ffd5b7fdf4bae05000000000000000000000000000000000000000000000000000000005f524260045264ffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660245260445ffd5b34610133575f3660031901126101335760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101335760403660031901126101335761102a611310565b6024356001600160801b038116809103610133576001600160a01b035f5416338103610563575064ffffffffff6003541680151580611208575b806111f9575b61119f57506040516111045f806001600160a01b0360208501967fa9059cbb0000000000000000000000000000000000000000000000000000000088521695866024860152856044860152604485526110c4606486611342565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001694519082865af16110fd6113b9565b90836115b4565b805190811515918261117b575b505061115057507f2e9d425ba8b27655048400b366d7b6a1f7180ebdb088e06bb7389704860ffe1f60206001600160a01b035f541692604051908152a3005b7f5274afe7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b81925090602091810103126101335760200151801590811503610133578480611111565b7fe2e40a0c000000000000000000000000000000000000000000000000000000005f524260045264ffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660245260445260645ffd5b5061120261137c565b1561106a565b5062093a80810164ffffffffff81116112295764ffffffffff164211611064565b634e487b7160e01b5f52601160045260245ffd5b34610133575f366003190112610133576106586040517f0000000000000000000000000000000000000000000000000000000000000000602082015260208152610644604082611342565b34610133575f36600319011261013357610658907f0000000000000000000000000000000000000000000000000000000000000000602082015260208152610644604082611342565b91908251928382525f5b8481106112fb575050825f602080949584010152601f8019910116010190565b806020809284010151828286010152016112db565b600435906001600160a01b038216820361013357565b6040810190811067ffffffffffffffff821117610d8f57604052565b90601f8019910116810190811067ffffffffffffffff821117610d8f57604052565b67ffffffffffffffff8111610d8f5760051b60200190565b64ffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680151590816113b1575090565b905042101590565b3d156113f3573d9067ffffffffffffffff8211610d8f57604051916113e8601f8201601f191660200184611342565b82523d5f602084013e565b606090565b6004549061140582611364565b916114136040519384611342565b80835260045f9081527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b602085015b83831061144f5750505050565b60016020819260405161146181611326565b64ffffffffff865467ffffffffffffffff8116835260401c1683820152815201920192019190611442565b8051156114995760200190565b634e487b7160e01b5f52603260045260245ffd5b80518210156114995760209160051b010190565b6001600160801b0381116114db576001600160801b031690565b7f4916adce000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b9091905f19838209838202918280831092039180830392146115a357670de0b6b3a7640000821015611573577faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac106699394670de0b6b3a7640000910990828211900360ee1b910360121c170290565b84907f5173648d000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b5050670de0b6b3a764000090049150565b906115f157508051156115c957805190602001fd5b7f1425ea42000000000000000000000000000000000000000000000000000000005f5260045ffd5b81511580611637575b611602575090565b6001600160a01b03907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b156115fa56fea164736f6c634300081a000aa164736f6c634300081a000a"; /// @notice Deploys {SablierMerkleFactory} from precompiled bytecode. function deployMerkleFactory(address initialAdmin) public returns (ISablierMerkleFactory factory) { diff --git a/script/CreateMerkleLL.s.sol b/script/CreateMerkleLL.s.sol index 79ba5a7..2ccf029 100644 --- a/script/CreateMerkleLL.s.sol +++ b/script/CreateMerkleLL.s.sol @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity >=0.8.22 <0.9.0; +import { ud2x18 } from "@prb/math/src/UD2x18.sol"; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import { ISablierLockup } from "@sablier/lockup/src/interfaces/ISablierLockup.sol"; @@ -43,9 +44,9 @@ contract CreateMerkleLL is BaseScript { transferable: true, schedule: MerkleLL.Schedule({ startTime: 0, // i.e. block.timestamp - startAmount: 10e18, + startPercentage: ud2x18(0.01e18), cliffDuration: 30 days, - cliffAmount: 10e18, + cliffPercentage: ud2x18(0.01e18), totalDuration: 90 days }), aggregateAmount: 10_000e18, diff --git a/src/SablierMerkleLL.sol b/src/SablierMerkleLL.sol index e32815a..67bed14 100644 --- a/src/SablierMerkleLL.sol +++ b/src/SablierMerkleLL.sol @@ -3,7 +3,7 @@ pragma solidity >=0.8.22; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; -import { ZERO } from "@prb/math/src/UD60x18.sol"; +import { ud60x18, ZERO } from "@prb/math/src/UD60x18.sol"; import { ISablierLockup } from "@sablier/lockup/src/interfaces/ISablierLockup.sol"; import { Broker, Lockup, LockupLinear } from "@sablier/lockup/src/types/DataTypes.sol"; @@ -112,6 +112,11 @@ contract SablierMerkleLL is timestamps.end = timestamps.start + _schedule.totalDuration; } + // Calculate the unlock amounts based on the percentages. + LockupLinear.UnlockAmounts memory unlockAmounts; + unlockAmounts.start = ud60x18(amount).mul(_schedule.startPercentage.intoUD60x18()).intoUint128(); + unlockAmounts.cliff = ud60x18(amount).mul(_schedule.cliffPercentage.intoUD60x18()).intoUint128(); + // Interaction: create the stream via {SablierLockup}. uint256 streamId = LOCKUP.createWithTimestampsLL( Lockup.CreateWithTimestamps({ @@ -125,7 +130,7 @@ contract SablierMerkleLL is shape: string(abi.encodePacked(SHAPE)), broker: Broker({ account: address(0), fee: ZERO }) }), - LockupLinear.UnlockAmounts({ start: _schedule.startAmount, cliff: _schedule.cliffAmount }), + unlockAmounts, cliffTime ); diff --git a/src/types/DataTypes.sol b/src/types/DataTypes.sol index 3300657..92f8768 100644 --- a/src/types/DataTypes.sol +++ b/src/types/DataTypes.sol @@ -41,15 +41,15 @@ library MerkleLL { /// variables in `Lockup.CreateWithTimestampsLL`. /// @dev A start time value of zero will be considered as `block.timestamp`. /// @param startTime The start time of the stream. - /// @param startAmount The amount to be unlocked at the start time. + /// @param startAmount The percentage to be unlocked at the start time. /// @param cliffDuration The duration of the cliff. /// @param cliffAmount The amount to be unlocked at the cliff time. /// @param totalDuration The total duration of the stream. struct Schedule { uint40 startTime; - uint128 startAmount; + UD2x18 startPercentage; uint40 cliffDuration; - uint128 cliffAmount; + UD2x18 cliffPercentage; uint40 totalDuration; } } diff --git a/tests/fork/merkle-campaign/MerkleLL.t.sol b/tests/fork/merkle-campaign/MerkleLL.t.sol index a8da895..aff1eb7 100644 --- a/tests/fork/merkle-campaign/MerkleLL.t.sol +++ b/tests/fork/merkle-campaign/MerkleLL.t.sol @@ -3,7 +3,8 @@ pragma solidity >=0.8.22 <0.9.0; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import { Arrays } from "@openzeppelin/contracts/utils/Arrays.sol"; -import { Lockup } from "@sablier/lockup/src/types/DataTypes.sol"; +import { ud60x18 } from "@prb/math/src/UD60x18.sol"; +import { Lockup, LockupLinear } from "@sablier/lockup/src/types/DataTypes.sol"; import { ISablierMerkleFactory } from "src/interfaces/ISablierMerkleFactory.sol"; import { ISablierMerkleBase, ISablierMerkleLL } from "src/interfaces/ISablierMerkleLL.sol"; @@ -46,6 +47,7 @@ abstract contract MerkleLL_Fork_Test is Fork_Test { bytes32 merkleRoot; address[] recipients; uint256 recipientCount; + LockupLinear.UnlockAmounts expectedUnlockAmounts; } // We need the leaves as a storage variable so that we can use OpenZeppelin's {Arrays.findUpperBound}. @@ -75,11 +77,7 @@ abstract contract MerkleLL_Fork_Test is Fork_Test { vars.indexes[i] = params.leafData[i].index; // Bound each leaf amount so that `aggregateAmount` does not overflow. - vars.amounts[i] = boundUint128( - params.leafData[i].amount, - defaults.START_AMOUNT() + defaults.CLIFF_AMOUNT(), - uint128(MAX_UINT128 / vars.recipientCount - 1) - ); + vars.amounts[i] = boundUint128(params.leafData[i].amount, 1, uint128(MAX_UINT128 / vars.recipientCount - 1)); vars.aggregateAmount += vars.amounts[i]; // Avoid zero recipient addresses. @@ -199,6 +197,11 @@ abstract contract MerkleLL_Fork_Test is Fork_Test { merkleProof: vars.merkleProof }); + vars.expectedUnlockAmounts.start = + ud60x18(vars.amounts[params.posBeforeSort]).mul(defaults.START_PERCENTAGE().intoUD60x18()).intoUint128(); + vars.expectedUnlockAmounts.cliff = + ud60x18(vars.amounts[params.posBeforeSort]).mul(defaults.CLIFF_PERCENTAGE().intoUD60x18()).intoUint128(); + // Assert that the stream has been created successfully. assertEq( lockup.getCliffTime(vars.expectedStreamId), getBlockTimestamp() + defaults.CLIFF_DURATION(), "cliff time" @@ -213,8 +216,16 @@ abstract contract MerkleLL_Fork_Test is Fork_Test { assertEq(lockup.getSender(vars.expectedStreamId), params.campaignOwner, "sender"); assertEq(lockup.getStartTime(vars.expectedStreamId), getBlockTimestamp(), "start time"); assertEq(lockup.getUnderlyingToken(vars.expectedStreamId), FORK_TOKEN, "token"); - assertEq(lockup.getUnlockAmounts(vars.expectedStreamId).cliff, defaults.CLIFF_AMOUNT(), "unlock amounts cliff"); - assertEq(lockup.getUnlockAmounts(vars.expectedStreamId).start, defaults.START_AMOUNT(), "unlock amounts start"); + assertEq( + lockup.getUnlockAmounts(vars.expectedStreamId).cliff, + vars.expectedUnlockAmounts.cliff, + "unlock amounts cliff" + ); + assertEq( + lockup.getUnlockAmounts(vars.expectedStreamId).start, + vars.expectedUnlockAmounts.start, + "unlock amounts start" + ); assertEq(lockup.getWithdrawnAmount(vars.expectedStreamId), 0, "withdrawn amount"); assertEq(lockup.isCancelable(vars.expectedStreamId), defaults.CANCELABLE(), "is cancelable"); assertEq(lockup.isDepleted(vars.expectedStreamId), false, "is depleted"); diff --git a/tests/integration/concrete/ll/claim/claim.t.sol b/tests/integration/concrete/ll/claim/claim.t.sol index 4df6fb6..404e814 100644 --- a/tests/integration/concrete/ll/claim/claim.t.sol +++ b/tests/integration/concrete/ll/claim/claim.t.sol @@ -1,6 +1,7 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity >=0.8.22 <0.9.0; +import { ud2x18 } from "@prb/math/src/UD2x18.sol"; import { ISablierMerkleLL } from "src/interfaces/ISablierMerkleLL.sol"; import { MerkleLL } from "src/types/DataTypes.sol"; @@ -17,7 +18,7 @@ contract Claim_MerkleLL_Integration_Test is Claim_Integration_Test, MerkleLL_Int function test_WhenScheduledCliffDurationZero() external whenMerkleProofValid whenScheduledStartTimeZero { schedule.cliffDuration = 0; - schedule.cliffAmount = 0; + schedule.cliffPercentage = ud2x18(0); merkleLL = merkleFactory.createMerkleLL({ baseParams: defaults.baseParams(), diff --git a/tests/integration/concrete/ll/constructor.t.sol b/tests/integration/concrete/ll/constructor.t.sol index e8a812e..df29b74 100644 --- a/tests/integration/concrete/ll/constructor.t.sol +++ b/tests/integration/concrete/ll/constructor.t.sol @@ -91,9 +91,9 @@ contract Constructor_MerkleLL_Integration_Test is Integration_Test { vars.actualSchedule = constructedLL.getSchedule(); vars.expectedSchedule = defaults.schedule(); assertEq(vars.actualSchedule.startTime, vars.expectedSchedule.startTime, "schedule.startTime"); - assertEq(vars.actualSchedule.startAmount, vars.expectedSchedule.startAmount, "schedule.startAmount"); + assertEq(vars.actualSchedule.startPercentage, vars.expectedSchedule.startPercentage, "schedule.startAmount"); assertEq(vars.actualSchedule.cliffDuration, vars.expectedSchedule.cliffDuration, "schedule.cliffDuration"); - assertEq(vars.actualSchedule.cliffAmount, vars.expectedSchedule.cliffAmount, "schedule.cliffAmount"); + assertEq(vars.actualSchedule.cliffPercentage, vars.expectedSchedule.cliffPercentage, "schedule.cliffAmount"); assertEq(vars.actualSchedule.totalDuration, vars.expectedSchedule.totalDuration, "schedule.totalDuration"); assertEq(constructedLL.shape(), defaults.SHAPE(), "shape"); diff --git a/tests/utils/Defaults.sol b/tests/utils/Defaults.sol index 0879145..acf4b90 100644 --- a/tests/utils/Defaults.sol +++ b/tests/utils/Defaults.sol @@ -3,7 +3,7 @@ pragma solidity >=0.8.22; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import { Arrays } from "@openzeppelin/contracts/utils/Arrays.sol"; -import { ud2x18, uUNIT } from "@prb/math/src/UD2x18.sol"; +import { ud2x18, UD2x18, uUNIT } from "@prb/math/src/UD2x18.sol"; import { ud } from "@prb/math/src/UD60x18.sol"; import { LockupTranched } from "@sablier/lockup/src/types/DataTypes.sol"; import { Merkle } from "murky/src/Merkle.sol"; @@ -37,6 +37,7 @@ contract Defaults is Constants, Merkle { string public constant CAMPAIGN_NAME = "Airdrop Campaign "; bool public constant CANCELABLE = false; uint128 public constant CLAIM_AMOUNT = 10_000e18; + UD2x18 public constant CLIFF_PERCENTAGE = UD2x18.wrap(0.25e18); // 25% of the claim amount uint40 public immutable EXPIRATION; uint256 public constant FEE = 0.005e18; uint40 public constant FIRST_CLAIM_TIME = JULY_1_2024; @@ -50,6 +51,7 @@ contract Defaults is Constants, Merkle { bytes32 public MERKLE_ROOT; // Since Factory stores shape as bytes32, extra spaces are padded to it. string public constant SHAPE = "A custom stream shape "; + UD2x18 public constant START_PERCENTAGE = UD2x18.wrap(0.01e18); // 1% of the claim amount uint40 public immutable STREAM_START_TIME_NON_ZERO = JULY_1_2024 - 2 days; uint40 public immutable STREAM_START_TIME_ZERO = 0; uint64 public constant TOTAL_PERCENTAGE = uUNIT; @@ -147,9 +149,9 @@ contract Defaults is Constants, Merkle { function schedule() public pure returns (MerkleLL.Schedule memory schedule_) { schedule_.startTime = STREAM_START_TIME_ZERO; - schedule_.startAmount = START_AMOUNT; + schedule_.startPercentage = START_PERCENTAGE; schedule_.cliffDuration = CLIFF_DURATION; - schedule_.cliffAmount = CLIFF_AMOUNT; + schedule_.cliffPercentage = CLIFF_PERCENTAGE; schedule_.totalDuration = TOTAL_DURATION; }