60806040526040518060400160405280601081526020017f6f726967696e6574686572732e636f6d000000000000000000000000000000008152506003908161004891906103af565b506040518060400160405280601081526020017f6f726967696e6574686572732e636f6d000000000000000000000000000000008152506004908161008d91906103af565b5061271060055534801561009f575f80fd5b5060405180606001604052806035815260200161279d603591396100c88161016260201b60201c565b5073856c4efb76c1d1ae02e20ceb03a2a6a08b0b8dc373ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f625f6005546040516101559291906104c6565b60405180910390a46104ed565b806002908161017191906103af565b5050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806101f057607f821691505b602082108103610203576102026101ac565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026102657fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261022a565b61026f868361022a565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6102b36102ae6102a984610287565b610290565b610287565b9050919050565b5f819050919050565b6102cc83610299565b6102e06102d8826102ba565b848454610236565b825550505050565b5f90565b6102f46102e8565b6102ff8184846102c3565b505050565b5b81811015610322576103175f826102ec565b600181019050610305565b5050565b601f8211156103675761033881610209565b6103418461021b565b81016020851015610350578190505b61036461035c8561021b565b830182610304565b50505b505050565b5f82821c905092915050565b5f6103875f198460080261036c565b1980831691505092915050565b5f61039f8383610378565b9150826002028217905092915050565b6103b882610175565b67ffffffffffffffff8111156103d1576103d061017f565b5b6103db82546101d9565b6103e6828285610326565b5f60209050601f831160018114610417575f8415610405578287015190505b61040f8582610394565b865550610476565b601f19841661042586610209565b5f5b8281101561044c57848901518255600182019150602085019450602081019050610427565b868310156104695784890151610465601f891682610378565b8355505b6001600288020188555050505b505050505050565b5f819050919050565b5f6104a161049c6104978461047e565b610290565b610287565b9050919050565b6104b181610487565b82525050565b6104c081610287565b82525050565b5f6040820190506104d95f8301856104a8565b6104e660208301846104b7565b9392505050565b6122a3806104fa5f395ff3fe6080604052600436106100a5575f3560e01c80634e1273f4116100635780634e1273f4146101d9578063729ad39e1461021557806395d89b4114610231578063a22cb4651461025b578063e985e9c514610283578063f242432a146102bf576100a5565b8062fdd58e146100a957806301ffc9a7146100e557806306fdde03146101215780630e89341c1461014b57806318160ddd146101875780632eb2c2d6146101b1575b5f80fd5b3480156100b4575f80fd5b506100cf60048036038101906100ca9190611600565b6102e7565b6040516100dc919061164d565b60405180910390f35b3480156100f0575f80fd5b5061010b600480360381019061010691906116bb565b61033c565b6040516101189190611700565b60405180910390f35b34801561012c575f80fd5b5061013561041d565b6040516101429190611789565b60405180910390f35b348015610156575f80fd5b50610171600480360381019061016c91906117a9565b6104a9565b60405161017e9190611789565b60405180910390f35b348015610192575f80fd5b5061019b61053b565b6040516101a8919061164d565b60405180910390f35b3480156101bc575f80fd5b506101d760048036038101906101d291906119c4565b610541565b005b3480156101e4575f80fd5b506101ff60048036038101906101fa9190611b4f565b6105e8565b60405161020c9190611c7c565b60405180910390f35b61022f600480360381019061022a9190611cf5565b6106ef565b005b34801561023c575f80fd5b506102456107c8565b6040516102529190611789565b60405180910390f35b348015610266575f80fd5b50610281600480360381019061027c9190611d6a565b610854565b005b34801561028e575f80fd5b506102a960048036038101906102a49190611da8565b61086a565b6040516102b69190611700565b60405180910390f35b3480156102ca575f80fd5b506102e560048036038101906102e09190611de6565b6108f8565b005b5f805f8381526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b5f7fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061040657507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061041657506104158261099f565b5b9050919050565b6003805461042a90611ea6565b80601f016020809104026020016040519081016040528092919081815260200182805461045690611ea6565b80156104a15780601f10610478576101008083540402835291602001916104a1565b820191905f5260205f20905b81548152906001019060200180831161048457829003601f168201915b505050505081565b6060600280546104b890611ea6565b80601f01602080910402602001604051908101604052809291908181526020018280546104e490611ea6565b801561052f5780601f106105065761010080835404028352916020019161052f565b820191905f5260205f20905b81548152906001019060200180831161051257829003601f168201915b50505050509050919050565b60055481565b5f61054a610a08565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415801561058f575061058d868261086a565b155b156105d35780866040517fe237d9220000000000000000000000000000000000000000000000000000000081526004016105ca929190611ee5565b60405180910390fd5b6105e08686868686610a0f565b505050505050565b6060815183511461063457815183516040517f5b05999100000000000000000000000000000000000000000000000000000000815260040161062b929190611f0c565b60405180910390fd5b5f835167ffffffffffffffff8111156106505761064f6117d8565b5b60405190808252806020026020018201604052801561067e5781602001602082028036833780820191505090505b5090505f5b84518110156106e4576106ba6106a28287610b0390919063ffffffff16565b6106b58387610b1690919063ffffffff16565b6102e7565b8282815181106106cd576106cc611f33565b5b602002602001018181525050806001019050610683565b508091505092915050565b5f5b828290508110156107c35782828281811061070f5761070e611f33565b5b90506020020160208101906107249190611f60565b73ffffffffffffffffffffffffffffffffffffffff1673856c4efb76c1d1ae02e20ceb03a2a6a08b0b8dc373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f625f60016040516107ae929190612006565b60405180910390a480806001019150506106f1565b505050565b600480546107d590611ea6565b80601f016020809104026020016040519081016040528092919081815260200182805461080190611ea6565b801561084c5780601f106108235761010080835404028352916020019161084c565b820191905f5260205f20905b81548152906001019060200180831161082f57829003601f168201915b505050505081565b61086661085f610a08565b8383610b29565b5050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f610901610a08565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16141580156109465750610944868261086a565b155b1561098a5780866040517fe237d922000000000000000000000000000000000000000000000000000000008152600401610981929190611ee5565b60405180910390fd5b6109978686868686610c92565b505050505050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610a7f575f6040517f57f447ce000000000000000000000000000000000000000000000000000000008152600401610a76919061202d565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610aef575f6040517f01a83514000000000000000000000000000000000000000000000000000000008152600401610ae6919061202d565b60405180910390fd5b610afc8585858585610d98565b5050505050565b5f60208202602084010151905092915050565b5f60208202602084010151905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b99575f6040517fced3e100000000000000000000000000000000000000000000000000000000008152600401610b90919061202d565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610c859190611700565b60405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610d02575f6040517f57f447ce000000000000000000000000000000000000000000000000000000008152600401610cf9919061202d565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610d72575f6040517f01a83514000000000000000000000000000000000000000000000000000000008152600401610d69919061202d565b60405180910390fd5b5f80610d7e8585610e44565b91509150610d8f8787848487610d98565b50505050505050565b610da485858585610e74565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614610e3d575f610de0610a08565b90506001845103610e2c575f610dff5f86610b1690919063ffffffff16565b90505f610e155f86610b1690919063ffffffff16565b9050610e25838989858589611204565b5050610e3b565b610e3a8187878787876113b3565b5b505b5050505050565b60608060405191506001825283602083015260408201905060018152826020820152604081016040529250929050565b8051825114610ebe57815181516040517f5b059991000000000000000000000000000000000000000000000000000000008152600401610eb5929190611f0c565b60405180910390fd5b5f610ec7610a08565b90505f5b83518110156110c3575f610ee88286610b1690919063ffffffff16565b90505f610efe8386610b1690919063ffffffff16565b90505f73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614611021575f805f8481526020019081526020015f205f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015610fcd57888183856040517f03dee4c5000000000000000000000000000000000000000000000000000000008152600401610fc49493929190612046565b60405180910390fd5b8181035f808581526020019081526020015f205f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16146110b657805f808481526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546110ae91906120b6565b925050819055505b5050806001019050610ecb565b50600183510361117e575f6110e15f85610b1690919063ffffffff16565b90505f6110f75f85610b1690919063ffffffff16565b90508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62858560405161116f929190611f0c565b60405180910390a450506111fd565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516111f49291906120e9565b60405180910390a45b5050505050565b5f8473ffffffffffffffffffffffffffffffffffffffff163b11156113ab578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401611264959493929190612170565b6020604051808303815f875af192505050801561129f57506040513d601f19601f8201168201806040525081019061129c91906121dc565b60015b611320573d805f81146112cd576040519150601f19603f3d011682016040523d82523d5f602084013e6112d2565b606091505b505f81510361131857846040517f57f447ce00000000000000000000000000000000000000000000000000000000815260040161130f919061202d565b60405180910390fd5b805181602001fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146113a957846040517f57f447ce0000000000000000000000000000000000000000000000000000000081526004016113a0919061202d565b60405180910390fd5b505b505050505050565b5f8473ffffffffffffffffffffffffffffffffffffffff163b111561155a578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401611413959493929190612207565b6020604051808303815f875af192505050801561144e57506040513d601f19601f8201168201806040525081019061144b91906121dc565b60015b6114cf573d805f811461147c576040519150601f19603f3d011682016040523d82523d5f602084013e611481565b606091505b505f8151036114c757846040517f57f447ce0000000000000000000000000000000000000000000000000000000081526004016114be919061202d565b60405180910390fd5b805181602001fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461155857846040517f57f447ce00000000000000000000000000000000000000000000000000000000815260040161154f919061202d565b60405180910390fd5b505b505050505050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61159c82611573565b9050919050565b6115ac81611592565b81146115b6575f80fd5b50565b5f813590506115c7816115a3565b92915050565b5f819050919050565b6115df816115cd565b81146115e9575f80fd5b50565b5f813590506115fa816115d6565b92915050565b5f80604083850312156116165761161561156b565b5b5f611623858286016115b9565b9250506020611634858286016115ec565b9150509250929050565b611647816115cd565b82525050565b5f6020820190506116605f83018461163e565b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61169a81611666565b81146116a4575f80fd5b50565b5f813590506116b581611691565b92915050565b5f602082840312156116d0576116cf61156b565b5b5f6116dd848285016116a7565b91505092915050565b5f8115159050919050565b6116fa816116e6565b82525050565b5f6020820190506117135f8301846116f1565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61175b82611719565b6117658185611723565b9350611775818560208601611733565b61177e81611741565b840191505092915050565b5f6020820190508181035f8301526117a18184611751565b905092915050565b5f602082840312156117be576117bd61156b565b5b5f6117cb848285016115ec565b91505092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61180e82611741565b810181811067ffffffffffffffff8211171561182d5761182c6117d8565b5b80604052505050565b5f61183f611562565b905061184b8282611805565b919050565b5f67ffffffffffffffff82111561186a576118696117d8565b5b602082029050602081019050919050565b5f80fd5b5f61189161188c84611850565b611836565b905080838252602082019050602084028301858111156118b4576118b361187b565b5b835b818110156118dd57806118c988826115ec565b8452602084019350506020810190506118b6565b5050509392505050565b5f82601f8301126118fb576118fa6117d4565b5b813561190b84826020860161187f565b91505092915050565b5f80fd5b5f67ffffffffffffffff821115611932576119316117d8565b5b61193b82611741565b9050602081019050919050565b828183375f83830152505050565b5f61196861196384611918565b611836565b90508281526020810184848401111561198457611983611914565b5b61198f848285611948565b509392505050565b5f82601f8301126119ab576119aa6117d4565b5b81356119bb848260208601611956565b91505092915050565b5f805f805f60a086880312156119dd576119dc61156b565b5b5f6119ea888289016115b9565b95505060206119fb888289016115b9565b945050604086013567ffffffffffffffff811115611a1c57611a1b61156f565b5b611a28888289016118e7565b935050606086013567ffffffffffffffff811115611a4957611a4861156f565b5b611a55888289016118e7565b925050608086013567ffffffffffffffff811115611a7657611a7561156f565b5b611a8288828901611997565b9150509295509295909350565b5f67ffffffffffffffff821115611aa957611aa86117d8565b5b602082029050602081019050919050565b5f611acc611ac784611a8f565b611836565b90508083825260208201905060208402830185811115611aef57611aee61187b565b5b835b81811015611b185780611b0488826115b9565b845260208401935050602081019050611af1565b5050509392505050565b5f82601f830112611b3657611b356117d4565b5b8135611b46848260208601611aba565b91505092915050565b5f8060408385031215611b6557611b6461156b565b5b5f83013567ffffffffffffffff811115611b8257611b8161156f565b5b611b8e85828601611b22565b925050602083013567ffffffffffffffff811115611baf57611bae61156f565b5b611bbb858286016118e7565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b611bf7816115cd565b82525050565b5f611c088383611bee565b60208301905092915050565b5f602082019050919050565b5f611c2a82611bc5565b611c348185611bcf565b9350611c3f83611bdf565b805f5b83811015611c6f578151611c568882611bfd565b9750611c6183611c14565b925050600181019050611c42565b5085935050505092915050565b5f6020820190508181035f830152611c948184611c20565b905092915050565b5f80fd5b5f8083601f840112611cb557611cb46117d4565b5b8235905067ffffffffffffffff811115611cd257611cd1611c9c565b5b602083019150836020820283011115611cee57611ced61187b565b5b9250929050565b5f8060208385031215611d0b57611d0a61156b565b5b5f83013567ffffffffffffffff811115611d2857611d2761156f565b5b611d3485828601611ca0565b92509250509250929050565b611d49816116e6565b8114611d53575f80fd5b50565b5f81359050611d6481611d40565b92915050565b5f8060408385031215611d8057611d7f61156b565b5b5f611d8d858286016115b9565b9250506020611d9e85828601611d56565b9150509250929050565b5f8060408385031215611dbe57611dbd61156b565b5b5f611dcb858286016115b9565b9250506020611ddc858286016115b9565b9150509250929050565b5f805f805f60a08688031215611dff57611dfe61156b565b5b5f611e0c888289016115b9565b9550506020611e1d888289016115b9565b9450506040611e2e888289016115ec565b9350506060611e3f888289016115ec565b925050608086013567ffffffffffffffff811115611e6057611e5f61156f565b5b611e6c88828901611997565b9150509295509295909350565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611ebd57607f821691505b602082108103611ed057611ecf611e79565b5b50919050565b611edf81611592565b82525050565b5f604082019050611ef85f830185611ed6565b611f056020830184611ed6565b9392505050565b5f604082019050611f1f5f83018561163e565b611f2c602083018461163e565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215611f7557611f7461156b565b5b5f611f82848285016115b9565b91505092915050565b5f819050919050565b5f819050919050565b5f611fb7611fb2611fad84611f8b565b611f94565b6115cd565b9050919050565b611fc781611f9d565b82525050565b5f819050919050565b5f611ff0611feb611fe684611fcd565b611f94565b6115cd565b9050919050565b61200081611fd6565b82525050565b5f6040820190506120195f830185611fbe565b6120266020830184611ff7565b9392505050565b5f6020820190506120405f830184611ed6565b92915050565b5f6080820190506120595f830187611ed6565b612066602083018661163e565b612073604083018561163e565b612080606083018461163e565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6120c0826115cd565b91506120cb836115cd565b92508282019050808211156120e3576120e2612089565b5b92915050565b5f6040820190508181035f8301526121018185611c20565b905081810360208301526121158184611c20565b90509392505050565b5f81519050919050565b5f82825260208201905092915050565b5f6121428261211e565b61214c8185612128565b935061215c818560208601611733565b61216581611741565b840191505092915050565b5f60a0820190506121835f830188611ed6565b6121906020830187611ed6565b61219d604083018661163e565b6121aa606083018561163e565b81810360808301526121bc8184612138565b90509695505050505050565b5f815190506121d681611691565b92915050565b5f602082840312156121f1576121f061156b565b5b5f6121fe848285016121c8565b91505092915050565b5f60a08201905061221a5f830188611ed6565b6122276020830187611ed6565b81810360408301526122398186611c20565b9050818103606083015261224d8185611c20565b905081810360808301526122618184612138565b9050969550505050505056fea2646970667358221220aa72f9deb25a4e1dc7c497081b00867bfc8ffe921c235e033dbc57098b2eb1c164736f6c63430008190033697066733a2f2f516d5159726e4159676633486d664c54537079435338677331507a724c6a375071764d79785a69774c4770505234