608060405234801561000f575f80fd5b506040518060400160405280600881526020017f48656c6c6f4e66740000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f484e465400000000000000000000000000000000000000000000000000000000815250815f908161008a91906102dc565b50806001908161009a91906102dc565b5050506103ab565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061011d57607f821691505b6020821081036101305761012f6100d9565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026101927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610157565b61019c8683610157565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6101e06101db6101d6846101b4565b6101bd565b6101b4565b9050919050565b5f819050919050565b6101f9836101c6565b61020d610205826101e7565b848454610163565b825550505050565b5f90565b610221610215565b61022c8184846101f0565b505050565b5b8181101561024f576102445f82610219565b600181019050610232565b5050565b601f8211156102945761026581610136565b61026e84610148565b8101602085101561027d578190505b61029161028985610148565b830182610231565b50505b505050565b5f82821c905092915050565b5f6102b45f1984600802610299565b1980831691505092915050565b5f6102cc83836102a5565b9150826002028217905092915050565b6102e5826100a2565b67ffffffffffffffff8111156102fe576102fd6100ac565b5b6103088254610106565b610313828285610253565b5f60209050601f831160018114610344575f8415610332578287015190505b61033c85826102c1565b8655506103a3565b601f19841661035286610136565b5f5b8281101561037957848901518255600182019150602085019450602081019050610354565b868310156103965784890151610392601f8916826102a5565b8355505b6001600288020188555050505b505050505050565b6122f8806103b85f395ff3fe608060405234801561000f575f80fd5b50600436106100f3575f3560e01c806342842e0e11610095578063a22cb46511610064578063a22cb46514610295578063b88d4fde146102b1578063c87b56dd146102cd578063e985e9c5146102fd576100f3565b806342842e0e146101fb5780636352211e1461021757806370a082311461024757806395d89b4114610277576100f3565b8063095ea7b3116100d1578063095ea7b31461017557806323b872dd1461019157806337746cc5146101ad5780633d02d0c9146101df576100f3565b806301ffc9a7146100f757806306fdde0314610127578063081812fc14610145575b5f80fd5b610111600480360381019061010c91906117a3565b61032d565b60405161011e91906117e8565b60405180910390f35b61012f61040e565b60405161013c9190611871565b60405180910390f35b61015f600480360381019061015a91906118c4565b61049d565b60405161016c919061192e565b60405180910390f35b61018f600480360381019061018a9190611971565b6104b8565b005b6101ab60048036038101906101a691906119af565b6104ce565b005b6101c760048036038101906101c29190611971565b6105cd565b6040516101d693929190611a0e565b60405180910390f35b6101f960048036038101906101f49190611b76565b610693565b005b610215600480360381019061021091906119af565b610762565b005b610231600480360381019061022c91906118c4565b610781565b60405161023e919061192e565b60405180910390f35b610261600480360381019061025c9190611bd0565b610792565b60405161026e9190611bfb565b60405180910390f35b61027f610848565b60405161028c9190611871565b60405180910390f35b6102af60048036038101906102aa9190611c3e565b6108d8565b005b6102cb60048036038101906102c69190611d1a565b6108ee565b005b6102e760048036038101906102e291906118c4565b61090b565b6040516102f49190611871565b60405180910390f35b61031760048036038101906103129190611d9a565b610971565b60405161032491906117e8565b60405180910390f35b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806103f757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104075750610406826109ff565b5b9050919050565b60605f805461041c90611e05565b80601f016020809104026020016040519081016040528092919081815260200182805461044890611e05565b80156104935780601f1061046a57610100808354040283529160200191610493565b820191905f5260205f20905b81548152906001019060200180831161047657829003601f168201915b5050505050905090565b5f6104a782610a68565b506104b182610aee565b9050919050565b6104ca82826104c5610b27565b610b2e565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361053e575f6040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610535919061192e565b60405180910390fd5b5f610551838361054c610b27565b610b40565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146105c7578382826040517f64283d7b0000000000000000000000000000000000000000000000000000000081526004016105be93929190611e35565b60405180910390fd5b50505050565b6007602052815f5260405f2081815481106105e6575f80fd5b905f5260205f2090600302015f9150915050805f01549080600101549080600201805461061290611e05565b80601f016020809104026020016040519081016040528092919081815260200182805461063e90611e05565b80156106895780601f1061066057610100808354040283529160200191610689565b820191905f5260205f20905b81548152906001019060200180831161066c57829003601f168201915b5050505050905083565b61069f82600654610d4b565b60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060600160405280600654815260200142815260200183815250908060018154018082558091505060019003905f5260205f2090600302015f909190919091505f820151815f01556020820151816001015560408201518160020190816107469190612007565b50505060016006546107589190612103565b6006819055505050565b61077c83838360405180602001604052805f8152506108ee565b505050565b5f61078b82610a68565b9050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610803575f6040517f89c62b640000000000000000000000000000000000000000000000000000000081526004016107fa919061192e565b60405180910390fd5b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b60606001805461085790611e05565b80601f016020809104026020016040519081016040528092919081815260200182805461088390611e05565b80156108ce5780601f106108a5576101008083540402835291602001916108ce565b820191905f5260205f20905b8154815290600101906020018083116108b157829003601f168201915b5050505050905090565b6108ea6108e3610b27565b8383610d68565b5050565b6108f98484846104ce565b61090584848484610ed1565b50505050565b606061091682610a68565b505f610920611083565b90505f81511161093e5760405180602001604052805f815250610969565b8061094884611099565b604051602001610959929190612170565b6040516020818303038152906040525b915050919050565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f80610a7383611163565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ae557826040517f7e273289000000000000000000000000000000000000000000000000000000008152600401610adc9190611bfb565b60405180910390fd5b80915050919050565b5f60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f33905090565b610b3b838383600161119c565b505050565b5f80610b4b84611163565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610b8c57610b8b81848661135b565b5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c1757610bcb5f855f8061119c565b600160035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825403925050819055505b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614610c9657600160035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8460025f8681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b610d64828260405180602001604052805f81525061141e565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610dd857816040517f5b08ba18000000000000000000000000000000000000000000000000000000008152600401610dcf919061192e565b60405180910390fd5b8060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610ec491906117e8565b60405180910390a3505050565b5f8373ffffffffffffffffffffffffffffffffffffffff163b111561107d578273ffffffffffffffffffffffffffffffffffffffff1663150b7a02610f14610b27565b8685856040518563ffffffff1660e01b8152600401610f3694939291906121e5565b6020604051808303815f875af1925050508015610f7157506040513d601f19601f82011682018060405250810190610f6e9190612243565b60015b610ff2573d805f8114610f9f576040519150601f19603f3d011682016040523d82523d5f602084013e610fa4565b606091505b505f815103610fea57836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610fe1919061192e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461107b57836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401611072919061192e565b60405180910390fd5b505b50505050565b606060405180602001604052805f815250905090565b60605f60016110a784611439565b0190505f8167ffffffffffffffff8111156110c5576110c4611a52565b5b6040519080825280601f01601f1916602001820160405280156110f75781602001600182028036833780820191505090505b5090505f82602001820190505b600115611158578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161114d5761114c61226e565b5b0494505f8503611104575b819350505050919050565b5f60025f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b80806111d457505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15611306575f6111e384610a68565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561124d57508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b8015611260575061125e8184610971565b155b156112a257826040517fa9fbf51f000000000000000000000000000000000000000000000000000000008152600401611299919061192e565b60405180910390fd5b811561130457838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b8360045f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b61136683838361158a565b611419575f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113da57806040517f7e2732890000000000000000000000000000000000000000000000000000000081526004016113d19190611bfb565b60405180910390fd5b81816040517f177e802f00000000000000000000000000000000000000000000000000000000815260040161141092919061229b565b60405180910390fd5b505050565b611428838361164a565b6114345f848484610ed1565b505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611495577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161148b5761148a61226e565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106114d2576d04ee2d6d415b85acef810000000083816114c8576114c761226e565b5b0492506020810190505b662386f26fc10000831061150157662386f26fc1000083816114f7576114f661226e565b5b0492506010810190505b6305f5e100831061152a576305f5e10083816115205761151f61226e565b5b0492506008810190505b612710831061154f5761271083816115455761154461226e565b5b0492506004810190505b6064831061157257606483816115685761156761226e565b5b0492506002810190505b600a8310611581576001810190505b80915050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561164157508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061160257506116018484610971565b5b8061164057508273ffffffffffffffffffffffffffffffffffffffff1661162883610aee565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116ba575f6040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016116b1919061192e565b60405180910390fd5b5f6116c683835f610b40565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611738575f6040517f73c6ac6e00000000000000000000000000000000000000000000000000000000815260040161172f919061192e565b60405180910390fd5b505050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6117828161174e565b811461178c575f80fd5b50565b5f8135905061179d81611779565b92915050565b5f602082840312156117b8576117b7611746565b5b5f6117c58482850161178f565b91505092915050565b5f8115159050919050565b6117e2816117ce565b82525050565b5f6020820190506117fb5f8301846117d9565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61184382611801565b61184d818561180b565b935061185d81856020860161181b565b61186681611829565b840191505092915050565b5f6020820190508181035f8301526118898184611839565b905092915050565b5f819050919050565b6118a381611891565b81146118ad575f80fd5b50565b5f813590506118be8161189a565b92915050565b5f602082840312156118d9576118d8611746565b5b5f6118e6848285016118b0565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611918826118ef565b9050919050565b6119288161190e565b82525050565b5f6020820190506119415f83018461191f565b92915050565b6119508161190e565b811461195a575f80fd5b50565b5f8135905061196b81611947565b92915050565b5f806040838503121561198757611986611746565b5b5f6119948582860161195d565b92505060206119a5858286016118b0565b9150509250929050565b5f805f606084860312156119c6576119c5611746565b5b5f6119d38682870161195d565b93505060206119e48682870161195d565b92505060406119f5868287016118b0565b9150509250925092565b611a0881611891565b82525050565b5f606082019050611a215f8301866119ff565b611a2e60208301856119ff565b8181036040830152611a408184611839565b9050949350505050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611a8882611829565b810181811067ffffffffffffffff82111715611aa757611aa6611a52565b5b80604052505050565b5f611ab961173d565b9050611ac58282611a7f565b919050565b5f67ffffffffffffffff821115611ae457611ae3611a52565b5b611aed82611829565b9050602081019050919050565b828183375f83830152505050565b5f611b1a611b1584611aca565b611ab0565b905082815260208101848484011115611b3657611b35611a4e565b5b611b41848285611afa565b509392505050565b5f82601f830112611b5d57611b5c611a4a565b5b8135611b6d848260208601611b08565b91505092915050565b5f8060408385031215611b8c57611b8b611746565b5b5f611b998582860161195d565b925050602083013567ffffffffffffffff811115611bba57611bb961174a565b5b611bc685828601611b49565b9150509250929050565b5f60208284031215611be557611be4611746565b5b5f611bf28482850161195d565b91505092915050565b5f602082019050611c0e5f8301846119ff565b92915050565b611c1d816117ce565b8114611c27575f80fd5b50565b5f81359050611c3881611c14565b92915050565b5f8060408385031215611c5457611c53611746565b5b5f611c618582860161195d565b9250506020611c7285828601611c2a565b9150509250929050565b5f67ffffffffffffffff821115611c9657611c95611a52565b5b611c9f82611829565b9050602081019050919050565b5f611cbe611cb984611c7c565b611ab0565b905082815260208101848484011115611cda57611cd9611a4e565b5b611ce5848285611afa565b509392505050565b5f82601f830112611d0157611d00611a4a565b5b8135611d11848260208601611cac565b91505092915050565b5f805f8060808587031215611d3257611d31611746565b5b5f611d3f8782880161195d565b9450506020611d508782880161195d565b9350506040611d61878288016118b0565b925050606085013567ffffffffffffffff811115611d8257611d8161174a565b5b611d8e87828801611ced565b91505092959194509250565b5f8060408385031215611db057611daf611746565b5b5f611dbd8582860161195d565b9250506020611dce8582860161195d565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611e1c57607f821691505b602082108103611e2f57611e2e611dd8565b5b50919050565b5f606082019050611e485f83018661191f565b611e5560208301856119ff565b611e62604083018461191f565b949350505050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302611ec67fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611e8b565b611ed08683611e8b565b95508019841693508086168417925050509392505050565b5f819050919050565b5f611f0b611f06611f0184611891565b611ee8565b611891565b9050919050565b5f819050919050565b611f2483611ef1565b611f38611f3082611f12565b848454611e97565b825550505050565b5f90565b611f4c611f40565b611f57818484611f1b565b505050565b5b81811015611f7a57611f6f5f82611f44565b600181019050611f5d565b5050565b601f821115611fbf57611f9081611e6a565b611f9984611e7c565b81016020851015611fa8578190505b611fbc611fb485611e7c565b830182611f5c565b50505b505050565b5f82821c905092915050565b5f611fdf5f1984600802611fc4565b1980831691505092915050565b5f611ff78383611fd0565b9150826002028217905092915050565b61201082611801565b67ffffffffffffffff81111561202957612028611a52565b5b6120338254611e05565b61203e828285611f7e565b5f60209050601f83116001811461206f575f841561205d578287015190505b6120678582611fec565b8655506120ce565b601f19841661207d86611e6a565b5f5b828110156120a45784890151825560018201915060208501945060208101905061207f565b868310156120c157848901516120bd601f891682611fd0565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61210d82611891565b915061211883611891565b92508282019050808211156121305761212f6120d6565b5b92915050565b5f81905092915050565b5f61214a82611801565b6121548185612136565b935061216481856020860161181b565b80840191505092915050565b5f61217b8285612140565b91506121878284612140565b91508190509392505050565b5f81519050919050565b5f82825260208201905092915050565b5f6121b782612193565b6121c1818561219d565b93506121d181856020860161181b565b6121da81611829565b840191505092915050565b5f6080820190506121f85f83018761191f565b612205602083018661191f565b61221260408301856119ff565b818103606083015261222481846121ad565b905095945050505050565b5f8151905061223d81611779565b92915050565b5f6020828403121561225857612257611746565b5b5f6122658482850161222f565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6040820190506122ae5f83018561191f565b6122bb60208301846119ff565b939250505056fea2646970667358221220e921b9e54c8cd687b1279f8085e20a6437e9962a634bc6dbaf2ee231826b9ba764736f6c634300081a0033