0x610160604052348015610010575f80fd5b50604051612a77380380612a77833981810160405281019061003291906104b0565b6040518060400160405280600981526020017f466172697a686964610000000000000000000000000000000000000000000000815250806040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250836040518060400160405280600981526020017f466172697a6869646100000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f46525a4400000000000000000000000000000000000000000000000000000000815250816003908161011b9190610715565b50806004908161012b9190610715565b5050505f60055f6101000a81548160ff0219169083151502179055505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036101b7575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016101ae91906107f3565b60405180910390fd5b6101c68161027860201b60201c565b506101db60068361033d60201b90919060201c565b61012081815250506101f760078261033d60201b90919060201c565b6101408181525050818051906020012060e08181525050808051906020012061010081815250504660a0818152505061023461038a60201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250505050505061099d565b5f600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f60208351101561035e57610357836103e460201b60201c565b9050610384565b8261036e8361044960201b60201c565b5f01908161037c9190610715565b5060ff5f1b90505b92915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60e0516101005146306040516020016103c9959493929190610833565b60405160208183030381529060405280519060200120905090565b5f80829050601f8151111561043057826040517f305a27a900000000000000000000000000000000000000000000000000000000815260040161042791906108ea565b60405180910390fd5b80518161043c90610937565b5f1c175f1b915050919050565b5f819050919050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61047f82610456565b9050919050565b61048f81610475565b8114610499575f80fd5b50565b5f815190506104aa81610486565b92915050565b5f602082840312156104c5576104c4610452565b5b5f6104d28482850161049c565b91505092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061055657607f821691505b60208210810361056957610568610512565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026105cb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610590565b6105d58683610590565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61061961061461060f846105ed565b6105f6565b6105ed565b9050919050565b5f819050919050565b610632836105ff565b61064661063e82610620565b84845461059c565b825550505050565b5f90565b61065a61064e565b610665818484610629565b505050565b5b818110156106885761067d5f82610652565b60018101905061066b565b5050565b601f8211156106cd5761069e8161056f565b6106a784610581565b810160208510156106b6578190505b6106ca6106c285610581565b83018261066a565b50505b505050565b5f82821c905092915050565b5f6106ed5f19846008026106d2565b1980831691505092915050565b5f61070583836106de565b9150826002028217905092915050565b61071e826104db565b67ffffffffffffffff811115610737576107366104e5565b5b610741825461053f565b61074c82828561068c565b5f60209050601f83116001811461077d575f841561076b578287015190505b61077585826106fa565b8655506107dc565b601f19841661078b8661056f565b5f5b828110156107b25784890151825560018201915060208501945060208101905061078d565b868310156107cf57848901516107cb601f8916826106de565b8355505b6001600288020188555050505b505050505050565b6107ed81610475565b82525050565b5f6020820190506108065f8301846107e4565b92915050565b5f819050919050565b61081e8161080c565b82525050565b61082d816105ed565b82525050565b5f60a0820190506108465f830188610815565b6108536020830187610815565b6108606040830186610815565b61086d6060830185610824565b61087a60808301846107e4565b9695505050505050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6108bc826104db565b6108c68185610884565b93506108d6818560208601610894565b6108df816108a2565b840191505092915050565b5f6020820190508181035f83015261090281846108b2565b905092915050565b5f81519050919050565b5f819050602082019050919050565b5f61092e825161080c565b80915050919050565b5f6109418261090a565b8261094b84610914565b905061095681610923565b92506020821015610996576109917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802610590565b831692505b5050919050565b60805160a05160c05160e0516101005161012051610140516120896109ee5f395f610ea101525f610e6601525f61119101525f61117001525f610ad601525f610b2c01525f610b5501526120895ff3fe608060405234801561000f575f80fd5b506004361061012a575f3560e01c8063715018a6116100ab57806395d89b411161006f57806395d89b4114610300578063a9059cbb1461031e578063d505accf1461034e578063dd62ed3e1461036a578063f2fde38b1461039a5761012a565b8063715018a61461027a5780637ecebe00146102845780638456cb59146102b457806384b0196e146102be5780638da5cb5b146102e25761012a565b80633644e515116100f25780633644e515146101e85780633f4ba83a1461020657806340c10f19146102105780635c975abb1461022c57806370a082311461024a5761012a565b806306fdde031461012e578063095ea7b31461014c57806318160ddd1461017c57806323b872dd1461019a578063313ce567146101ca575b5f80fd5b6101366103b6565b60405161014391906118f9565b60405180910390f35b610166600480360381019061016191906119aa565b610446565b6040516101739190611a02565b60405180910390f35b610184610468565b6040516101919190611a2a565b60405180910390f35b6101b460048036038101906101af9190611a43565b610471565b6040516101c19190611a02565b60405180910390f35b6101d261049f565b6040516101df9190611aae565b60405180910390f35b6101f06104a7565b6040516101fd9190611adf565b60405180910390f35b61020e6104b5565b005b61022a600480360381019061022591906119aa565b6104c7565b005b6102346104dd565b6040516102419190611a02565b60405180910390f35b610264600480360381019061025f9190611af8565b6104f2565b6040516102719190611a2a565b60405180910390f35b610282610537565b005b61029e60048036038101906102999190611af8565b61054a565b6040516102ab9190611a2a565b60405180910390f35b6102bc61055b565b005b6102c661056d565b6040516102d99796959493929190611c23565b60405180910390f35b6102ea610612565b6040516102f79190611ca5565b60405180910390f35b61030861063b565b60405161031591906118f9565b60405180910390f35b610338600480360381019061033391906119aa565b6106cb565b6040516103459190611a02565b60405180910390f35b61036860048036038101906103639190611d12565b6106ed565b005b610384600480360381019061037f9190611daf565b610832565b6040516103919190611a2a565b60405180910390f35b6103b460048036038101906103af9190611af8565b6108b4565b005b6060600380546103c590611e1a565b80601f01602080910402602001604051908101604052809291908181526020018280546103f190611e1a565b801561043c5780601f106104135761010080835404028352916020019161043c565b820191905f5260205f20905b81548152906001019060200180831161041f57829003601f168201915b5050505050905090565b5f80610450610938565b905061045d81858561093f565b600191505092915050565b5f600254905090565b5f8061047b610938565b9050610488858285610951565b6104938585856109e3565b60019150509392505050565b5f6012905090565b5f6104b0610ad3565b905090565b6104bd610b89565b6104c5610c10565b565b6104cf610b89565b6104d98282610c71565b5050565b5f60055f9054906101000a900460ff16905090565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61053f610b89565b6105485f610cf0565b565b5f61055482610db5565b9050919050565b610563610b89565b61056b610dfb565b565b5f6060805f805f606061057e610e5d565b610586610e98565b46305f801b5f67ffffffffffffffff8111156105a5576105a4611e4a565b5b6040519080825280602002602001820160405280156105d35781602001602082028036833780820191505090505b507f0f00000000000000000000000000000000000000000000000000000000000000959493929190965096509650965096509650965090919293949596565b5f600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461064a90611e1a565b80601f016020809104026020016040519081016040528092919081815260200182805461067690611e1a565b80156106c15780601f10610698576101008083540402835291602001916106c1565b820191905f5260205f20905b8154815290600101906020018083116106a457829003601f168201915b5050505050905090565b5f806106d5610938565b90506106e28185856109e3565b600191505092915050565b8342111561073257836040517f627913020000000000000000000000000000000000000000000000000000000081526004016107299190611a2a565b60405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886107608c610ed3565b8960405160200161077696959493929190611e77565b6040516020818303038152906040528051906020012090505f61079882610f26565b90505f6107a782878787610f3f565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461081b57808a6040517f4b800e46000000000000000000000000000000000000000000000000000000008152600401610812929190611ed6565b60405180910390fd5b6108268a8a8a61093f565b50505050505050505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b6108bc610b89565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361092c575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016109239190611ca5565b60405180910390fd5b61093581610cf0565b50565b5f33905090565b61094c8383836001610f6d565b505050565b5f61095c8484610832565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146109dd57818110156109ce578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016109c593929190611efd565b60405180910390fd5b6109dc84848484035f610f6d565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a53575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610a4a9190611ca5565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ac3575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610aba9190611ca5565b60405180910390fd5b610ace83838361113c565b505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610b4e57507f000000000000000000000000000000000000000000000000000000000000000046145b15610b7b577f00000000000000000000000000000000000000000000000000000000000000009050610b86565b610b8361114c565b90505b90565b610b91610938565b73ffffffffffffffffffffffffffffffffffffffff16610baf610612565b73ffffffffffffffffffffffffffffffffffffffff1614610c0e57610bd2610938565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610c059190611ca5565b60405180910390fd5b565b610c186111e1565b5f60055f6101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa610c5a610938565b604051610c679190611ca5565b60405180910390a1565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ce1575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610cd89190611ca5565b60405180910390fd5b610cec5f838361113c565b5050565b5f600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f60085f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610e03611221565b600160055f6101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610e46610938565b604051610e539190611ca5565b60405180910390a1565b6060610e9360067f000000000000000000000000000000000000000000000000000000000000000061126290919063ffffffff16565b905090565b6060610ece60077f000000000000000000000000000000000000000000000000000000000000000061126290919063ffffffff16565b905090565b5f60085f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050559050919050565b5f610f38610f32610ad3565b8361130f565b9050919050565b5f805f80610f4f8888888861134f565b925092509250610f5f8282611436565b829350505050949350505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610fdd575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401610fd49190611ca5565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361104d575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016110449190611ca5565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015611136578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161112d9190611a2a565b60405180910390a35b50505050565b611147838383611598565b505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000046306040516020016111c6959493929190611f32565b60405160208183030381529060405280519060200120905090565b6111e96104dd565b61121f576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6112296104dd565b15611260576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b606060ff5f1b831461127e57611277836115b0565b9050611309565b81805461128a90611e1a565b80601f01602080910402602001604051908101604052809291908181526020018280546112b690611e1a565b80156113015780601f106112d857610100808354040283529160200191611301565b820191905f5260205f20905b8154815290600101906020018083116112e457829003601f168201915b505050505090505b92915050565b5f6040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b5f805f7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0845f1c111561138b575f60038592509250925061142c565b5f6001888888886040515f81526020016040526040516113ae9493929190611f83565b6020604051602081039080840390855afa1580156113ce573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361141f575f60015f801b9350935093505061142c565b805f805f1b935093509350505b9450945094915050565b5f600381111561144957611448611fc6565b5b82600381111561145c5761145b611fc6565b5b0315611594576001600381111561147657611475611fc6565b5b82600381111561148957611488611fc6565b5b036114c0576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260038111156114d4576114d3611fc6565b5b8260038111156114e7576114e6611fc6565b5b0361152b57805f1c6040517ffce698f70000000000000000000000000000000000000000000000000000000081526004016115229190611a2a565b60405180910390fd5b60038081111561153e5761153d611fc6565b5b82600381111561155157611550611fc6565b5b0361159357806040517fd78bce0c00000000000000000000000000000000000000000000000000000000815260040161158a9190611adf565b60405180910390fd5b5b5050565b6115a0611221565b6115ab838383611622565b505050565b60605f6115bc8361183b565b90505f602067ffffffffffffffff8111156115da576115d9611e4a565b5b6040519080825280601f01601f19166020018201604052801561160c5781602001600182028036833780820191505090505b5090508181528360208201528092505050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611672578060025f8282546116669190612020565b92505081905550611740565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156116fb578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016116f293929190611efd565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611787578060025f82825403925050819055506117d1565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161182e9190611a2a565b60405180910390a3505050565b5f8060ff835f1c169050601f811115611880576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80915050919050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6118cb82611889565b6118d58185611893565b93506118e58185602086016118a3565b6118ee816118b1565b840191505092915050565b5f6020820190508181035f83015261191181846118c1565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6119468261191d565b9050919050565b6119568161193c565b8114611960575f80fd5b50565b5f813590506119718161194d565b92915050565b5f819050919050565b61198981611977565b8114611993575f80fd5b50565b5f813590506119a481611980565b92915050565b5f80604083850312156119c0576119bf611919565b5b5f6119cd85828601611963565b92505060206119de85828601611996565b9150509250929050565b5f8115159050919050565b6119fc816119e8565b82525050565b5f602082019050611a155f8301846119f3565b92915050565b611a2481611977565b82525050565b5f602082019050611a3d5f830184611a1b565b92915050565b5f805f60608486031215611a5a57611a59611919565b5b5f611a6786828701611963565b9350506020611a7886828701611963565b9250506040611a8986828701611996565b9150509250925092565b5f60ff82169050919050565b611aa881611a93565b82525050565b5f602082019050611ac15f830184611a9f565b92915050565b5f819050919050565b611ad981611ac7565b82525050565b5f602082019050611af25f830184611ad0565b92915050565b5f60208284031215611b0d57611b0c611919565b5b5f611b1a84828501611963565b91505092915050565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b611b5781611b23565b82525050565b611b668161193c565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b611b9e81611977565b82525050565b5f611baf8383611b95565b60208301905092915050565b5f602082019050919050565b5f611bd182611b6c565b611bdb8185611b76565b9350611be683611b86565b805f5b83811015611c16578151611bfd8882611ba4565b9750611c0883611bbb565b925050600181019050611be9565b5085935050505092915050565b5f60e082019050611c365f83018a611b4e565b8181036020830152611c4881896118c1565b90508181036040830152611c5c81886118c1565b9050611c6b6060830187611a1b565b611c786080830186611b5d565b611c8560a0830185611ad0565b81810360c0830152611c978184611bc7565b905098975050505050505050565b5f602082019050611cb85f830184611b5d565b92915050565b611cc781611a93565b8114611cd1575f80fd5b50565b5f81359050611ce281611cbe565b92915050565b611cf181611ac7565b8114611cfb575f80fd5b50565b5f81359050611d0c81611ce8565b92915050565b5f805f805f805f60e0888a031215611d2d57611d2c611919565b5b5f611d3a8a828b01611963565b9750506020611d4b8a828b01611963565b9650506040611d5c8a828b01611996565b9550506060611d6d8a828b01611996565b9450506080611d7e8a828b01611cd4565b93505060a0611d8f8a828b01611cfe565b92505060c0611da08a828b01611cfe565b91505092959891949750929550565b5f8060408385031215611dc557611dc4611919565b5b5f611dd285828601611963565b9250506020611de385828601611963565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611e3157607f821691505b602082108103611e4457611e43611ded565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60c082019050611e8a5f830189611ad0565b611e976020830188611b5d565b611ea46040830187611b5d565b611eb16060830186611a1b565b611ebe6080830185611a1b565b611ecb60a0830184611a1b565b979650505050505050565b5f604082019050611ee95f830185611b5d565b611ef66020830184611b5d565b9392505050565b5f606082019050611f105f830186611b5d565b611f1d6020830185611a1b565b611f2a6040830184611a1b565b949350505050565b5f60a082019050611f455f830188611ad0565b611f526020830187611ad0565b611f5f6040830186611ad0565b611f6c6060830185611a1b565b611f796080830184611b5d565b9695505050505050565b5f608082019050611f965f830187611ad0565b611fa36020830186611a9f565b611fb06040830185611ad0565b611fbd6060830184611ad0565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61202a82611977565b915061203583611977565b925082820190508082111561204d5761204c611ff3565b5b9291505056fea2646970667358221220ba479e6429a994453db4f0eaaf5138c42cf411e948e3f6fe4e74c9af1c10ce1564736f6c634300081a0033000000000000000000000000f66d2a66ccddc3f705d0f0a576d8c796bd74a34b