60806040526040518060600160405280603581526020016129d160359139600a908161002b9190610448565b50348015610037575f80fd5b50336040518060400160405280600d81526020017f4d61726b204f66205368616d65000000000000000000000000000000000000008152506040518060400160405280600581526020017f5348414d45000000000000000000000000000000000000000000000000000000815250815f90816100b39190610448565b5080600190816100c39190610448565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610136575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161012d9190610556565b60405180910390fd5b6101458161014b60201b60201c565b5061056f565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061028957607f821691505b60208210810361029c5761029b610245565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026102fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826102c3565b61030886836102c3565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61034c61034761034284610320565b610329565b610320565b9050919050565b5f819050919050565b61036583610332565b61037961037182610353565b8484546102cf565b825550505050565b5f90565b61038d610381565b61039881848461035c565b505050565b5b818110156103bb576103b05f82610385565b60018101905061039e565b5050565b601f821115610400576103d1816102a2565b6103da846102b4565b810160208510156103e9578190505b6103fd6103f5856102b4565b83018261039d565b50505b505050565b5f82821c905092915050565b5f6104205f1984600802610405565b1980831691505092915050565b5f6104388383610411565b9150826002028217905092915050565b6104518261020e565b67ffffffffffffffff81111561046a57610469610218565b5b6104748254610272565b61047f8282856103bf565b5f60209050601f8311600181146104b0575f841561049e578287015190505b6104a8858261042d565b86555061050f565b601f1984166104be866102a2565b5f5b828110156104e5578489015182556001820191506020850194506020810190506104c0565b8683101561050257848901516104fe601f891682610411565b8355505b6001600288020188555050505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61054082610517565b9050919050565b61055081610536565b82525050565b5f6020820190506105695f830184610547565b92915050565b6124558061057c5f395ff3fe608060405234801561000f575f80fd5b506004361061011f575f3560e01c806370a08231116100ab578063b88d4fde1161006f578063b88d4fde14610303578063c87b56dd1461031f578063e0359d001461034f578063e985e9c51461036b578063f2fde38b1461039b5761011f565b806370a0823114610271578063715018a6146102a15780638da5cb5b146102ab57806395d89b41146102c9578063a22cb465146102e75761011f565b8063162094c4116100f2578063162094c4146101bd57806323b872dd146101d957806342842e0e146101f55780636352211e146102115780636a627842146102415761011f565b806301ffc9a71461012357806306fdde0314610153578063081812fc14610171578063095ea7b3146101a1575b5f80fd5b61013d60048036038101906101389190611920565b6103b7565b60405161014a9190611965565b60405180910390f35b61015b610498565b60405161016891906119ee565b60405180910390f35b61018b60048036038101906101869190611a41565b610527565b6040516101989190611aab565b60405180910390f35b6101bb60048036038101906101b69190611aee565b610542565b005b6101d760048036038101906101d29190611c58565b610558565b005b6101f360048036038101906101ee9190611cb2565b610583565b005b61020f600480360381019061020a9190611cb2565b610631565b005b61022b60048036038101906102269190611a41565b610650565b6040516102389190611aab565b60405180910390f35b61025b60048036038101906102569190611d02565b610661565b6040516102689190611d3c565b60405180910390f35b61028b60048036038101906102869190611d02565b610739565b6040516102989190611d3c565b60405180910390f35b6102a96107ef565b005b6102b3610802565b6040516102c09190611aab565b60405180910390f35b6102d161082a565b6040516102de91906119ee565b60405180910390f35b61030160048036038101906102fc9190611d7f565b6108ba565b005b61031d60048036038101906103189190611e5b565b6108d0565b005b61033960048036038101906103349190611a41565b6108ed565b60405161034691906119ee565b60405180910390f35b61036960048036038101906103649190611edb565b61098e565b005b61038560048036038101906103809190611f19565b6109e9565b6040516103929190611965565b60405180910390f35b6103b560048036038101906103b09190611d02565b610a77565b005b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061048157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610491575061049082610afb565b5b9050919050565b60605f80546104a690611f84565b80601f01602080910402602001604051908101604052809291908181526020018280546104d290611f84565b801561051d5780601f106104f45761010080835404028352916020019161051d565b820191905f5260205f20905b81548152906001019060200180831161050057829003601f168201915b5050505050905090565b5f61053182610b64565b5061053b82610bea565b9050919050565b610554828261054f610c23565b610c2a565b5050565b610560610c3c565b8060095f8481526020019081526020015f20908161057e9190612151565b505050565b60085f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1603610621576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106189061226a565b60405180910390fd5b61062c838383610cc3565b505050565b61064b83838360405180602001604052805f8152506108d0565b505050565b5f61065a82610b64565b9050919050565b5f61066a610c3c565b600160075f82825461067c91906122b5565b9250508190555061068f82600754610e2b565b61069b6007548361098e565b61072f600754600a80546106ae90611f84565b80601f01602080910402602001604051908101604052809291908181526020018280546106da90611f84565b80156107255780601f106106fc57610100808354040283529160200191610725565b820191905f5260205f20905b81548152906001019060200180831161070857829003601f168201915b5050505050610558565b6007549050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036107aa575f6040517f89c62b640000000000000000000000000000000000000000000000000000000081526004016107a19190611aab565b60405180910390fd5b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6107f7610c3c565b6108005f610e48565b565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461083990611f84565b80601f016020809104026020016040519081016040528092919081815260200182805461086590611f84565b80156108b05780601f10610887576101008083540402835291602001916108b0565b820191905f5260205f20905b81548152906001019060200180831161089357829003601f168201915b5050505050905090565b6108cc6108c5610c23565b8383610f0b565b5050565b6108db848484610583565b6108e784848484611074565b50505050565b606060095f8381526020019081526020015f20805461090b90611f84565b80601f016020809104026020016040519081016040528092919081815260200182805461093790611f84565b80156109825780601f1061095957610100808354040283529160200191610982565b820191905f5260205f20905b81548152906001019060200180831161096557829003601f168201915b50505050509050919050565b610996610c3c565b8060085f8481526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b610a7f610c3c565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610aef575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610ae69190611aab565b60405180910390fd5b610af881610e48565b50565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f80610b6f83611226565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610be157826040517f7e273289000000000000000000000000000000000000000000000000000000008152600401610bd89190611d3c565b60405180910390fd5b80915050919050565b5f60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f33905090565b610c37838383600161125f565b505050565b610c44610c23565b73ffffffffffffffffffffffffffffffffffffffff16610c62610802565b73ffffffffffffffffffffffffffffffffffffffff1614610cc157610c85610c23565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610cb89190611aab565b60405180910390fd5b565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d33575f6040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610d2a9190611aab565b60405180910390fd5b5f610d3f83835f61141e565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610db157816040517f7e273289000000000000000000000000000000000000000000000000000000008152600401610da89190611d3c565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e25578382826040517f64283d7b000000000000000000000000000000000000000000000000000000008152600401610e1c939291906122e8565b60405180910390fd5b50505050565b610e44828260405180602001604052805f815250611629565b5050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f7b57816040517f5b08ba18000000000000000000000000000000000000000000000000000000008152600401610f729190611aab565b60405180910390fd5b8060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110679190611965565b60405180910390a3505050565b5f8373ffffffffffffffffffffffffffffffffffffffff163b1115611220578273ffffffffffffffffffffffffffffffffffffffff1663150b7a026110b7610c23565b8685856040518563ffffffff1660e01b81526004016110d9949392919061236f565b6020604051808303815f875af192505050801561111457506040513d601f19601f8201168201806040525081019061111191906123cd565b60015b611195573d805f8114611142576040519150601f19603f3d011682016040523d82523d5f602084013e611147565b606091505b505f81510361118d57836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016111849190611aab565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461121e57836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016112159190611aab565b60405180910390fd5b505b50505050565b5f60025f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b808061129757505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156113c9575f6112a684610b64565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561131057508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b8015611323575061132181846109e9565b155b1561136557826040517fa9fbf51f00000000000000000000000000000000000000000000000000000000815260040161135c9190611aab565b60405180910390fd5b81156113c757838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b8360045f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b5f8061142984611226565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461146a57611469818486611644565b5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146114f5576114a95f855f8061125f565b600160035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825403925050819055505b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161461157457600160035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8460025f8681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b6116338383611707565b61163f5f848484611074565b505050565b61164f8383836117fa565b611702575f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036116c357806040517f7e2732890000000000000000000000000000000000000000000000000000000081526004016116ba9190611d3c565b60405180910390fd5b81816040517f177e802f0000000000000000000000000000000000000000000000000000000081526004016116f99291906123f8565b60405180910390fd5b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611777575f6040517f64a0ae9200000000000000000000000000000000000000000000000000000000815260040161176e9190611aab565b60405180910390fd5b5f61178383835f61141e565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146117f5575f6040517f73c6ac6e0000000000000000000000000000000000000000000000000000000081526004016117ec9190611aab565b60405180910390fd5b505050565b5f8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156118b157508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611872575061187184846109e9565b5b806118b057508273ffffffffffffffffffffffffffffffffffffffff1661189883610bea565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6118ff816118cb565b8114611909575f80fd5b50565b5f8135905061191a816118f6565b92915050565b5f60208284031215611935576119346118c3565b5b5f6119428482850161190c565b91505092915050565b5f8115159050919050565b61195f8161194b565b82525050565b5f6020820190506119785f830184611956565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6119c08261197e565b6119ca8185611988565b93506119da818560208601611998565b6119e3816119a6565b840191505092915050565b5f6020820190508181035f830152611a0681846119b6565b905092915050565b5f819050919050565b611a2081611a0e565b8114611a2a575f80fd5b50565b5f81359050611a3b81611a17565b92915050565b5f60208284031215611a5657611a556118c3565b5b5f611a6384828501611a2d565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611a9582611a6c565b9050919050565b611aa581611a8b565b82525050565b5f602082019050611abe5f830184611a9c565b92915050565b611acd81611a8b565b8114611ad7575f80fd5b50565b5f81359050611ae881611ac4565b92915050565b5f8060408385031215611b0457611b036118c3565b5b5f611b1185828601611ada565b9250506020611b2285828601611a2d565b9150509250929050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611b6a826119a6565b810181811067ffffffffffffffff82111715611b8957611b88611b34565b5b80604052505050565b5f611b9b6118ba565b9050611ba78282611b61565b919050565b5f67ffffffffffffffff821115611bc657611bc5611b34565b5b611bcf826119a6565b9050602081019050919050565b828183375f83830152505050565b5f611bfc611bf784611bac565b611b92565b905082815260208101848484011115611c1857611c17611b30565b5b611c23848285611bdc565b509392505050565b5f82601f830112611c3f57611c3e611b2c565b5b8135611c4f848260208601611bea565b91505092915050565b5f8060408385031215611c6e57611c6d6118c3565b5b5f611c7b85828601611a2d565b925050602083013567ffffffffffffffff811115611c9c57611c9b6118c7565b5b611ca885828601611c2b565b9150509250929050565b5f805f60608486031215611cc957611cc86118c3565b5b5f611cd686828701611ada565b9350506020611ce786828701611ada565b9250506040611cf886828701611a2d565b9150509250925092565b5f60208284031215611d1757611d166118c3565b5b5f611d2484828501611ada565b91505092915050565b611d3681611a0e565b82525050565b5f602082019050611d4f5f830184611d2d565b92915050565b611d5e8161194b565b8114611d68575f80fd5b50565b5f81359050611d7981611d55565b92915050565b5f8060408385031215611d9557611d946118c3565b5b5f611da285828601611ada565b9250506020611db385828601611d6b565b9150509250929050565b5f67ffffffffffffffff821115611dd757611dd6611b34565b5b611de0826119a6565b9050602081019050919050565b5f611dff611dfa84611dbd565b611b92565b905082815260208101848484011115611e1b57611e1a611b30565b5b611e26848285611bdc565b509392505050565b5f82601f830112611e4257611e41611b2c565b5b8135611e52848260208601611ded565b91505092915050565b5f805f8060808587031215611e7357611e726118c3565b5b5f611e8087828801611ada565b9450506020611e9187828801611ada565b9350506040611ea287828801611a2d565b925050606085013567ffffffffffffffff811115611ec357611ec26118c7565b5b611ecf87828801611e2e565b91505092959194509250565b5f8060408385031215611ef157611ef06118c3565b5b5f611efe85828601611a2d565b9250506020611f0f85828601611ada565b9150509250929050565b5f8060408385031215611f2f57611f2e6118c3565b5b5f611f3c85828601611ada565b9250506020611f4d85828601611ada565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611f9b57607f821691505b602082108103611fae57611fad611f57565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026120107fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611fd5565b61201a8683611fd5565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61205561205061204b84611a0e565b612032565b611a0e565b9050919050565b5f819050919050565b61206e8361203b565b61208261207a8261205c565b848454611fe1565b825550505050565b5f90565b61209661208a565b6120a1818484612065565b505050565b5b818110156120c4576120b95f8261208e565b6001810190506120a7565b5050565b601f821115612109576120da81611fb4565b6120e384611fc6565b810160208510156120f2578190505b6121066120fe85611fc6565b8301826120a6565b50505b505050565b5f82821c905092915050565b5f6121295f198460080261210e565b1980831691505092915050565b5f612141838361211a565b9150826002028217905092915050565b61215a8261197e565b67ffffffffffffffff81111561217357612172611b34565b5b61217d8254611f84565b6121888282856120c8565b5f60209050601f8311600181146121b9575f84156121a7578287015190505b6121b18582612136565b865550612218565b601f1984166121c786611fb4565b5f5b828110156121ee578489015182556001820191506020850194506020810190506121c9565b8683101561220b5784890151612207601f89168261211a565b8355505b6001600288020188555050505b505050505050565b7f4e6f2e20426520617368616d65640000000000000000000000000000000000005f82015250565b5f612254600e83611988565b915061225f82612220565b602082019050919050565b5f6020820190508181035f83015261228181612248565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6122bf82611a0e565b91506122ca83611a0e565b92508282019050808211156122e2576122e1612288565b5b92915050565b5f6060820190506122fb5f830186611a9c565b6123086020830185611d2d565b6123156040830184611a9c565b949350505050565b5f81519050919050565b5f82825260208201905092915050565b5f6123418261231d565b61234b8185612327565b935061235b818560208601611998565b612364816119a6565b840191505092915050565b5f6080820190506123825f830187611a9c565b61238f6020830186611a9c565b61239c6040830185611d2d565b81810360608301526123ae8184612337565b905095945050505050565b5f815190506123c7816118f6565b92915050565b5f602082840312156123e2576123e16118c3565b5b5f6123ef848285016123b9565b91505092915050565b5f60408201905061240b5f830185611a9c565b6124186020830184611d2d565b939250505056fea26469706673582212200bac025dbd7ff3402a2c634ab3293d735968177e2c048f9f8a26548a9de580b064736f6c634300081a0033697066733a2f2f516d566a7965786469376259355474787973383479364d634b595166746a527a6563335a4a617054736b534a6d77