60806040525f600360026101000a81548160ff021916908360ff1602179055505f6003806101000a81548160ff021916908360ff1602179055506012600a6100479190610531565b633b9aca00610056919061057b565b6004556012600a6100679190610531565b633b9aca00610076919061057b565b60055561271060196012600a61008c9190610531565b633b9aca0061009b919061057b565b6100a5919061057b565b6100af91906105e9565b600655734752ba5dbc23f44d87826276bf6fd6b1c372ad24600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015610111575f80fd5b505f61012161037760201b60201c565b9050805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506012600a6101cb9190610531565b633b9aca006101da919061057b565b60015f6101eb61037e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555061023661037e60201b60201c565b60095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60015f6102a76103a560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506102f261037e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6012600a61034e9190610531565b633b9aca0061035d919061057b565b60405161036a9190610628565b60405180910390a3610641565b5f33905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f738938a3cd3b3c692aafdd560e6917c14d7281be7b905090565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b60018511156104425780860481111561041e5761041d6103c0565b5b600185161561042d5780820291505b808102905061043b856103ed565b9450610402565b94509492505050565b5f8261045a5760019050610515565b81610467575f9050610515565b816001811461047d5760028114610487576104b6565b6001915050610515565b60ff841115610499576104986103c0565b5b8360020a9150848211156104b0576104af6103c0565b5b50610515565b5060208310610133831016604e8410600b84101617156104eb5782820a9050838111156104e6576104e56103c0565b5b610515565b6104f884848460016103f9565b9250905081840481111561050f5761050e6103c0565b5b81810290505b9392505050565b5f819050919050565b5f60ff82169050919050565b5f61053b8261051c565b915061054683610525565b92506105737fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461044b565b905092915050565b5f6105858261051c565b91506105908361051c565b925082820261059e8161051c565b915082820484148315176105b5576105b46103c0565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6105f38261051c565b91506105fe8361051c565b92508261060e5761060d6105bc565b5b828204905092915050565b6106228161051c565b82525050565b5f60208201905061063b5f830184610619565b92915050565b6122408061064e5f395ff3fe6080604052600436106100eb575f3560e01c8063715018a61161008957806395d89b411161005857806395d89b41146102be578063a9059cbb146102e8578063cc1776d314610324578063dd62ed3e1461034e576100f2565b8063715018a614610252578063751039fc146102685780638a8c523c1461027e5780638da5cb5b14610294576100f2565b806323b872dd116100c557806323b872dd14610186578063313ce567146101c25780634f7041a5146101ec57806370a0823114610216576100f2565b806306fdde03146100f6578063095ea7b31461012057806318160ddd1461015c576100f2565b366100f257005b5f80fd5b348015610101575f80fd5b5061010a61038a565b60405161011791906116aa565b60405180910390f35b34801561012b575f80fd5b506101466004803603810190610141919061175b565b6103c7565b60405161015391906117b3565b60405180910390f35b348015610167575f80fd5b506101706103e4565b60405161017d91906117db565b60405180910390f35b348015610191575f80fd5b506101ac60048036038101906101a791906117f4565b610407565b6040516101b991906117b3565b60405180910390f35b3480156101cd575f80fd5b506101d66104ba565b6040516101e3919061185f565b60405180910390f35b3480156101f7575f80fd5b506102006104c2565b60405161020d919061185f565b60405180910390f35b348015610221575f80fd5b5061023c60048036038101906102379190611878565b6104d5565b60405161024991906117db565b60405180910390f35b34801561025d575f80fd5b5061026661051b565b005b348015610273575f80fd5b5061027c610669565b005b348015610289575f80fd5b5061029261071b565b005b34801561029f575f80fd5b506102a8610a9d565b6040516102b591906118b2565b60405180910390f35b3480156102c9575f80fd5b506102d2610ac4565b6040516102df91906116aa565b60405180910390f35b3480156102f3575f80fd5b5061030e6004803603810190610309919061175b565b610b01565b60405161031b91906117b3565b60405180910390f35b34801561032f575f80fd5b50610338610b1e565b604051610345919061185f565b60405180910390f35b348015610359575f80fd5b50610374600480360381019061036f91906118cb565b610b2f565b60405161038191906117db565b60405180910390f35b60606040518060400160405280600481526020017f444f475300000000000000000000000000000000000000000000000000000000815250905090565b5f6103da6103d3610bb1565b8484610bb8565b6001905092915050565b5f6012600a6103f39190611a65565b633b9aca006104029190611aaf565b905090565b5f610413848484610d7b565b6104af8461041f610bb1565b8460025f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f610466610bb1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546104aa9190611af0565b610bb8565b600190509392505050565b5f6012905090565b600360029054906101000a900460ff1681565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610523610bb1565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146105af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105a690611b6d565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b610671610bb1565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146106fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106f490611b6d565b60405180910390fd5b6107056103e4565b6004819055506107136103e4565b600581905550565b610723610bb1565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146107af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a690611b6d565b60405180910390fd5b60035f9054906101000a900460ff16156107fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f590611bd5565b60405180910390fd5b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ed9190611c07565b73ffffffffffffffffffffffffffffffffffffffff1663e6a439053060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610973573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109979190611c07565b6040518363ffffffff1660e01b81526004016109b4929190611c32565b602060405180830381865afa1580156109cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109f39190611c07565b73ffffffffffffffffffffffffffffffffffffffff1660085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7890611ca3565b60405180910390fd5b600160035f6101000a81548160ff021916908315150217905550565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606040518060400160405280600481526020017f444f475300000000000000000000000000000000000000000000000000000000815250905090565b5f610b14610b0d610bb1565b8484610d7b565b6001905092915050565b60038054906101000a900460ff1681565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1d90611d31565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8b90611dbf565b60405180910390fd5b8060025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610d6e91906117db565b60405180910390a3505050565b5f8111610dbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db490611e27565b60405180910390fd5b60035f9054906101000a900460ff16610edb57610dd8610a9d565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610e45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3c90611e8f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610eda578160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610f4057503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b80610f575750600360019054906101000a900460ff165b15610f6c57610f678383836111df565b6111da565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16148015610fd25750600654610fcf306104d5565b10155b15611026576001600360016101000a81548160ff021916908315150217905550611003610ffe306104d5565b6112ef565b5f600360016101000a81548160ff02191690831515021790555061102561154c565b5b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480156110cf5750600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b1561117257600454811115611119576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111090611ef7565b60405180910390fd5b60055481611126846104d5565b6111309190611f15565b1115611171576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116890611f92565b60405180910390fd5b5b6111cc838260085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146115bc565b90506111d98383836111df565b5b505050565b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461122b9190611af0565b925050819055508060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461127e9190611f15565b925050819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516112e291906117db565b60405180910390a3505050565b5f600267ffffffffffffffff81111561130b5761130a611fb0565b5b6040519080825280602002602001820160405280156113395781602001602082028036833780820191505090505b50905030815f815181106113505761134f611fdd565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113f4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114189190611c07565b8160018151811061142c5761142b611fdd565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506114923060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684610bb8565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8460095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b8152600401611515959493929190612155565b5f604051808303815f87803b15801561152c575f80fd5b505af192505050801561153d575060015b6115475750611549565b505b50565b5f4711156115ba5760095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f193505050501580156115b8573d5f803e3d5ffd5b505b565b5f80826115d857600360029054906101000a900460ff166115e7565b60038054906101000a900460ff165b60ff1690505f81036115fc5783915050611633565b5f6064828661160b9190611aaf565b61161591906121da565b90506116228630836111df565b808561162e9190611af0565b925050505b9392505050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61167c8261163a565b6116868185611644565b9350611696818560208601611654565b61169f81611662565b840191505092915050565b5f6020820190508181035f8301526116c28184611672565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6116f7826116ce565b9050919050565b611707816116ed565b8114611711575f80fd5b50565b5f81359050611722816116fe565b92915050565b5f819050919050565b61173a81611728565b8114611744575f80fd5b50565b5f8135905061175581611731565b92915050565b5f8060408385031215611771576117706116ca565b5b5f61177e85828601611714565b925050602061178f85828601611747565b9150509250929050565b5f8115159050919050565b6117ad81611799565b82525050565b5f6020820190506117c65f8301846117a4565b92915050565b6117d581611728565b82525050565b5f6020820190506117ee5f8301846117cc565b92915050565b5f805f6060848603121561180b5761180a6116ca565b5b5f61181886828701611714565b935050602061182986828701611714565b925050604061183a86828701611747565b9150509250925092565b5f60ff82169050919050565b61185981611844565b82525050565b5f6020820190506118725f830184611850565b92915050565b5f6020828403121561188d5761188c6116ca565b5b5f61189a84828501611714565b91505092915050565b6118ac816116ed565b82525050565b5f6020820190506118c55f8301846118a3565b92915050565b5f80604083850312156118e1576118e06116ca565b5b5f6118ee85828601611714565b92505060206118ff85828601611714565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b600185111561198b5780860481111561196757611966611909565b5b60018516156119765780820291505b808102905061198485611936565b945061194b565b94509492505050565b5f826119a35760019050611a5e565b816119b0575f9050611a5e565b81600181146119c657600281146119d0576119ff565b6001915050611a5e565b60ff8411156119e2576119e1611909565b5b8360020a9150848211156119f9576119f8611909565b5b50611a5e565b5060208310610133831016604e8410600b8410161715611a345782820a905083811115611a2f57611a2e611909565b5b611a5e565b611a418484846001611942565b92509050818404811115611a5857611a57611909565b5b81810290505b9392505050565b5f611a6f82611728565b9150611a7a83611844565b9250611aa77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484611994565b905092915050565b5f611ab982611728565b9150611ac483611728565b9250828202611ad281611728565b91508282048414831517611ae957611ae8611909565b5b5092915050565b5f611afa82611728565b9150611b0583611728565b9250828203905081811115611b1d57611b1c611909565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f611b57602083611644565b9150611b6282611b23565b602082019050919050565b5f6020820190508181035f830152611b8481611b4b565b9050919050565b7f416c726561647920656e61626c656400000000000000000000000000000000005f82015250565b5f611bbf600f83611644565b9150611bca82611b8b565b602082019050919050565b5f6020820190508181035f830152611bec81611bb3565b9050919050565b5f81519050611c01816116fe565b92915050565b5f60208284031215611c1c57611c1b6116ca565b5b5f611c2984828501611bf3565b91505092915050565b5f604082019050611c455f8301856118a3565b611c5260208301846118a3565b9392505050565b7f496e76616c6964207061697220616464726573730000000000000000000000005f82015250565b5f611c8d601483611644565b9150611c9882611c59565b602082019050919050565b5f6020820190508181035f830152611cba81611c81565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f611d1b602483611644565b9150611d2682611cc1565b604082019050919050565b5f6020820190508181035f830152611d4881611d0f565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f611da9602283611644565b9150611db482611d4f565b604082019050919050565b5f6020820190508181035f830152611dd681611d9d565b9050919050565b7f5a65726f20616d6f756e740000000000000000000000000000000000000000005f82015250565b5f611e11600b83611644565b9150611e1c82611ddd565b602082019050919050565b5f6020820190508181035f830152611e3e81611e05565b9050919050565b7f54726164696e67206e6f7420656e61626c6564000000000000000000000000005f82015250565b5f611e79601383611644565b9150611e8482611e45565b602082019050919050565b5f6020820190508181035f830152611ea681611e6d565b9050919050565b7f547820616d6f756e74206c696d697400000000000000000000000000000000005f82015250565b5f611ee1600f83611644565b9150611eec82611ead565b602082019050919050565b5f6020820190508181035f830152611f0e81611ed5565b9050919050565b5f611f1f82611728565b9150611f2a83611728565b9250828201905080821115611f4257611f41611909565b5b92915050565b7f57616c6c657420616d6f756e74206c696d6974000000000000000000000000005f82015250565b5f611f7c601383611644565b9150611f8782611f48565b602082019050919050565b5f6020820190508181035f830152611fa981611f70565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050919050565b5f819050919050565b5f61203661203161202c8461200a565b612013565b611728565b9050919050565b6120468161201c565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61207e816116ed565b82525050565b5f61208f8383612075565b60208301905092915050565b5f602082019050919050565b5f6120b18261204c565b6120bb8185612056565b93506120c683612066565b805f5b838110156120f65781516120dd8882612084565b97506120e88361209b565b9250506001810190506120c9565b5085935050505092915050565b5f61211d612118612113846116ce565b612013565b6116ce565b9050919050565b5f61212e82612103565b9050919050565b5f61213f82612124565b9050919050565b61214f81612135565b82525050565b5f60a0820190506121685f8301886117cc565b612175602083018761203d565b818103604083015261218781866120a7565b90506121966060830185612146565b6121a360808301846117cc565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6121e482611728565b91506121ef83611728565b9250826121ff576121fe6121ad565b5b82820490509291505056fea2646970667358221220a78f965769887eca05b9c2749124e5ac023c33fdc6b2dca5f1f5c6a0572af94d64736f6c63430008190033