ClJFQURNRSBmb3IgdGhlIGJ1aWxkcy9hbWlnYSBzdWJkaXJlY3RvcnkuCgpDb3B5cmlnaHQgMjAwNSBieQpXZXJuZXIgTGVtYmVyZyBhbmQgRGV0bGVmIFf8cmtuZXIuCgpUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAphbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCkxJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91CmluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0CmZ1bGx5LgoKClRoZSBtYWtlZmlsZS5vczQgaXMgZm9yIHRoZSBBbWlnYU9TNCBTREsuICBUbyB1c2UgaXQsIHR5cGUKIm1ha2UgLWYgbWFrZWZpbGUub3M0IiwgaXQgcHJvZHVjZXMgYSBsaW5rIGxpYnJhcnkgbGliZnQyX3BwYy5hLgoKVGhlIG1ha2VmaWxlIGlzIGZvciBwcGMtbW9ycGhvcy1nY2MtMi45NS4zLWJpbi50Z3ogKGdjYyAyLjk1LjMgaG9zdGVkIG9uCjY4ay1BbWlnYSBwcm9kdWNpbmcgTW9ycGhPUy1QUEMtYmluYXJpZXMgZnJvbSBodHRwOi8vd3d3Lm1vcnBob3MuZGUpLgpUbyB1c2UgaXQsIHR5cGUgIm1ha2UgYXNzaWduIiwgdGhlbiAibWFrZSI7IGl0IHByb2R1Y2VzIGEgbGluayBsaWJyYXJ5CmxpYmZ0Ml9wcGMuYS4KClRoZSBzbWFrZWZpbGUgaXMgYSBtYWtlZmlsZSBmb3IgQW1pZ2EgU0FTL0MgNi41OCAobm8gbG9uZ2VyIGF2YWlsYWJsZSwKbGF0ZXN0IHNvbGQgdmVyc2lvbiB3YXMgNi41MCwgdXBkYXRlcyBjYW4gYmUgZm91bmQgaW4gQW1pbmV0KS4gIEl0IGlzCmJhc2VkIG9uIHRoZSB2ZXJzaW9uIGZvdW5kIGluIHRoZSBzb3VyY2Vjb2RlIG9mIHR0Zi5saWJyYXJ5IDAuODNiIGZvcgpGcmVlVHlwZSAxLjMuMSBmcm9tIFJpY2hhcmQgR3JpZmZpdGggKHJhZ3JpZmZpQHNwcnluZXQuY29tLApodHRwOi8vcmFncmlmZmkuaG9tZS5zcHJ5bmV0LmNvbSkuCgpZb3Ugd2lsbCBhbHNvIG5lZWQgdGhlIGxhdGVzdCBpbmNsdWRlIGZpbGVzIGFuZCBhbWlnYS5saWIgZnJvbSB0aGUKQW1pZ2Egd2ViIHNpdGUgKGh0dHA6Ly93d3cuYW1pZ2EuY29tLzMuOS9kb3dubG9hZC9OREszLjkubGhhKSBmb3IKQW1pZ2FPUyAzLjk7IHRoZSBnZW5lcmF0ZWQgY29kZSBzaG91bGQgd29yayB1bmRlciBBbWlnYU9TIDIuMDQgYW5kIHVwLgoKVG8gdXNlIGl0LCBjYWxsICJzbWFrZSBhc3NpZ24iIGFuZCB0aGVuICJzbWFrZSIgZnJvbSB0aGUgYnVpbGRzL2FtaWdhCmRpcmVjdG9yeS4gIFRoZSByZXN1bHRzIGFyZToKCi0gQSBsaW5rIGxpYnJhcnkgImZ0Ml82ODB4MC5saWIiICh3aGVyZSB4IGRlcGVuZHMgb24gdGhlIHNldHRpbmcgb2YKICB0aGUgQ1BVIGVudHJ5IGluIHRoZSBzbWFrZWZpbGUpIGNvbnRhaW5pbmcgYWxsIEZyZWVUeXBlMiBwYXJ0cwogIGV4Y2VwdCBvZiB0aGUgaW5pdCBjb2RlLCBkZWJ1Z2dpbmcgY29kZSwgYW5kIHRoZSBzeXN0ZW0gaW50ZXJmYWNlCiAgY29kZS4KCi0gZnRzeXN0ZW0ubywgYW4gb2JqZWN0IG1vZHVsZSBjb250YWluaW5nIHRoZSBzdGFuZGFyZCB2ZXJzaW9uIG9mIHRoZQogIHN5c3RlbSBpbnRlcmZhY2UgY29kZSB3aGljaCB1c2VzIGZvcGVuKCkgZmNsb3NlKCkgZnJlYWQoKSBmc2VlaygpCiAgZnRlbGwoKSBtYWxsb2MoKSByZWFsbG9jKCkgYW5kIGZyZWUoKSBmcm9tIGxpYjpzYy5saWIgKG5vdCBwdXJlKS4KCi0gZnRzeXN0ZW1wdXJlLm8sIGFuIG9iamVjdCBtb2R1bGUgY29udGFpbmluZyB0aGUgcHVyZSB2ZXJzaW9uIG9mIHRoZQogIHN5c3RlbSBpbnRlcmZhY2UgY29kZSB3aGljaCB1c2VzIE9wZW4oKSBDbG9zZSgpIFJlYWQoKSBTZWVrKCkKICBFeGFtaW5lRkgoKSBBc21BbGxvY1Bvb2xlZCgpIEFzbUZyZWVQb29sZWQoKSBldGMuICBUaGlzIHZlcnNpb24gY2FuCiAgYmUgdXNlZCBpbiBib3RoIG5vcm1hbCBwcm9ncmFtcyBhbmQgaW4gQW1pZ2EgcnVuLXRpbWUgc2hhcmVkIHN5c3RlbQogIGxpYnJhcnlzIChjYW4gYmUgbGlua2VkIHdpdGggbGliOmxpYmluaXQubywgbm8gY29weWluZyBvZiBEQVRBIGFuZAogIEJTUyBodW5rcyBmb3IgZWFjaCBPcGVuTGlicmFyeSgpIG5lY2Vzc2FyeSkuICBTb3VyY2UgY29kZSBpcyBpbgogIHNyYy9iYXNlL2Z0c3lzdGVtLmMuCgotIGZ0ZGVidWcubywgYW4gb2JqZWN0IG1vZHVsZSBjb250YWluaW5nIHRoZSBzdGFuZGFyZCB2ZXJzaW9uIG9mIHRoZQogIGRlYnVnZ2luZyBjb2RlIHdoaWNoIHVzZXMgdnByaW50ZigpIGFuZCBleGl0KCkgKG5vdCBwdXJlKS4KICBEZWJ1Z2dpbmcgY2FuIGJlIHR1cm5lZCBvbiBpbiBGVDppbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oCiAgYW5kIHdpdGggRlRfU2V0VHJhY2VMZXZlbCgpLgoKLSBmdGRlYnVncHVyZS5vLCBhbiBvYmplY3QgbW9kdWxlIGNvbnRhaW5pbmcgdGhlIHB1cmUgdmVyc2lvbiBvZiB0aGUKICBkZWJ1Z2dpbmcgY29kZSB3aGljaCB1c2VzIEtWUHJpbnRmKCkgZnJvbSBsaWI6ZGVidWcubGliIGFuZCBubwogIGV4aXQoKS4gIEZvciBkZWJ1Z2dpbmcgb2YgQW1pZ2EgcnVuLXRpbWUgc2hhcmVkIHN5c3RlbSBsaWJyYXJpZXMuIAogIFNvdXJjZSBjb2RlIGlzIGluIHNyYy9iYXNlL2Z0ZGVidWcuYy4KCi0gTk8gZnRpbml0Lm8uICBCZWNhdXNlIGxpbmtpbmcgd2l0aCBhIGxpbmsgbGlicmFyeSBzaG91bGQgcmVzdWx0IGluCiAgbGlua2luZyBvbmx5IHRoZSBuZWVkZWQgb2JqZWN0IG1vZHVsZXMgaW4gaXQsIGJ1dCBzdGFuZGFyZAogIGZ0c3lzdGVtLm8gd291bGQgZm9yY2UgQUxMIEZyZWVUeXBlMiBtb2R1bGVzIHRvIGJlIGxpbmtlZCB0byB5b3VyCiAgcHJvZ3JhbSwgSSBkZWNpZGVkIHRvIHVzZSBhIGRpZmZlcmVudCBzY2hlbWU6IFlvdSBtdXN0ICNpbmNsdWRlCiAgRlQ6c3JjL2Jhc2UvZnRpbml0LmMgaW4geW91ciBzb3VyY2Vjb2RlIGFuZCBzcGVjaWZ5IHdpdGggI2RlZmluZQogIHN0YXRlbWVudHMgd2hpY2ggbW9kdWxlcyB5b3UgbmVlZC4gIFNlZQogIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0bW9kdWxlLmguCgoKVG8gdXNlIGluIHlvdXIgb3duIHByb2dyYW1zOgoKLSBJbnNlcnQgdGhlICNkZWZpbmUgYW5kICNpbmNsdWRlIHN0YXRlbWVudHMgZnJvbSB0b3Agb2YKICBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG1vZHVsZS5oIGluIHlvdXIgc291cmNlIGNvZGUgYW5kIHVuY29tbWVudAogIHRoZSAjZGVmaW5lIHN0YXRlbWVudHMgZm9yIHRoZSBGcmVlVHlwZTIgbW9kdWxlcyB5b3UgbmVlZC4KCi0gWW91IGNhbiB1c2UgZWl0aGVyIFBBUkFNRVRFUlM9UkVHSVNURVIgb3IgUEFSQU1FVEVSUz1TVEFDSyBmb3IKICBjYWxsaW5nIHRoZSBGcmVlVHlwZTIgZnVuY3Rpb25zLCBiZWNhdXNlIHRoZSBsaW5rIGxpYnJhcnkgYW5kIHRoZQogIG9iamVjdCBmaWxlcyBhcmUgY29tcGlsZWQgd2l0aCBQQVJBTUVURVJTPUJPVEguCgotICJzbWFrZSBhc3NpZ24iIChhc3NpZ24gIkZUOiIgdG8gdGhlIEZyZWVUeXBlMiBtYWluIGRpcmVjdG9yeSkuCgotIENvbXBpbGUgeW91ciBwcm9ncmFtLgoKLSBMaW5rIHdpdGggZWl0aGVyIGZ0c3lzdGVtLm8gb3IgZnRzeXN0ZW1wdXJlLm8sIGlmIGRlYnVnZ2luZyBlbmFibGVkCiAgd2l0aCBlaXRoZXIgZnRkZWJ1Zy5vIG9yIChmdGRlYnVncHVyZS5vIGFuZCBsaWI6ZGVidWcubGliKSwgYW5kIHdpdGgKICBmdDJfNjgweDAubGliIGFzIGxpbmsgbGlicmFyeS4KCgpUbyBhZGFwdCB0byBvdGhlciBjb21waWxlcnM6CgotIFRoZSBzdGFuZGFyZCBBTlNJIEMgbWF4aW11bSBsZW5ndGggb2YgMzEgc2lnbmlmaWNhbnQgY2hhcmFjdGVycyBpbgogIGlkZW50aWZpZXJzIGlzIG5vdCBlbm91Z2ggZm9yIEZyZWVUeXBlMi4gIENoZWNrIGlmIHlvdXIgY29tcGlsZXIgaGFzCiAgYSBtaW5pbXVtIGxlbmd0aCBvZiA0MCBzaWduaWZpY2FudCBjaGFyYWN0ZXJzIG9yIGNhbiBiZSBzd2l0Y2hlZCB0bwogIGl0LiAgImlkbGVuPTQwIiBpcyB0aGUgb3B0aW9uIGZvciBTQVMvQy4gIFNldHRpbmcgI2RlZmluZQogIEhBVkVfTElNSVRfT05fSURFTlRTIGluIGFuIGluY2x1ZGUgZmlsZSBtYXkgYWxzbyB3b3JrIChub3QgdGVzdGVkKS4KCi0gTWFrZSBzdXJlIHRoYXQgdGhlIGluY2x1ZGUgZGlyZWN0b3J5IGluIGJ1aWxkcy9hbWlnYSBpcyBzZWFyY2hlZAogIGJlZm9yZSB0aGUgbm9ybWFsIEZyZWVUeXBlMiBpbmNsdWRlIGRpcmVjdG9yeSwgc28geW91IGFyZSBhYmxlIHRvCiAgcmVwbGFjZSBwcm9ibGVtYXRpYyBpbmNsdWRlIGZpbGVzIHdpdGggeW91ciBvd24gdmVyc2lvbiAoc2FtZSBtYXkgYmUKICB1c2VmdWwgZm9yIHRoZSBzcmMgZGlyZWN0b3J5KS4KCi0gQW4gZXhhbXBsZSBvZiBob3cgdG8gcmVwbGFjZS93b3JrYXJvdW5kIGEgcHJvYmxlbWF0aWMgaW5jbHVkZSBmaWxlCiAgaXMgaW5jbHVkZS9jb25maWcvZnRjb25maWcuaDsgaXQgY2hhbmdlcyBhICNkZWZpbmUgdGhhdCB3b3VsZAogIHByZXZlbnQgU0FTL0MgZnJvbSBnZW5lcmF0aW5nIFhERUYncyB3aGVyZSBpdCBzaG91bGQgZG8gdGhhdCBhbmQKICB0aGVuIGluY2x1ZGVzIHRoZSBzdGFuZGFyZCBGcmVlVHlwZTIgaW5jbHVkZSBmaWxlLgoKTG9jYWwgVmFyaWFibGVzOgpjb2Rpbmc6IGxhdGluLTEKRW5kOgo=