LyoKIElNUE9SVEFOVDogIFRoaXMgQXBwbGUgc29mdHdhcmUgaXMgc3VwcGxpZWQgdG8geW91IGJ5IEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBpbgogY29uc2lkZXJhdGlvbiBvZiB5b3VyIGFncmVlbWVudCB0byB0aGUgZm9sbG93aW5nIHRlcm1zLCBhbmQgeW91ciB1c2UsIGluc3RhbGxhdGlvbiwKIG1vZGlmaWNhdGlvbiBvciByZWRpc3RyaWJ1dGlvbiBvZiB0aGlzIEFwcGxlIHNvZnR3YXJlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlc2UKIHRlcm1zLiAgSWYgeW91IGRvIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zLCBwbGVhc2UgZG8gbm90IHVzZSwgaW5zdGFsbCwgbW9kaWZ5IG9yCiByZWRpc3RyaWJ1dGUgdGhpcyBBcHBsZSBzb2Z0d2FyZS4KCiBJbiBjb25zaWRlcmF0aW9uIG9mIHlvdXIgYWdyZWVtZW50IHRvIGFiaWRlIGJ5IHRoZSBmb2xsb3dpbmcgdGVybXMsIGFuZCBzdWJqZWN0IHRvIHRoZXNlCiB0ZXJtcywgQXBwbGUgZ3JhbnRzIHlvdSBhIHBlcnNvbmFsLCBub24tZXhjbHVzaXZlIGxpY2Vuc2UsIHVuZGVyIEFwcGxl1XMgY29weXJpZ2h0cyBpbgogdGhpcyBvcmlnaW5hbCBBcHBsZSBzb2Z0d2FyZSAodGhlICJBcHBsZSBTb2Z0d2FyZSIpLCB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5IGFuZAogcmVkaXN0cmlidXRlIHRoZSBBcHBsZSBTb2Z0d2FyZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGluIHNvdXJjZSBhbmQvb3IgYmluYXJ5CiBmb3JtczsgcHJvdmlkZWQgdGhhdCBpZiB5b3UgcmVkaXN0cmlidXRlIHRoZSBBcHBsZSBTb2Z0d2FyZSBpbiBpdHMgZW50aXJldHkgYW5kIHdpdGhvdXQKIG1vZGlmaWNhdGlvbnMsIHlvdSBtdXN0IHJldGFpbiB0aGlzIG5vdGljZSBhbmQgdGhlIGZvbGxvd2luZyB0ZXh0IGFuZCBkaXNjbGFpbWVycyBpbiBhbGwKIHN1Y2ggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBBcHBsZSBTb2Z0d2FyZS4gIE5laXRoZXIgdGhlIG5hbWUsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MKIG9yIGxvZ29zIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KIHRoZSBBcHBsZSBTb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBmcm9tIEFwcGxlLiBFeGNlcHQgYXMgZXhwcmVzc2x5CiBzdGF0ZWQgaW4gdGhpcyBub3RpY2UsIG5vIG90aGVyIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcyBvciBpbXBsaWVkLCBhcmUgZ3JhbnRlZCBieSBBcHBsZQogaGVyZWluLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzIHRoYXQgbWF5IGJlIGluZnJpbmdlZCBieSB5b3VyCiBkZXJpdmF0aXZlIHdvcmtzIG9yIGJ5IG90aGVyIHdvcmtzIGluIHdoaWNoIHRoZSBBcHBsZSBTb2Z0d2FyZSBtYXkgYmUgaW5jb3Jwb3JhdGVkLgoKIFRoZSBBcHBsZSBTb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBBcHBsZSBvbiBhbiAiQVMgSVMiIGJhc2lzLiAgQVBQTEUgTUFLRVMgTk8gV0FSUkFOVElFUywKIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE5PTi1JTkZSSU5HRU1FTlQsCiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEFQUExFIFNPRlRXQVJFIE9SIElUUwogVVNFIEFORCBPUEVSQVRJT04gQUxPTkUgT1IgSU4gQ09NQklOQVRJT04gV0lUSCBZT1VSIFBST0RVQ1RTLgoKIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNULCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwKIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTCiAgICAgICAgICBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFLAogUkVQUk9EVUNUSU9OLCBNT0RJRklDQVRJT04gQU5EL09SIERJU1RSSUJVVElPTiBPRiBUSEUgQVBQTEUgU09GVFdBUkUsIEhPV0VWRVIgQ0FVU0VEIEFORAogV0hFVEhFUiBVTkRFUiBUSEVPUlkgT0YgQ09OVFJBQ1QsIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFKSwgU1RSSUNUIExJQUJJTElUWSBPUgogT1RIRVJXSVNFLCBFVkVOIElGIEFQUExFIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogKi8KCiNpZm5kZWYgUGx1Z2luT2JqZWN0X19ERUZJTkVECiNkZWZpbmUgUGx1Z2luT2JqZWN0X19ERUZJTkVECgojaW5jbHVkZSAibWFpbi5oIgojaW5jbHVkZSA8am5pLmg+CgpjbGFzcyBTdWJQbHVnaW4gewpwdWJsaWM6CiAgICBTdWJQbHVnaW4oTlBQIGluc3QpIDogbV9pbnN0KGluc3QpIHt9CiAgICB2aXJ0dWFsIH5TdWJQbHVnaW4oKSB7fQogICAgdmlydHVhbCBpbnQxNiBoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSA9IDA7CiAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydHNEcmF3aW5nTW9kZWwoQU5QRHJhd2luZ01vZGVsKSA9IDA7CgogICAgTlBQIGluc3QoKSBjb25zdCB7IHJldHVybiBtX2luc3Q7IH0KCnByaXZhdGU6CiAgICBOUFAgbV9pbnN0Owp9OwoKY2xhc3MgU3VyZmFjZVN1YlBsdWdpbiA6IHB1YmxpYyBTdWJQbHVnaW4gewpwdWJsaWM6CiAgICBTdXJmYWNlU3ViUGx1Z2luKE5QUCBpbnN0KSA6IFN1YlBsdWdpbihpbnN0KSB7fQogICAgdmlydHVhbCB+U3VyZmFjZVN1YlBsdWdpbigpIHt9CiAgICB2aXJ0dWFsIGJvb2wgaXNGaXhlZFN1cmZhY2UoKSA9IDA7CiAgICB2aXJ0dWFsIHZvaWQgc3VyZmFjZUNyZWF0ZWQoam9iamVjdCkgPSAwOwogICAgdmlydHVhbCB2b2lkIHN1cmZhY2VDaGFuZ2VkKGludCBmb3JtYXQsIGludCB3aWR0aCwgaW50IGhlaWdodCkgPSAwOwogICAgdmlydHVhbCB2b2lkIHN1cmZhY2VEZXN0cm95ZWQoKSA9IDA7Cn07CgplbnVtIFBsdWdpblR5cGVzIHsKICAgIGtBbmltYXRpb25fUGx1Z2luVHlwZSAgPSAxLAogICAga0F1ZGlvX1BsdWdpblR5cGUgICAgICA9IDIsCiAgICBrQmFja2dyb3VuZF9QbHVnaW5UeXBlID0gMywKICAgIGtGb3JtX1BsdWdpblR5cGUgICAgICAgPSA0LAogICAga1RleHRfUGx1Z2luVHlwZSAgICAgICA9IDUsCiAgICBrUGFpbnRfUGx1Z2luVHlwZSAgICAgID0gNiwKICAgIGtWaWRlb19QbHVnaW5UeXBlICAgICAgPSA3LAp9Owp0eXBlZGVmIHVpbnQzMl90IFBsdWdpblR5cGU7Cgp0eXBlZGVmIHN0cnVjdCBQbHVnaW5PYmplY3QgewogICAgTlBPYmplY3QgaGVhZGVyOwogICAgTlBQIG5wcDsKICAgIE5QV2luZG93KiB3aW5kb3c7CgogICAgUGx1Z2luVHlwZSBwbHVnaW5UeXBlOwogICAgU3ViUGx1Z2luKiBhY3RpdmVQbHVnaW47Cgp9IFBsdWdpbk9iamVjdDsKCk5QQ2xhc3MgKmdldFBsdWdpbkNsYXNzKHZvaWQpOwoKI2VuZGlmIC8vIFBsdWdpbk9iamVjdF9fREVGSU5FRAo=