60806040526001600560146101000a81548160ff0219169083151502179055506103e8600655600780556040516121c93803806121c9833981810160405281019061004a9190610532565b338282816003908161005c91906107b8565b50806004908161006c91906107b8565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036100df575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016100d691906108c6565b60405180910390fd5b6100ee8161010960201b60201c565b506101025f336006546101cc60201b60201c565b505061099c565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361021c578060025f828254610210919061090c565b925050819055506102ea565b5f5f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156102a5578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161029c9392919061094e565b60405180910390fd5b8181035f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610331578060025f828254039250508190555061037b565b805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516103d89190610983565b60405180910390a3505050565b5f604051905090565b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b610444826103fe565b810181811067ffffffffffffffff821117156104635761046261040e565b5b80604052505050565b5f6104756103e5565b9050610481828261043b565b919050565b5f67ffffffffffffffff8211156104a05761049f61040e565b5b6104a9826103fe565b9050602081019050919050565b8281835e5f83830152505050565b5f6104d66104d184610486565b61046c565b9050828152602081018484840111156104f2576104f16103fa565b5b6104fd8482856104b6565b509392505050565b5f82601f830112610519576105186103f6565b5b81516105298482602086016104c4565b91505092915050565b5f5f60408385031215610548576105476103ee565b5b5f83015167ffffffffffffffff811115610565576105646103f2565b5b61057185828601610505565b925050602083015167ffffffffffffffff811115610592576105916103f2565b5b61059e85828601610505565b9150509250929050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806105f657607f821691505b602082108103610609576106086105b2565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261066b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610630565b6106758683610630565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6106b96106b46106af8461068d565b610696565b61068d565b9050919050565b5f819050919050565b6106d28361069f565b6106e66106de826106c0565b84845461063c565b825550505050565b5f5f905090565b6106fd6106ee565b6107088184846106c9565b505050565b5b8181101561072b576107205f826106f5565b60018101905061070e565b5050565b601f821115610770576107418161060f565b61074a84610621565b81016020851015610759578190505b61076d61076585610621565b83018261070d565b50505b505050565b5f82821c905092915050565b5f6107905f1984600802610775565b1980831691505092915050565b5f6107a88383610781565b9150826002028217905092915050565b6107c1826105a8565b67ffffffffffffffff8111156107da576107d961040e565b5b6107e482546105df565b6107ef82828561072f565b5f60209050601f831160018114610820575f841561080e578287015190505b610818858261079d565b86555061087f565b601f19841661082e8661060f565b5f5b8281101561085557848901518255600182019150602085019450602081019050610830565b86831015610872578489015161086e601f891682610781565b8355505b6001600288020188555050505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6108b082610887565b9050919050565b6108c0816108a6565b82525050565b5f6020820190506108d95f8301846108b7565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6109168261068d565b91506109218361068d565b9250828201905080821115610939576109386108df565b5b92915050565b6109488161068d565b82525050565b5f6060820190506109615f8301866108b7565b61096e602083018561093f565b61097b604083018461093f565b949350505050565b5f6020820190506109965f83018461093f565b92915050565b611820806109a95f395ff3fe6080604052600436106100f6575f3560e01c806370a082311161008957806395d89b411161005857806395d89b4114610305578063a9059cbb1461032f578063dd62ed3e1461036b578063f2fde38b146103a7576100fd565b806370a0823114610261578063715018a61461029d5780637a9d7c14146102b35780638da5cb5b146102db576100fd565b8063313ce567116100c5578063313ce567146101cd57806332a2eea1146101f75780633b18eab41461020d578063676c845814610237576100fd565b806306fdde0314610101578063095ea7b31461012b57806318160ddd1461016757806323b872dd14610191576100fd565b366100fd57005b5f5ffd5b34801561010c575f5ffd5b506101156103cf565b604051610122919061107c565b60405180910390f35b348015610136575f5ffd5b50610151600480360381019061014c919061112d565b61045f565b60405161015e9190611185565b60405180910390f35b348015610172575f5ffd5b5061017b610481565b60405161018891906111ad565b60405180910390f35b34801561019c575f5ffd5b506101b760048036038101906101b291906111c6565b61048a565b6040516101c49190611185565b60405180910390f35b3480156101d8575f5ffd5b506101e16104b8565b6040516101ee9190611231565b60405180910390f35b348015610202575f5ffd5b5061020b6104c0565b005b348015610218575f5ffd5b506102216104f4565b60405161022e9190611185565b60405180910390f35b348015610242575f5ffd5b5061024b610507565b60405161025891906111ad565b60405180910390f35b34801561026c575f5ffd5b506102876004803603810190610282919061124a565b61050d565b60405161029491906111ad565b60405180910390f35b3480156102a8575f5ffd5b506102b1610552565b005b3480156102be575f5ffd5b506102d960048036038101906102d49190611275565b610565565b005b3480156102e6575f5ffd5b506102ef610595565b6040516102fc91906112af565b60405180910390f35b348015610310575f5ffd5b506103196105bd565b604051610326919061107c565b60405180910390f35b34801561033a575f5ffd5b506103556004803603810190610350919061112d565b61064d565b6040516103629190611185565b60405180910390f35b348015610376575f5ffd5b50610391600480360381019061038c91906112c8565b61066f565b60405161039e91906111ad565b60405180910390f35b3480156103b2575f5ffd5b506103cd60048036038101906103c8919061124a565b6106f1565b005b6060600380546103de90611333565b80601f016020809104026020016040519081016040528092919081815260200182805461040a90611333565b80156104555780601f1061042c57610100808354040283529160200191610455565b820191905f5260205f20905b81548152906001019060200180831161043857829003601f168201915b5050505050905090565b5f5f610469610775565b905061047681858561077c565b600191505092915050565b5f600254905090565b5f5f610494610775565b90506104a185828561078e565b6104ac858585610820565b60019150509392505050565b5f6012905090565b6104c8610910565b600560149054906101000a900460ff1615600560146101000a81548160ff021916908315150217905550565b600560149054906101000a900460ff1681565b60075481565b5f5f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61055a610910565b6105635f610997565b565b61056d610910565b6105756104b8565b600a61058191906114bf565b8161058c9190611509565b60078190555050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546105cc90611333565b80601f01602080910402602001604051908101604052809291908181526020018280546105f890611333565b80156106435780601f1061061a57610100808354040283529160200191610643565b820191905f5260205f20905b81548152906001019060200180831161062657829003601f168201915b5050505050905090565b5f5f610657610775565b9050610664818585610820565b600191505092915050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b6106f9610910565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610769575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161076091906112af565b60405180910390fd5b61077281610997565b50565b5f33905090565b6107898383836001610a5a565b505050565b5f610799848461066f565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461081a578181101561080b578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016108029392919061154a565b60405180910390fd5b61081984848484035f610a5a565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610890575f6040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260040161088791906112af565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610900575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016108f791906112af565b60405180910390fd5b61090b838383610c29565b505050565b610918610775565b73ffffffffffffffffffffffffffffffffffffffff16610936610595565b73ffffffffffffffffffffffffffffffffffffffff161461099557610959610775565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161098c91906112af565b60405180910390fd5b565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610aca575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401610ac191906112af565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b3a575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610b3191906112af565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015610c23578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610c1a91906111ad565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8e906115ef565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfc9061167d565b60405180910390fd5b5f8111610d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3e9061170b565b60405180910390fd5b610d4f610595565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610de35760011515600560149054906101000a900460ff16151503610de257600754811115610de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd890611799565b60405180910390fd5b5b5b610dee838383610df3565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e43578060025f828254610e3791906117b7565b92505081905550610f11565b5f5f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015610ecc578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401610ec39392919061154a565b60405180910390fd5b8181035f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f58578060025f8282540392505081905550610fa2565b805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610fff91906111ad565b60405180910390a3505050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61104e8261100c565b6110588185611016565b9350611068818560208601611026565b61107181611034565b840191505092915050565b5f6020820190508181035f8301526110948184611044565b905092915050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6110c9826110a0565b9050919050565b6110d9816110bf565b81146110e3575f5ffd5b50565b5f813590506110f4816110d0565b92915050565b5f819050919050565b61110c816110fa565b8114611116575f5ffd5b50565b5f8135905061112781611103565b92915050565b5f5f604083850312156111435761114261109c565b5b5f611150858286016110e6565b925050602061116185828601611119565b9150509250929050565b5f8115159050919050565b61117f8161116b565b82525050565b5f6020820190506111985f830184611176565b92915050565b6111a7816110fa565b82525050565b5f6020820190506111c05f83018461119e565b92915050565b5f5f5f606084860312156111dd576111dc61109c565b5b5f6111ea868287016110e6565b93505060206111fb868287016110e6565b925050604061120c86828701611119565b9150509250925092565b5f60ff82169050919050565b61122b81611216565b82525050565b5f6020820190506112445f830184611222565b92915050565b5f6020828403121561125f5761125e61109c565b5b5f61126c848285016110e6565b91505092915050565b5f6020828403121561128a5761128961109c565b5b5f61129784828501611119565b91505092915050565b6112a9816110bf565b82525050565b5f6020820190506112c25f8301846112a0565b92915050565b5f5f604083850312156112de576112dd61109c565b5b5f6112eb858286016110e6565b92505060206112fc858286016110e6565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061134a57607f821691505b60208210810361135d5761135c611306565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f5f8291508390505b60018511156113e5578086048111156113c1576113c0611363565b5b60018516156113d05780820291505b80810290506113de85611390565b94506113a5565b94509492505050565b5f826113fd57600190506114b8565b8161140a575f90506114b8565b8160018114611420576002811461142a57611459565b60019150506114b8565b60ff84111561143c5761143b611363565b5b8360020a91508482111561145357611452611363565b5b506114b8565b5060208310610133831016604e8410600b841016171561148e5782820a90508381111561148957611488611363565b5b6114b8565b61149b848484600161139c565b925090508184048111156114b2576114b1611363565b5b81810290505b9392505050565b5f6114c9826110fa565b91506114d483611216565b92506115017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846113ee565b905092915050565b5f611513826110fa565b915061151e836110fa565b925082820261152c816110fa565b9150828204841483151761154357611542611363565b5b5092915050565b5f60608201905061155d5f8301866112a0565b61156a602083018561119e565b611577604083018461119e565b949350505050565b7f45524332303a207472616e736665722066726f6d2074686520766f69642069735f8201527f20666f7262696464656e00000000000000000000000000000000000000000000602082015250565b5f6115d9602a83611016565b91506115e48261157f565b604082019050919050565b5f6020820190508181035f830152611606816115cd565b9050919050565b7f45524332303a207472616e7366657220696e746f2074686520766f69642069735f8201527f20666f7262696464656e00000000000000000000000000000000000000000000602082015250565b5f611667602a83611016565b91506116728261160d565b604082019050919050565b5f6020820190508181035f8301526116948161165b565b9050919050565b7f54686520676f647320726571756972652074686520616d6f756e7420746f20625f8201527f652067726561746572207468616e207a65726f00000000000000000000000000602082015250565b5f6116f5603383611016565b91506117008261169b565b604082019050919050565b5f6020820190508181035f830152611722816116e9565b9050919050565b7f546865207472616e7366657220657863656564732074686520646976696e65205f8201527f302e3725206c696d697400000000000000000000000000000000000000000000602082015250565b5f611783602a83611016565b915061178e82611729565b604082019050919050565b5f6020820190508181035f8301526117b081611777565b9050919050565b5f6117c1826110fa565b91506117cc836110fa565b92508282019050808211156117e4576117e3611363565b5b9291505056fea2646970667358221220f938df17c257d1fa41013127721eb7f947e1df10377e782480fd70c49432d43964736f6c634300081b003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001254686520302d537570706c7920546f6b656e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014f00000000000000000000000000000000000000000000000000000000000000