0x608060405234801561001057600080fd5b50611635806100206000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c80636352211e116100665780636352211e1461013057806377097fc814610160578063a22cb4651461017c578063c87b56dd14610198578063e985e9c5146101c857610093565b8063095ea7b31461009857806323b872dd146100b4578063390ff134146100d05780634f558e7914610100575b600080fd5b6100b260048036038101906100ad9190610c8a565b6101f8565b005b6100ce60048036038101906100c99190610cca565b610352565b005b6100ea60048036038101906100e59190610c8a565b6103ab565b6040516100f79190610d38565b60405180910390f35b61011a60048036038101906101159190610d53565b610417565b6040516101279190610d38565b60405180910390f35b61014a60048036038101906101459190610d53565b610485565b6040516101579190610d8f565b60405180910390f35b61017a60048036038101906101759190610ef0565b610538565b005b61019660048036038101906101919190610f78565b6106d9565b005b6101b260048036038101906101ad9190610d53565b610844565b6040516101bf9190611037565b60405180910390f35b6101e260048036038101906101dd9190611059565b61098f565b6040516101ef9190610d38565b60405180910390f35b600080600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036102a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610297906110e5565b60405180910390fd5b826001600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b61035c3382610a23565b61039b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161039290611151565b60405180910390fd5b6103a6838383610a8b565b505050565b60008273ffffffffffffffffffffffffffffffffffffffff166001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b60008073ffffffffffffffffffffffffffffffffffffffff1660008084815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60008060008084815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361052f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610526906111bd565b60405180910390fd5b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff1660008084815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146105dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d390611229565b60405180910390fd5b60405180604001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018281525060008084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010190816106759190611455565b50905050813373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610747576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073e90611573565b60405180910390fd5b80600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516108389190610d38565b60405180910390a35050565b6060600073ffffffffffffffffffffffffffffffffffffffff1660008084815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036108ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e1906111bd565b60405180910390fd5b600080838152602001908152602001600020600101805461090a90611278565b80601f016020809104026020016040519081016040528092919081815260200182805461093690611278565b80156109835780601f1061095857610100808354040283529160200191610983565b820191906000526020600020905b81548152906001019060200180831161096657829003601f168201915b50505050509050919050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600080610a2f83610485565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610a715750610a7084846103ab565b5b80610a825750610a81818561098f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b25906115df565b60405180910390fd5b8160008083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610c2182610bf6565b9050919050565b610c3181610c16565b8114610c3c57600080fd5b50565b600081359050610c4e81610c28565b92915050565b6000819050919050565b610c6781610c54565b8114610c7257600080fd5b50565b600081359050610c8481610c5e565b92915050565b60008060408385031215610ca157610ca0610bec565b5b6000610caf85828601610c3f565b9250506020610cc085828601610c75565b9150509250929050565b600080600060608486031215610ce357610ce2610bec565b5b6000610cf186828701610c3f565b9350506020610d0286828701610c3f565b9250506040610d1386828701610c75565b9150509250925092565b60008115159050919050565b610d3281610d1d565b82525050565b6000602082019050610d4d6000830184610d29565b92915050565b600060208284031215610d6957610d68610bec565b5b6000610d7784828501610c75565b91505092915050565b610d8981610c16565b82525050565b6000602082019050610da46000830184610d80565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610dfd82610db4565b810181811067ffffffffffffffff82111715610e1c57610e1b610dc5565b5b80604052505050565b6000610e2f610be2565b9050610e3b8282610df4565b919050565b600067ffffffffffffffff821115610e5b57610e5a610dc5565b5b610e6482610db4565b9050602081019050919050565b82818337600083830152505050565b6000610e93610e8e84610e40565b610e25565b905082815260208101848484011115610eaf57610eae610daf565b5b610eba848285610e71565b509392505050565b600082601f830112610ed757610ed6610daa565b5b8135610ee7848260208601610e80565b91505092915050565b60008060408385031215610f0757610f06610bec565b5b6000610f1585828601610c75565b925050602083013567ffffffffffffffff811115610f3657610f35610bf1565b5b610f4285828601610ec2565b9150509250929050565b610f5581610d1d565b8114610f6057600080fd5b50565b600081359050610f7281610f4c565b92915050565b60008060408385031215610f8f57610f8e610bec565b5b6000610f9d85828601610c3f565b9250506020610fae85828601610f63565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610ff2578082015181840152602081019050610fd7565b60008484015250505050565b600061100982610fb8565b6110138185610fc3565b9350611023818560208601610fd4565b61102c81610db4565b840191505092915050565b600060208201905081810360008301526110518184610ffe565b905092915050565b600080604083850312156110705761106f610bec565b5b600061107e85828601610c3f565b925050602061108f85828601610c3f565b9150509250929050565b7f43616e6e6f7420617070726f76652074686520746f6b656e206f776e65720000600082015250565b60006110cf601e83610fc3565b91506110da82611099565b602082019050919050565b600060208201905081810360008301526110fe816110c2565b9050919050565b7f5472616e73666572206e6f7420617070726f7665640000000000000000000000600082015250565b600061113b601583610fc3565b915061114682611105565b602082019050919050565b6000602082019050818103600083015261116a8161112e565b9050919050565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b60006111a7601483610fc3565b91506111b282611171565b602082019050919050565b600060208201905081810360008301526111d68161119a565b9050919050565b7f546f6b656e20494420616c726561647920657869737473000000000000000000600082015250565b6000611213601783610fc3565b915061121e826111dd565b602082019050919050565b6000602082019050818103600083015261124281611206565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061129057607f821691505b6020821081036112a3576112a2611249565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261130b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826112ce565b61131586836112ce565b95508019841693508086168417925050509392505050565b6000819050919050565b600061135261134d61134884610c54565b61132d565b610c54565b9050919050565b6000819050919050565b61136c83611337565b61138061137882611359565b8484546112db565b825550505050565b600090565b611395611388565b6113a0818484611363565b505050565b5b818110156113c4576113b960008261138d565b6001810190506113a6565b5050565b601f821115611409576113da816112a9565b6113e3846112be565b810160208510156113f2578190505b6114066113fe856112be565b8301826113a5565b50505b505050565b600082821c905092915050565b600061142c6000198460080261140e565b1980831691505092915050565b6000611445838361141b565b9150826002028217905092915050565b61145e82610fb8565b67ffffffffffffffff81111561147757611476610dc5565b5b6114818254611278565b61148c8282856113c8565b600060209050601f8311600181146114bf57600084156114ad578287015190505b6114b78582611439565b86555061151f565b601f1984166114cd866112a9565b60005b828110156114f5578489015182556001820191506020850194506020810190506114d0565b86831015611512578489015161150e601f89168261141b565b8355505b6001600288020188555050505b505050505050565b7f43616c6c65722063616e6e6f7420626520746865206f70657261746f72000000600082015250565b600061155d601d83610fc3565b915061156882611527565b602082019050919050565b6000602082019050818103600083015261158c81611550565b9050919050565b7f546f6b656e20646f6573206e6f742062656c6f6e6720746f2073656e64657200600082015250565b60006115c9601f83610fc3565b91506115d482611593565b602082019050919050565b600060208201905081810360008301526115f8816115bc565b905091905056fea2646970667358221220f816b3210be4c640fedb1bb904db95ea239a1ca3f9fd5807584a46aef2ecd58364736f6c63430008120033