60806040526001600360146101000a81548160ff02191690831515021790555034801561002a575f80fd5b503360035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601260ff16600a61007c919061030e565b633b9aca0061008b9190610358565b5f803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055503373ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef601260ff16600a61012b919061030e565b633b9aca0061013a9190610358565b60405161014791906103a8565b60405180910390a3600160025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506103c1565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b600185111561022b57808604811115610207576102066101a9565b5b60018516156102165780820291505b8081029050610224856101d6565b94506101eb565b94509492505050565b5f8261024357600190506102fe565b81610250575f90506102fe565b816001811461026657600281146102705761029f565b60019150506102fe565b60ff841115610282576102816101a9565b5b8360020a915084821115610299576102986101a9565b5b506102fe565b5060208310610133831016604e8410600b84101617156102d45782820a9050838111156102cf576102ce6101a9565b5b6102fe565b6102e184848460016101e2565b925090508184048111156102f8576102f76101a9565b5b81810290505b9392505050565b5f819050919050565b5f61031882610305565b915061032383610305565b92506103507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484610234565b905092915050565b5f61036282610305565b915061036d83610305565b925082820261037b81610305565b91508282048414831517610392576103916101a9565b5b5092915050565b6103a281610305565b82525050565b5f6020820190506103bb5f830184610399565b92915050565b611ea6806103ce5f395ff3fe608060405234801561000f575f80fd5b5060043610610114575f3560e01c806370a08231116100a057806395d89b411161006f57806395d89b41146102f4578063a9059cbb14610312578063b6ff6be614610342578063dd62ed3e1461035e578063f2fde38b1461038e57610114565b806370a082311461026c578063715018a61461029c578063875ce753146102a65780638da5cb5b146102d657610114565b806326b6b61a116100e757806326b6b61a146101b4578063313ce567146101be5780633e9afab9146101dc5780635c0323581461020c5780636fe6398b1461023c57610114565b806306fdde0314610118578063095ea7b31461013657806318160ddd1461016657806323b872dd14610184575b5f80fd5b6101206103aa565b60405161012d9190611374565b60405180910390f35b610150600480360381019061014b9190611429565b6103e7565b60405161015d9190611481565b60405180910390f35b61016e6103fd565b60405161017b91906114a9565b60405180910390f35b61019e600480360381019061019991906114c2565b610423565b6040516101ab9190611481565b60405180910390f35b6101bc610583565b005b6101c661062e565b6040516101d3919061152d565b60405180910390f35b6101f660048036038101906101f19190611546565b610636565b60405161020391906114a9565b60405180910390f35b61022660048036038101906102219190611546565b6106da565b60405161023391906114a9565b60405180910390f35b61025660048036038101906102519190611546565b61077e565b60405161026391906114a9565b60405180910390f35b61028660048036038101906102819190611584565b610822565b60405161029391906114a9565b60405180910390f35b6102a4610867565b005b6102c060048036038101906102bb9190611546565b6109b3565b6040516102cd91906114a9565b60405180910390f35b6102de610a57565b6040516102eb91906115be565b60405180910390f35b6102fc610a7f565b6040516103099190611374565b60405180910390f35b61032c60048036038101906103279190611429565b610abc565b6040516103399190611481565b60405180910390f35b61035c60048036038101906103579190611638565b610ad2565b005b61037860048036038101906103739190611683565b610bfc565b60405161038591906114a9565b60405180910390f35b6103a860048036038101906103a39190611584565b610c7e565b005b60606040518060400160405280600f81526020017f426c617a6520546865204875736b790000000000000000000000000000000000815250905090565b5f6103f3338484610e39565b6001905092915050565b5f601260ff16600a61040f919061181d565b633b9aca0061041e9190611867565b905090565b5f8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410156104df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d690611918565b60405180910390fd5b6104ea848484610ffc565b61057884338460015f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546105739190611936565b610e39565b600190509392505050565b3373ffffffffffffffffffffffffffffffffffffffff1660035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610612576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610609906119d9565b60405180910390fd5b5f600360146101000a81548160ff021916908315150217905550565b5f6012905090565b5f3373ffffffffffffffffffffffffffffffffffffffff1660035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146106c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106bd906119d9565b60405180910390fd5b81836106d29190611867565b905092915050565b5f3373ffffffffffffffffffffffffffffffffffffffff1660035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461076a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610761906119d9565b60405180910390fd5b818361077691906119f7565b905092915050565b5f3373ffffffffffffffffffffffffffffffffffffffff1660035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461080e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610805906119d9565b60405180910390fd5b818361081a9190611a57565b905092915050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b3373ffffffffffffffffffffffffffffffffffffffff1660035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146108f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ed906119d9565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35f60035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b5f3373ffffffffffffffffffffffffffffffffffffffff1660035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3a906119d9565b60405180910390fd5b8183610a4f9190611936565b905092915050565b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606040518060400160405280600581526020017f424c415a45000000000000000000000000000000000000000000000000000000815250905090565b5f610ac8338484610ffc565b6001905092915050565b3373ffffffffffffffffffffffffffffffffffffffff1660035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b58906119d9565b60405180910390fd5b5f5b82829050811015610bf757600160025f858585818110610b8657610b85611a87565b5b9050602002016020810190610b9b9190611584565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508080600101915050610b63565b505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b3373ffffffffffffffffffffffffffffffffffffffff1660035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d04906119d9565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7290611b24565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a38060035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ea7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9e90611bb2565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0c90611c40565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610fef91906114a9565b60405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361106a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106190611cce565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cf90611d5c565b60405180910390fd5b5f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054811115611157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114e90611dea565b60405180910390fd5b600360149054906101000a900460ff16156111f65760025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166111f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ec90611e52565b60405180910390fd5b5b805f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546112419190611936565b92505081905550805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461129391906119f7565b925050819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516112f791906114a9565b60405180910390a3505050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61134682611304565b611350818561130e565b935061136081856020860161131e565b6113698161132c565b840191505092915050565b5f6020820190508181035f83015261138c818461133c565b905092915050565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6113c58261139c565b9050919050565b6113d5816113bb565b81146113df575f80fd5b50565b5f813590506113f0816113cc565b92915050565b5f819050919050565b611408816113f6565b8114611412575f80fd5b50565b5f81359050611423816113ff565b92915050565b5f806040838503121561143f5761143e611394565b5b5f61144c858286016113e2565b925050602061145d85828601611415565b9150509250929050565b5f8115159050919050565b61147b81611467565b82525050565b5f6020820190506114945f830184611472565b92915050565b6114a3816113f6565b82525050565b5f6020820190506114bc5f83018461149a565b92915050565b5f805f606084860312156114d9576114d8611394565b5b5f6114e6868287016113e2565b93505060206114f7868287016113e2565b925050604061150886828701611415565b9150509250925092565b5f60ff82169050919050565b61152781611512565b82525050565b5f6020820190506115405f83018461151e565b92915050565b5f806040838503121561155c5761155b611394565b5b5f61156985828601611415565b925050602061157a85828601611415565b9150509250929050565b5f6020828403121561159957611598611394565b5b5f6115a6848285016113e2565b91505092915050565b6115b8816113bb565b82525050565b5f6020820190506115d15f8301846115af565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f8401126115f8576115f76115d7565b5b8235905067ffffffffffffffff811115611615576116146115db565b5b602083019150836020820283011115611631576116306115df565b5b9250929050565b5f806020838503121561164e5761164d611394565b5b5f83013567ffffffffffffffff81111561166b5761166a611398565b5b611677858286016115e3565b92509250509250929050565b5f806040838503121561169957611698611394565b5b5f6116a6858286016113e2565b92505060206116b7858286016113e2565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b60018511156117435780860481111561171f5761171e6116c1565b5b600185161561172e5780820291505b808102905061173c856116ee565b9450611703565b94509492505050565b5f8261175b5760019050611816565b81611768575f9050611816565b816001811461177e5760028114611788576117b7565b6001915050611816565b60ff84111561179a576117996116c1565b5b8360020a9150848211156117b1576117b06116c1565b5b50611816565b5060208310610133831016604e8410600b84101617156117ec5782820a9050838111156117e7576117e66116c1565b5b611816565b6117f984848460016116fa565b925090508184048111156118105761180f6116c1565b5b81810290505b9392505050565b5f611827826113f6565b9150611832836113f6565b925061185f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461174c565b905092915050565b5f611871826113f6565b915061187c836113f6565b925082820261188a816113f6565b915082820484148315176118a1576118a06116c1565b5b5092915050565b7f45524332303a20424c415a4520746f6b656e207472616e7366657220616d6f755f8201527f6e74206578636565647320616c6c6f77616e6365000000000000000000000000602082015250565b5f61190260348361130e565b915061190d826118a8565b604082019050919050565b5f6020820190508181035f83015261192f816118f6565b9050919050565b5f611940826113f6565b915061194b836113f6565b9250828203905081811115611963576119626116c1565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f8201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b5f6119c360218361130e565b91506119ce82611969565b604082019050919050565b5f6020820190508181035f8301526119f0816119b7565b9050919050565b5f611a01826113f6565b9150611a0c836113f6565b9250828201905080821115611a2457611a236116c1565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f611a61826113f6565b9150611a6c836113f6565b925082611a7c57611a7b611a2a565b5b828204905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4f776e61626c653a206e6577206f776e65722063616e206e6f742062652074685f8201527f65207a65726f2061646472657373000000000000000000000000000000000000602082015250565b5f611b0e602e8361130e565b9150611b1982611ab4565b604082019050919050565b5f6020820190508181035f830152611b3b81611b02565b9050919050565b7f45524332303a20424c415a4520746f6b656e20617070726f76652066726f6d205f8201527f746865207a65726f206164647265737300000000000000000000000000000000602082015250565b5f611b9c60308361130e565b9150611ba782611b42565b604082019050919050565b5f6020820190508181035f830152611bc981611b90565b9050919050565b7f45524332303a20424c415a4520746f6b656e20617070726f766520746f2074685f8201527f65207a65726f2061646472657373000000000000000000000000000000000000602082015250565b5f611c2a602e8361130e565b9150611c3582611bd0565b604082019050919050565b5f6020820190508181035f830152611c5781611c1e565b9050919050565b7f45524332303a20424c415a4520746f6b656e207472616e736665722066726f6d5f8201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b5f611cb860318361130e565b9150611cc382611c5e565b604082019050919050565b5f6020820190508181035f830152611ce581611cac565b9050919050565b7f45524332303a20424c415a4520746f6b656e207472616e7366657220746f20745f8201527f6865207a65726f20616464726573730000000000000000000000000000000000602082015250565b5f611d46602f8361130e565b9150611d5182611cec565b604082019050919050565b5f6020820190508181035f830152611d7381611d3a565b9050919050565b7f496e73756666696369656e7420424c415a4520746f6b656e2062616c616e63655f8201527f20746f207472616e736665720000000000000000000000000000000000000000602082015250565b5f611dd4602c8361130e565b9150611ddf82611d7a565b604082019050919050565b5f6020820190508181035f830152611e0181611dc8565b9050919050565b7f4e6f7420612070617274206f6620424c415a45000000000000000000000000005f82015250565b5f611e3c60138361130e565b9150611e4782611e08565b602082019050919050565b5f6020820190508181035f830152611e6981611e30565b905091905056fea26469706673582212207f3766b6dc9922e61a65c7ffb432391e2a853154a2072ebd04c3f508b2a18fd664736f6c634300081a0033