60a060405234801561000f575f80fd5b50604051611f9a380380611f9a83398181016040528101906100319190610506565b336040518060400160405280600981526020017f52656420546f6b656e00000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f524544000000000000000000000000000000000000000000000000000000000081525081600390816100ad9190610775565b5080600490816100bd9190610775565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610130575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016101279190610883565b60405180910390fd5b61013f8161016e60201b60201c565b50610150338361023160201b60201c565b8060068190555042600781905550603c608081815250505050610959565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036102a1575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016102989190610883565b60405180910390fd5b6102b25f83836102b660201b60201c565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610306578060025f8282546102fa91906108c9565b925050819055506103d4565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508181101561038f578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016103869392919061090b565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361041b578060025f8282540392505081905550610465565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516104c29190610940565b60405180910390a3505050565b5f80fd5b5f819050919050565b6104e5816104d3565b81146104ef575f80fd5b50565b5f81519050610500816104dc565b92915050565b5f806040838503121561051c5761051b6104cf565b5b5f610529858286016104f2565b925050602061053a858286016104f2565b9150509250929050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806105bf57607f821691505b6020821081036105d2576105d161057b565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026106347fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826105f9565b61063e86836105f9565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61067961067461066f846104d3565b610656565b6104d3565b9050919050565b5f819050919050565b6106928361065f565b6106a661069e82610680565b848454610605565b825550505050565b5f90565b6106ba6106ae565b6106c5818484610689565b505050565b5b818110156106e8576106dd5f826106b2565b6001810190506106cb565b5050565b601f82111561072d576106fe816105d8565b610707846105ea565b81016020851015610716578190505b61072a610722856105ea565b8301826106ca565b50505b505050565b5f82821c905092915050565b5f61074d5f1984600802610732565b1980831691505092915050565b5f610765838361073e565b9150826002028217905092915050565b61077e82610544565b67ffffffffffffffff8111156107975761079661054e565b5b6107a182546105a8565b6107ac8282856106ec565b5f60209050601f8311600181146107dd575f84156107cb578287015190505b6107d5858261075a565b86555061083c565b601f1984166107eb866105d8565b5f5b82811015610812578489015182556001820191506020850194506020810190506107ed565b8683101561082f578489015161082b601f89168261073e565b8355505b6001600288020188555050505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61086d82610844565b9050919050565b61087d81610863565b82525050565b5f6020820190506108965f830184610874565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6108d3826104d3565b91506108de836104d3565b92508282019050808211156108f6576108f561089c565b5b92915050565b610905816104d3565b82525050565b5f60608201905061091e5f830186610874565b61092b60208301856108fc565b61093860408301846108fc565b949350505050565b5f6020820190506109535f8301846108fc565b92915050565b6080516116146109865f395f818161053c015281816105810152818161065b0152610a6201526116145ff3fe608060405234801561000f575f80fd5b506004361061011f575f3560e01c806370a08231116100ab57806395d89b411161006f57806395d89b41146102f857806398d5fdca14610316578063a9059cbb14610334578063dd62ed3e14610364578063f2fde38b146103945761011f565b806370a0823114610264578063715018a61461029457806378121dd41461029e5780638da5cb5b146102bc578063947a36fb146102da5761011f565b80632e1a7d4d116100f25780632e1a7d4d146101bf578063313ce567146101db5780634585e33b146101f95780636e04ff0d146102155780636f9fb98a146102465761011f565b806306fdde0314610123578063095ea7b31461014157806318160ddd1461017157806323b872dd1461018f575b5f80fd5b61012b6103b0565b6040516101389190611009565b60405180910390f35b61015b600480360381019061015691906110be565b610440565b6040516101689190611116565b60405180910390f35b610179610462565b604051610186919061113e565b60405180910390f35b6101a960048036038101906101a49190611157565b61046b565b6040516101b69190611116565b60405180910390f35b6101d960048036038101906101d491906111a7565b610499565b005b6101e3610532565b6040516101f091906111ed565b60405180910390f35b610213600480360381019061020e9190611267565b61053a565b005b61022f600480360381019061022a9190611267565b61057c565b60405161023d929190611304565b60405180910390f35b61024e6105c9565b60405161025b919061113e565b60405180910390f35b61027e60048036038101906102799190611332565b6105d0565b60405161028b919061113e565b60405180910390f35b61029c610615565b005b6102a6610628565b6040516102b3919061113e565b60405180910390f35b6102c4610631565b6040516102d1919061136c565b60405180910390f35b6102e2610659565b6040516102ef919061113e565b60405180910390f35b61030061067d565b60405161030d9190611009565b60405180910390f35b61031e61070d565b60405161032b919061113e565b60405180910390f35b61034e600480360381019061034991906110be565b610716565b60405161035b9190611116565b60405180910390f35b61037e60048036038101906103799190611385565b610738565b60405161038b919061113e565b60405180910390f35b6103ae60048036038101906103a99190611332565b6107ba565b005b6060600380546103bf906113f0565b80601f01602080910402602001604051908101604052809291908181526020018280546103eb906113f0565b80156104365780601f1061040d57610100808354040283529160200191610436565b820191905f5260205f20905b81548152906001019060200180831161041957829003601f168201915b5050505050905090565b5f8061044a61083e565b9050610457818585610845565b600191505092915050565b5f600254905090565b5f8061047561083e565b9050610482858285610857565b61048d8585856108e9565b60019150509392505050565b6104a16109d9565b804710156104e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104db9061146a565b60405180910390fd5b6104ec610631565b73ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f1935050505015801561052e573d5f803e3d5ffd5b5050565b5f6012905090565b7f00000000000000000000000000000000000000000000000000000000000000006007544261056991906114b5565b111561057857610577610a60565b5b5050565b5f60607f0000000000000000000000000000000000000000000000000000000000000000600754426105ae91906114b5565b11915060405180602001604052805f81525090509250929050565b5f47905090565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61061d6109d9565b6106265f610aee565b565b5f600754905090565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606004805461068c906113f0565b80601f01602080910402602001604051908101604052809291908181526020018280546106b8906113f0565b80156107035780601f106106da57610100808354040283529160200191610703565b820191905f5260205f20905b8154815290600101906020018083116106e657829003601f168201915b5050505050905090565b5f600654905090565b5f8061072061083e565b905061072d8185856108e9565b600191505092915050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b6107c26109d9565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610832575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610829919061136c565b60405180910390fd5b61083b81610aee565b50565b5f33905090565b6108528383836001610bb1565b505050565b5f6108628484610738565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146108e357818110156108d4578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016108cb939291906114e8565b60405180910390fd5b6108e284848484035f610bb1565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610959575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610950919061136c565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036109c9575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016109c0919061136c565b60405180910390fd5b6109d4838383610d80565b505050565b6109e161083e565b73ffffffffffffffffffffffffffffffffffffffff166109ff610631565b73ffffffffffffffffffffffffffffffffffffffff1614610a5e57610a2261083e565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610a55919061136c565b60405180910390fd5b565b7f0000000000000000000000000000000000000000000000000000000000000000600754610a8e919061151d565b421015610ad0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac7906115c0565b60405180910390fd5b6001600654610adf919061151d565b60068190555042600781905550565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610c21575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401610c18919061136c565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c91575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610c88919061136c565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015610d7a578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610d71919061113e565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610dd0578060025f828254610dc4919061151d565b92505081905550610e9e565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015610e59578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401610e50939291906114e8565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ee5578060025f8282540392505081905550610f2f565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610f8c919061113e565b60405180910390a3505050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f610fdb82610f99565b610fe58185610fa3565b9350610ff5818560208601610fb3565b610ffe81610fc1565b840191505092915050565b5f6020820190508181035f8301526110218184610fd1565b905092915050565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61105a82611031565b9050919050565b61106a81611050565b8114611074575f80fd5b50565b5f8135905061108581611061565b92915050565b5f819050919050565b61109d8161108b565b81146110a7575f80fd5b50565b5f813590506110b881611094565b92915050565b5f80604083850312156110d4576110d3611029565b5b5f6110e185828601611077565b92505060206110f2858286016110aa565b9150509250929050565b5f8115159050919050565b611110816110fc565b82525050565b5f6020820190506111295f830184611107565b92915050565b6111388161108b565b82525050565b5f6020820190506111515f83018461112f565b92915050565b5f805f6060848603121561116e5761116d611029565b5b5f61117b86828701611077565b935050602061118c86828701611077565b925050604061119d868287016110aa565b9150509250925092565b5f602082840312156111bc576111bb611029565b5b5f6111c9848285016110aa565b91505092915050565b5f60ff82169050919050565b6111e7816111d2565b82525050565b5f6020820190506112005f8301846111de565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261122757611226611206565b5b8235905067ffffffffffffffff8111156112445761124361120a565b5b6020830191508360018202830111156112605761125f61120e565b5b9250929050565b5f806020838503121561127d5761127c611029565b5b5f83013567ffffffffffffffff81111561129a5761129961102d565b5b6112a685828601611212565b92509250509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f6112d6826112b2565b6112e081856112bc565b93506112f0818560208601610fb3565b6112f981610fc1565b840191505092915050565b5f6040820190506113175f830185611107565b818103602083015261132981846112cc565b90509392505050565b5f6020828403121561134757611346611029565b5b5f61135484828501611077565b91505092915050565b61136681611050565b82525050565b5f60208201905061137f5f83018461135d565b92915050565b5f806040838503121561139b5761139a611029565b5b5f6113a885828601611077565b92505060206113b985828601611077565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061140757607f821691505b60208210810361141a576114196113c3565b5b50919050565b7f496e73756666696369656e742062616c616e636520696e20636f6e74726163745f82015250565b5f611454602083610fa3565b915061145f82611420565b602082019050919050565b5f6020820190508181035f83015261148181611448565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6114bf8261108b565b91506114ca8361108b565b92508282039050818111156114e2576114e1611488565b5b92915050565b5f6060820190506114fb5f83018661135d565b611508602083018561112f565b611515604083018461112f565b949350505050565b5f6115278261108b565b91506115328361108b565b925082820190508082111561154a57611549611488565b5b92915050565b7f50726963652063616e206f6e6c792062652075706461746564206f6e636520705f8201527f6572206461790000000000000000000000000000000000000000000000000000602082015250565b5f6115aa602683610fa3565b91506115b582611550565b604082019050919050565b5f6020820190508181035f8301526115d78161159e565b905091905056fea2646970667358221220b580d7199743996b6fe47b85d6542cf770e7d07cee7c4750e5c14e4829a8fa5364736f6c634300081a00330000000000000000000000000000000000000000000000008ac7230489e800000000000000000000000000000000000000000000000000000000000000000001