CSAgICAgICBSRUFETUUgZmlsZSBmb3IgbmV0LXNubXAgVmVyc2lvbjogNS43LjMucmMyCgpESVNDTEFJTUVSCgogIFRoZSBBdXRob3JzIGFzc3VtZSBubyByZXNwb25zaWJpbGl0eSBmb3IgZGFtYWdlIG9yIGxvc3Mgb2Ygc3lzdGVtCiAgcGVyZm9ybWFuY2UgYXMgYSBkaXJlY3Qgb3IgaW5kaXJlY3QgcmVzdWx0IG9mIHRoZSB1c2Ugb2YgdGhpcwogIHNvZnR3YXJlLiAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvcgogIGltcGxpZWQgd2FycmFudHkuCgpUQUJMRSBPRiBDT05URU5UUwoKICBEaXNjbGFpbWVyCiAgVGFibGUgT2YgQ29udGVudHMKICBJbnRyb2R1Y3Rpb24KKiBTdXBwb3J0ZWQgQXJjaGl0ZWN0dXJlcwogIEF2YWlsYWJpbGl0eQogIFdlYiBQYWdlCiogSW5zdGFsbGF0aW9uCiAgQ29weWluZyBBbmQgQ29weXJpZ2h0cwoqIEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zCiAgSGVscGluZyBPdXQKKiBDb2RlIFVwZGF0ZSBBbm5vdW5jZW1lbnRzCiogTWFpbGluZyBMaXN0cwogIEFnZW50IEV4dGVuc2liaWxpdHkKICBFeGFtcGxlIEFnZW50IENvbmZpZ3VyYXRpb24gYW5kIFVzYWdlCiAgQ29uZmlndXJhdGlvbgogIFN1Ym1pdHRpbmcgQnVnIFJlcG9ydHMKICBDbG9zaW5nCiAgVGhhbmtzCgogICogPSBSZXF1aXJlZCBSZWFkaW5nLgoKSU5UUk9EVUNUSU9OCgogIFRoaXMgcGFja2FnZSB3YXMgb3JpZ2luYWxseSBiYXNlZCBvbiB0aGUgQ01VIDIuMS4yLjEgc25tcCBjb2RlLiAgSXQKICBoYXMgYmVlbiBncmVhdGx5IG1vZGlmaWVkLCByZXN0cnVjdHVyZWQsIGVuaGFuY2VkIGFuZCBmaXhlZC4gIEl0CiAgaGFyZGx5IGxvb2tzIHRoZSBzYW1lIGFzIGFueXRoaW5nIHRoYXQgQ01VIGhhcyBldmVyIHJlbGVhc2VkLiAgSXQKICB3YXMgcmVuYW1lZCBmcm9tIGNtdS1zbm1wIHRvIHVjZC1zbm1wIGluIDE5OTUgYW5kIGxhdGVyIHJlbmFtZWQgZnJvbQogIHVjZC1zbm1wIHRvIG5ldC1zbm1wIGluIE5vdmVtYmVyIDIwMDAuCgogIFRoaXMgUkVBRE1FIGZpbGUgc2VydmVzIGFzIGEgc3RhcnRpbmcgcGxhY2UgdG8gbGVhcm4gYWJvdXQgdGhlCiAgcGFja2FnZSwgYnV0IHZlcnkgbGl0dGxlIG9mIHRoZSBkb2N1bWVudGF0aW9uIGlzIGNvbnRhaW5lZCB3aXRoaW4KICB0aGlzIGZpbGUuICBUaGUgRkFRIGlzIGFuIGV4Y2VsbGVudCBwbGFjZSB0byBzdGFydCBhcyB3ZWxsLgogIEFkZGl0aW9uYWxseSwgdGhlcmUgYXJlIGEgYnVuY2ggb2YgUkVBRE1FIGZpbGVzIGZvciBzcGVjaWZpYwogIGFyY2hpdGVjdHVyZXMgYW5kIHNwZWNpZmljIGZlYXR1cmVzLiAgWW91IG1pZ2h0IHdpc2ggdG8gbG9vayBhdCBzb21lCiAgb2YgdGhlc2Ugb3RoZXIgZmlsZXMgYXMgd2VsbC4KClNVUFBPUlRFRCBBUkNISVRFQ1RVUkVTCgogIFBsZWFzZSBzZWUgdGhlIEZBUSBmb3IgdGhpcyBpbmZvcm1hdGlvbi4KCiAgUGxlYXNlIGxldCB1cyBrbm93IGlmIHlvdSBjb21waWxlIGl0IG9uIG90aGVyIE9TIHZlcnNpb25zIGFuZCBpdAogIHdvcmtzIGZvciB5b3Ugc28gd2UgY2FuIGFkZCB0aGVtIHRvIHRoZSBhYm92ZSBsaXN0LgoKICBQb3J0aW5nOiAgUGxlYXNlISByZWFkIHRoZSBQT1JUSU5HIGZpbGUuCgogIEFsc28gbm90ZSB0aGF0IG1hbnkgYXJjaGl0ZWN0dXJlIGhhdmUgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIFJFQURNRQogIGZpbGVzLCBzbyB5b3Ugc2hvdWxkIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBvbmUgYXBwcm9wcmlhdGUgdG8KICB5b3VyIHBsYXRmb3JtLgoKQVZBSUxBQklMSVRZCgogIERvd25sb2FkOgogICAgLSBodHRwOi8vd3d3Lm5ldC1zbm1wLm9yZy9kb3dubG9hZC8KICAgIC0gZnRwOi8vZnRwLm5ldC1zbm1wLm9yZy9wdWIvc291cmNlZm9yZ2UvbmV0LXNubXAvCiAgV2ViIHBhZ2U6CiAgICAtIGh0dHA6Ly93d3cubmV0LXNubXAub3JnLwogIFByb2plY3QgV2lraToKICAgIC0gaHR0cDovL3d3dy5uZXQtc25tcC5vcmcvd2lraS8KICBTb3VyY2Vmb3JnZSBQcm9qZWN0IHBhZ2U6CiAgICAtIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbmV0LXNubXAKICBNaXJyb3JzOgogICAgLSBVUzogICAgICAgIGZ0cDovL2Z0cC5mcmVlc25tcC5jb20vbWlycm9ycy9uZXQtc25tcC8KCiAgVGhlIG9sZCB1Y2Qtc25tcC51Y2RhdmlzLmVkdSB3ZWIgc2l0ZSBhbmQgZnRwIHNlcnZlciBpcyBub3cKICBvZmZsaW5lIGFuZCBzaG91bGQgbm90IGJlIGFjY2Vzc2VkIGFueSBsb25nZXIuCgpXRUIgUEFHRVMKCiAgaHR0cDovL3d3dy5uZXQtc25tcC5vcmcvCiAgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9uZXQtc25tcAogIGh0dHA6Ly93d3cubmV0LXNubXAub3JnL3dpa2kvCgpJTlNUQUxMQVRJT04KCiAgU2VlIHRoZSBJTlNUQUxMIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHBhY2thZ2UuCgpDT1BZSU5HIEFORCBDT1BZUklHSFRTCgogIFNlZSB0aGUgQ09QWUlORyBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyBwYWNrYWdlLgoKRlJFUVVFTlRMWSBBU0tFRCBRVUVTVElPTlMKCiAgU2VlIHRoZSBGQVEgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgcGFja2FnZS4KICBUaGlzIGlzIGFsc28gYXZhaWxhYmxlIG9uIHRoZSBwcm9qZWN0IFdpa2kgYXQKCiAgICAgaHR0cDovL3d3dy5uZXQtc25tcC5vcmcvd2lraS9pbmRleC5waHAvRkFRCgogIHNvIHRoYXQgdGhlIHdpZGVyIE5ldC1TTk1QIGNvbW11bml0eSBjYW4gaGVscCBtYWludGFpbiBpdCEKCkhFTFBJTkcgT1VUCgogIFRoaXMgaXMgYSBwcm9qZWN0IHdvcmtlZCBvbiBieSBwZW9wbGUgYXJvdW5kIHRoZSBuZXQuICBXZSdkIGxvdmUKICB5b3VyIGhlbHAsIGJ1dCBwbGVhc2UgcmVhZCB0aGUgUE9SVElORyBmaWxlIGZpcnN0LiAgQWxzbywgc3Vic2NyaWJlCiAgdG8gdGhlIG5ldC1zbm1wLWNvZGVycyBsaXN0IGRlc2NyaWJlZCBiZWxvdyBhbmQgbWVudGlvbiB3aGF0IHlvdSdyZQogIGdvaW5nIHRvIHdvcmsgb24gdG8gbWFrZSBzdXJlIG5vIG9uZSBlbHNlIGlzIGFscmVhZHkgZG9pbmcgc28hCiAgWW91J2xsIGFsc28gbmVlZCB0byBrZWVwIHVwIHRvIGRhdGUgd2l0aCB0aGUgbGF0ZXN0IGNvZGUgc25hcCBzaG90LAogIHdoaWNoIGNhbiBiZSBvYnRhaW5lZCBmcm9tIENWUyB1c2luZyB0aGUgaW5mb3JtYXRpb24gZm91bmQgYXQKICBodHRwOi8vd3d3Lm5ldC1zbm1wLm9yZy9jdnMvLgoKICBDb250cmlidXRpb25zIHRvIHRoZSBOZXQtU05NUCBzb3VyY2UgY29kZSBpbiBhbnkgZm9ybSBhcmUgZ3JlYXRseQogIGFwcHJlY2lhdGVkLiAgV2UgZXhwZWN0IHRoZSBwYXJ0aWVzIHByb3ZpZGluZyBzdWNoIGNvbnRyaWJ1dGlvbnMgdG8KICBoYXZlIHRoZSByaWdodCB0byBjb250cmlidXRlIHRoZW0gdG8gdGhlIE5ldC1TTk1QIHByb2plY3Qgb3IgdGhhdAogIHRoZSBwYXJ0aWVzIHRoYXQgZG8gaGF2ZSB0aGUgcmlnaHQgaGF2ZSBkaXJlY3RlZCB0aGUgcGVyc29uCiAgc3VibWl0dGluZyB0aGUgY29udHJpYnV0aW9uIHRvIGRvIHNvLiAgSW4gYWRkaXRpb24sIGFsbCBjb250cmlidXRvcnMKICBuZWVkIHRvIGJlIGF3YXJlIHRoYXQgaWYgdGhlIGNvbnRyaWJ1dGlvbiBpcyBhY2NlcHRlZCBhbmQKICBpbmNvcnBvcmF0ZWQgaW50byB0aGUgTmV0LVNOTVAgcHJvamVjdCwgaXQgd2lsbCBiZSByZWRpc3RyaWJ1dGVkCiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBsaWNlbnNlIGFncmVlbWVudCB1c2VkIGZvciB0aGUgZW50aXJlIGJvZHkgb2YKICB3b3JrIHRoYXQgY29tcHJpc2VzIHRoZSBOZXQtU05NUCBwcm9qZWN0IChzZWUgdGhlIENPUFlJTkcgZmlsZSBmb3IKICBkZXRhaWxzKS4gIElmIHRoaXMgbGljZW5zZSBhZ3JlZW1lbnQgZXZlciBjaGFuZ2VzIHRoZSBjb250cmlidXRpb24KICB3aWxsIGNvbnRpbnVlIHRvIGJlIHJlbGVhc2VkIHVuZGVyIGFueSBuZXcgbGljZW5zZXMgYXMgd2VsbC4gIFRoYW5rCiAgeW91LCBpbiBhZHZhbmNlLCBmb3IgeW91ciBncmFjaW91cyBjb250cmlidXRpb25zLgoKQ09ERSBVUERBVEUgQU5OT1VOQ0VNRU5UUwoKICBTZWUgdGhlIE5FV1MgZmlsZSBhbmQgdGhlIENoYW5nZUxvZyBmaWxlIGZvciBkZXRhaWxzIG9uIHdoYXQgaGFzCiAgY2hhbmdlZCBiZXR3ZWVuIHJlbGVhc2VzLgoKICBXZSBoYXRlIGJyb2FkY2FzdGluZyBhbm5vdW5jZSBtZXNzYWdlcyB0byBvdGhlciBtYWlsaW5nIGxpc3RzIGFuZAogIG5ld3Nncm91cHMsIHNvIHRoZXJlIGlzIGEgbWFpbGluZyBsaXN0IHNldCB1cCB0byBoYW5kbGUgcmVsZWFzZQogIGFubm91bmNlbWVudHMuICBBbnkgdGltZSB3ZSBwdXQgbmV3IHNvZnR3YXJlIG91dCBmb3IgZnRwLCB3ZSdsbCBtYWlsCiAgdGhpcyBmYWN0IHRvIG5ldC1zbm1wLWFubm91bmNlQGxpc3RzLnNvdXJjZWZvcmdlLm5ldC4gIFNlZSB0aGUKICBNQUlMSU5HIExJU1RTIHNlY3Rpb24gZGVzY3JpYmVkIGJlbG93IHRvIHNpZ24gdXAgZm9yIHRoZXNlCiAgYW5ub3VuY2VtZW50cy4KCiAgV2Ugd2lsbCBwb3N0IG5ldyBhbm5vdW5jZW1lbnRzIG9uIGEgdmVyeSBpbmZyZXF1ZW50IGJhc2lzIHRvIHRoZQogIG90aGVyIGNoYW5uZWxzICh0aGUgb3RoZXIgc25tcCBtYWlsaW5nIGxpc3RzIGFuZCBuZXdzZ3JvdXBzIGxpa2UKICBjb21wLnByb3RvY29scy5zbm1wKSwgYnV0IG9ubHkgZm9yIG1ham9yIGNvZGUgcmV2aXNpb25zIGFuZCBub3QgZm9yCiAgYnVnLWZpeCBwYXRjaGVzIG9yIHNtYWxsIGZlYXR1cmUgdXBncmFkZXMuCgpNQUlMSU5HIExJU1RTCgogIFRoZSBsaXN0czoKCiAgICBBIG51bWJlciBvZiBtYWlsaW5nIGxpc3RzIGhhdmUgYmVlbiBjcmVhdGVkIGZvciBzdXBwb3J0IG9mIHRoZSBwcm9qZWN0OgogICAgVGhlIG1haW4gb25lcyBhcmU6CgogICAgICBuZXQtc25tcC1hbm5vdW5jZUBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQgIC0tIEZvciBvZmZpY2lhbCBhbm5vdW5jZW1lbnRzCiAgICAgIG5ldC1zbm1wLXVzZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldCAgICAgLS0gRm9yIHVzYWdlIGRpc2N1c3Npb25zCiAgICAgIG5ldC1zbm1wLWNvZGVyc0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXQgICAgLS0gRm9yIGRldmVsb3BtZW50IGRpc2N1c3Npb25zCgogICAgVGhlIC1jb2RlcnMgbGlzdCBpcyBpbnRlbmRlZCBmb3IgZGlzY3Vzc2lvbiBvbiBkZXZlbG9wbWVudCBvZiBjb2RlCiAgICB0aGF0IHdpbGwgYmUgc2hpcHBlZCBhcyBwYXJ0IG9mIHRoZSBwYWNrYWdlLiAgVGhlIC11c2VycyBsaXN0IGlzCiAgICBmb3IgZ2VuZXJhbCBkaXNjdXNzaW9uIG9uIGNvbmZpZ3VyaW5nIGFuZCB1c2luZyB0aGUgcGFja2FnZSwKICAgIGluY2x1ZGluZyBpc3N1ZXMgd2l0aCBjb2RpbmcgdXNlci1kZXZlbG9wZWQgYXBwbGljYXRpb25zIChjbGllbnRzLAogICAgbWFuYWdlcnMsIE1JQiBtb2R1bGVzLCBldGMpLgoKICAgIFBsZWFzZSBkbyAqTk9UKiBzZW5kIG1lc3NhZ2VzIHRvIGJvdGggLXVzZXJzIGFuZCAtY29kZXJzIGxpc3RzLgogICAgVGhpcyBpcyBjb21wbGV0ZWx5IHVubmVjZXNzYXJ5LCBhbmQgc2ltcGx5IHNlcnZlcyB0byBmdXJ0aGVyCiAgICBvdmVybG9hZCAoYW5kIGFubm95KSB0aGUgY29yZSBkZXZlbG9wbWVudCB0ZWFtLiAgIElmIGluIGRvdWJ0LAogICAganVzdCB1c2UgdGhlIC11c2VycyBsaXN0LgoKCiAgICBUaGUgb3RoZXIgbGlzdHMgb2YgcG9zc2libGUgaW50ZXJlc3QgYXJlOgoKICAgICAgbmV0LXNubXAtY3ZzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldCAgICAgICAtLSBGb3IgY3ZzIHVwZGF0ZSBhbm5vdW5jZW1lbnRzCiAgICAgIG5ldC1zbm1wLWJ1Z3NAbGlzdHMuc291cmNlZm9yZ2UubmV0ICAgICAgLS0gRm9yIEJ1ZyBkYXRhYmFzZSB1cGRhdGUgYW5ub3VuY2VtZW50cwogICAgICBuZXQtc25tcC1wYXRjaGVzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldCAgIC0tIEZvciBQYXRjaCBkYXRhYmFzZSB1cGRhdGUgYW5ub3VuY2VtZW50cwoKICAgIFBsZWFzZSBkbyBOT1QgcG9zdCBtZXNzYWdlcyB0byB0aGVzZSBsaXN0cyAob3IgdG8gdGhlIGFubm91bmNlIGxpc3QgYWJvdmUpLgogICAgQnVnIHJlcG9ydHMgYW5kIFBhdGNoZXMgc2hvdWxkIGJlIHN1Ym1pdHRlZCB2aWEgdGhlIFNvdXJjZSBGb3JnZSB0cmFja2VyCiAgICBzeXN0ZW0uICBTZWUgdGhlIG1haW4gcHJvamVjdCB3ZWIgcGFnZXMgZm9yIGRldGFpbHMuCgogICAgVG8gc3Vic2NyaWJlIHRvIGFueSBvZiB0aGVzZSBsaXN0cywgcGxlYXNlIHNlZToKICAKICAgICAgaHR0cDovL3d3dy5uZXQtc25tcC5vcmcvbGlzdHMvCgoKICBBcmNoaXZlczoKICAgIFRoZSBhcmNoaXZlcyBmb3IgdGhlc2UgbWFpbGluZyBsaXN0cyBjYW4gYmUgZm91bmQgYnkgZm9sbG93aW5nIGxpbmtzIGF0CgogICAgICBodHRwOi8vd3d3Lm5ldC1zbm1wLm9yZy9saXN0cy8KCkFHRU5UIEVYVEVOU0lCSUxJVFkKCiAgVGhlIGFnZW50IHRoYXQgY29tZXMgd2l0aCB0aGlzIHBhY2thZ2UgaXMgZXh0ZW5zaWJsZSB0aHJvdWdoIHVzZSBvZgogIHNoZWxsIHNjcmlwdHMgYW5kIG90aGVyIG1ldGhvZHMuICBTZWUgdGhlIGNvbmZpZ3VyYXRpb24gbWFudWFsIHBhZ2VzCiAgKGxpa2Ugc25tcGQuY29uZikgYW5kIHJ1biB0aGUgc25tcGNvbmYgcGVybCBzY3JpcHQgZm9yIGZ1cnRoZXIgZGV0YWlscy4KCiAgWW91IGNhbiBhbHNvIGV4dGVuZCB0aGUgYWdlbnQgYnkgd3JpdGluZyBDIGNvZGUgZGlyZWN0bHkuICBUaGUgYWdlbnQKICBpcyBleHRyZW1lbHkgbW9kdWxhciBpbiBuYXR1cmUgYW5kIHlvdSBuZWVkIG9ubHkgY3JlYXRlIG5ldyBmaWxlcywKICByZS1ydW4gY29uZmlndXJlIGFuZCByZS1jb21waWxlIChvciBsaW5rIGFnYWluc3QgaXRzIGxpYnJhcmllcykuICBObwogIG1vZGlmaWNhdGlvbiBvZiB0aGUgZGlzdHJpYnV0ZWQgc291cmNlIGZpbGVzIGFyZSBuZWNlc3NhcnkuICBTZWUgdGhlCiAgZm9sbG93aW5nIGZpbGVzIGZvciBkZXRhaWxzIG9uIGhvdyB0byBnbyBhYm91dCB0aGlzOgogIGh0dHA6Ly93d3cubmV0LXNubXAub3JnL3R1dG9yaWFsLTUvdG9vbGtpdC8sCiAgYWdlbnQvbWliZ3JvdXAvZXhhbXBsZXMvKi5jCgogIEFsc28sIHNlZSB0aGUgbG9jYWwvbWliMmMgcHJvZ3JhbSBhbmQgaXRzIFJFQURNRSBmaWxlIGZvciBoZWxwIGluCiAgdHVybmluZyBhIHRleHR1YWwgbWliIGRlc2NyaXB0aW9uIGludG8gYSBDIGNvZGUgdGVtcGxhdGUuCgogIFdlIG5vdyBzdXBwb3J0IEFnZW50WCBmb3Igc3ViYWdlbnQgZXh0ZW5zaWJpbGl0eS4gIFRoZSBuZXQtc25tcAogIGFnZW50IGNhbiBydW4gYXMgYm90aCBhIG1hc3RlciBhZ2VudCBhbmQgYSBzdWJhZ2VudC4gIEFkZGl0aW9uYWxseSwKICBhIHRvb2xraXQgaXMgcHJvdmlkZWQgdGhhdCBlbmFibGVzIHVzZXJzIG9mIGl0IHRvIGVhc2lseSBlbWJlZCBhCiAgYWdlbnR4IGNsaWVudCBpbnRvIGV4dGVybmFsIGFwcGxpY2F0aW9ucy4gIFNlZSB0aGUgdHV0b3JpYWwgYXQKICBodHRwOi8vd3d3Lm5ldC1zbm1wLm9yZy90dXRvcmlhbC01L3Rvb2xraXQvIGZvciBhbiBleGFtcGxlIG9mIGhvdwogIGdvIGFib3V0IGRvaW5nIHRoaXMuCgpDT05GSUdVUkFUSU9OCgogIFNlZSB0aGUgbWFuL3NubXAuY29uZi41IG1hbnVhbCBwYWdlLgoKICBGb3IgdGhlIGFnZW50LCBhZGRpdGlvbmFsbHkgc2VlIHRoZSBtYW4vc25tcGQuY29uZi41IG1hbnVhbCBwYWdlLgoKICBGb3IgdGhlIHNubXB0cmFwZCwgc2VlIHRoZSBtYW4vc25tcHRyYXBkLmNvbmYuNSBtYW51YWwgcGFnZS4KCiAgWW91IGNhbiBhbHNvIHJ1biB0aGUgc25tcGNvbmYgcGVybCBzY3JpcHQgdG8gaGVscCB5b3UgY3JlYXRlIHNvbWUgb2YKICB0aGVzZSBmaWxlcy4KClNVQk1JVFRJTkcgQlVHIFJFUE9SVFMKCiAgSW1wb3J0YW50OiAqUGxlYXNlKiBpbmNsdWRlIHdoYXQgdmVyc2lvbiBvZiB0aGUgbmV0LXNubXAgKG9yCiAgdWNkLXNubXApIHBhY2thZ2UgeW91IGFyZSB1c2luZyBhbmQgd2hhdCBhcmNoaXRlY3R1cmUocykgeW91J3JlCiAgdXNpbmcsIGFzIHdlbGwgYXMgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgZXhhY3RseSB3aGF0IGlzIHdyb25nLgoKICBUbyBzdWJtaXQgYSBidWcgcmVwb3J0LCBwbGVhc2UgdXNlIHRoZSB3ZWIgaW50ZXJmYWNlIGF0CiAgaHR0cDovL3d3dy5uZXQtc25tcC5vcmcvYnVncy8uICBJdCBpcyBhIGZ1bGwtZmxlZGdlZAogIGJ1Zy10cmFja2luZyBzeXN0ZW0gdGhhdCB3aWxsIGFsbG93IHlvdSB0byBzZWFyY2ggZm9yIGFscmVhZHkKICBleGlzdGluZyBidWcgcmVwb3J0cyBhcyB3ZWxsIGFzIHRyYWNrIHRoZSBzdGF0dXMgb2YgeW91ciByZXBvcnQgYXMKICBpdCBpcyBwcm9jZXNzZWQgYnkgdGhlIGNvcmUgZGV2ZWxvcGVycy4KCiAgSWYgeW91IGludGVuZCB0byBzdWJtaXQgYSBwYXRjaCBhcyB3ZWxsLCBwbGVhc2UgcmVhZCB0aGUgUE9SVElORwogIGZpbGUgYmVmb3JlIHlvdSBkbyBzbyBhbmQgdGhlbiBzdWJtaXQgaXQgdG8KICBodHRwOi8vd3d3Lm5ldC1zbm1wLm9yZy9wYXRjaGVzLy4KCkNMT1NJTkcKCiAgV2UgbG92ZSBwYXRjaGVzLiAgU2VuZCBzb21lIHRvIHVzISAgQnV0IGJlZm9yZSB5b3UgZG8sIHBsZWFzZSBzZWUKICB0aGUgJ1BPUlRJTkcnIGZpbGUgZm9yIGluZm9ybWF0aW9uIG9uIGhlbHBpbmcgdXMgb3V0IHdpdGggdGhlCiAgcHJvY2VzcyBvZiBpbnRlZ3JhdGluZyB5b3VyIHBhdGNoZXMgKHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdHMgYSBuZXcKICBmZWF0dXJlIGltcGxlbWVudGF0aW9uIG9yIGEgbmV3IHBvcnQpLgoKICBBbHNvLCBXZSdyZSBpbnRlcmVzdGVkIGlmIGFueW9uZSBhY3R1YWxseSB1c2VzL2xpa2VzL2hhdGVzL3doYXRldmVyCiAgdGhpcyBwYWNrYWdlLi4uICBNYWlsIHVzIGEgbm90ZSBhbmQgbGV0IHVzIGtub3cgd2hhdCB5b3UgdGhpbmsgb2YgaXQhCgogIEhhdmUgZnVuIGFuZCBtYXkgaXQgbWFrZSB5b3VyIGxpZmUgZWFzaWVyLAoKICAgIFRoZSBuZXQtc25tcCBkZXZlbG9wZXJzCgpUSEFOS1MKCiAgVGhlIGZvbGxvd2luZyBwZW9wbGUgaGF2ZSBjb250cmlidXRlZCB2YXJpb3VzIHBhdGNoZXMgYW5kCiAgaW1wcm92ZW1lbnRzLiAgVG8gdGhlbSB3ZSBvd2Ugb3VyIGRlZXBlc3QgdGhhbmtzIChhbmQgeW91IGRvIHRvbyEpOgoKICAgIFdlcyBIYXJkYWtlciA8aGFyZGFrZXJAdXNlcnMuc291cmNlZm9yZ2UubmV0PgogICAgU3RldmUgV2FsZGJ1c3NlciA8d2FsZGJ1c3NlckBuZXh0YmVhY29uLmNvbT4KICAgIERhbiBBLiBEaWNrZXkgPGRkaWNrZXlAdHJhbnNpdGlvbi5jb20+CiAgICBEYXZlIFNoaWVsZCA8RC5ULlNoaWVsZEBjc2MubGl2LmFjLnVrPgogICAgR2lvdmFubmkgUy4gTWFyem90IDxnbWFyem90QG5vcnRlbG5ldHdvcmtzLmNvbT4KICAgIE5pZWxzIEJhZ2dlc2VuIDxuYmFAdXNlcnMuc291cmNlZm9yZ2UubmV0PgogICAgU2ltb24gTGVpbmVuIDxzaW1vbkBsaW1tYXQuc3dpdGNoLmNoPgogICAgRGF2aWQgVC4gUGVya2lucyA8ZHBlcmtpbnNAZHNwZXJraW5zLmNvbT4KICAgIE1pa2UgUGVyaWsgPG1pa2VwQGNydC5jb20+CiAgICBTYW5qYWkgTmFyYWluIDxuYXJhaW5AdGh1bXBlci5iZWxsY29yZS5jb20+CiAgICBmcmFuY3VzQG1ldHNueS5kZWxwaGkuY29tCiAgICBHYXJ5IFBhbG1lciA8Z3BhbG1lckBmcmVlYnNkLm9yZz4KICAgIE1hcmMgRy4gRm91cm5pZXIgPHNjcmFwcHlAa2kubmV0PgogICAgR2FyeSBBLiBIYXl3YXJkIDxnYWhAYmVsbGNvcmUuY29tPgogICAgSmVubmlmZXIgQnJheSA8amJyYXlAb3JpZ2luLWF0LmNvLnVrPgogICAgUGhpbGlwIEd1ZW50aGVyIDxndWVudGhlckBnYWMuZWR1PgogICAgRWx3eW4gQiBEYXZpZXMgPGVkYXZpZXNAb3JpZ2luLWF0LmNvLnVrPgogICAgU2ltb24gQnVyZ2UgPHNpbW9uYkB0ZWxzdHJhLmNvbS5hdT4KICAgIERhdmlkIFBhdWwgWmltbWVybWFuIDxkcHpAYXBwbGUuY29tPgogICAgQWxhbiBCYXRpZSA8YmF0aWVAYWFoei5qZi5pbnRlbC5jb20+CiAgICBNaWNoYWVsIERvdWdsYXNzIDxtaWtlZG91Z0B0ZXhhcy5uZXQ+CiAgICBUZWQgUnVsZSA8VGVkX1J1bGVARkxFWFRFQ0guQ08uVUs+CiAgICBDcmFpZyBCZXZpbnMgPGNyYWlnYkBiaXRjb20ubmV0LmF1PgogICAgQXJ0aGVyIEh5dW4gPGFydGh1ckBwc2kuY29tPgogICAgQ3Jpc3RpYW4gRXN0YW4gPENyaXN0aWFuLkVzdGFuQG5ldC51dGNsdWoucm8+CiAgICBFdWdlbmUgUG9sb3ZuaWtvdiA8ZXVnZW5AcmQuemdpay56YXBvcml6aHpoZS51YT4KICAgIEpha29iIEVsbGVyc3RlZHQgPGpha29iQGR5bmFyYy5zZT4KICAgIE1pY2hhZWwgSi4gU2xpZmNhayA8c2xpZkBiZWxsc291dGgubmV0PgogICAgSm9uYXMgT2xzc29uIDxqb2xzc29uQGVydi5lcmljc3Nvbi5zZT4KICAgIEphbWVzIEguIFlvdW5nIDxzeXNqaHlAZ3N1LmVkdT4KICAgIEplZmYgSm9obnNvbiA8amJqQHJlZGhhdC5jb20+CiAgICBNYXJra3UgTGF1a2thbmVuIDxtYXJsYXVra0BzdHliYmEubnRjLm5va2lhLmNvbT4KICAgIERlcmVrIFNpbWtvd2lhayA8ZGVyZWtzQGtkLWRldi5jb20+CiAgICBEYXZpZCBGLiBOZXdtYW4gPGRuZXdtYW5AZXBuZXQuY29tPgogICAgTmljayBBbWF0byA8bmFhbWF0b0BtZXJpdC5lZHU+CiAgICBNaWtlIEJhZXIgPGJhZXJtQGNhbHdlYi5jb20+CiAgICBQYXRyaWNrIExhd3JlbmNlIDxwamxhd3JlbmNlQHVjZGF2aXMuZWR1PgogICAgUnVzcyBNdW5keSA8bXVuZHlAdGlzbGFicy5jb20+CiAgICBPbGFmdXIgR3VkbXVuZHNzb24gPG9ndWRAdGlzbGFicy5jb20+CiAgICBEYXZpZCBSZWVkZXIgPGRyZWVkZXJAdGlzbGFicy5jb20+CiAgICBFZCBMZXdpcyA8bGV3aXNAdGlzbGFicy5jb20+CiAgICBCaWxsIEJhYnNvbiA8d2JhYnNvbkB0aXNsYWJzLmNvbT4KICAgIENocmlzIFNtaXRoIDxjc21pdGhAcGxhdGZvcm0uY29tPgogICAgTWlrZSBNaWNoYXVkIDxtaWtlbWljaGF1ZEBlYXJ0aGxpbmsubmV0PgogICAgQW5keSBIb29kIDxhaG9vZEB3ZXN0cGFjLmNvbS5hdT4KICAgIFJvYmVydCBTdG9yeSA8cnN0b3J5QGZyZWVzbm1wLmNvbT4KICAgIEJlcnQgRHJpZWh1aXMgPGRyaWVodWlzQHBsYXliZWluZy5vcmc+CiAgICBKdWVyZ2VuIFNjaG9lbndhZWxkZXIgPHNjaG9lbndAaWJyLmNzLnR1LWJzLmRlPgogICAgRnJhbmsgU3RyYXVzcyA8c3RyYXVzc0BpYnIuY3MudHUtYnMuZGU+CiAgICBSYWduYXIgS2r4cnN0YWQgPHVjZEByYWduYXJrLnZlc3RkYXRhLm5vPgogICAgSm9jaGVuIEttaWV0c2NoIDxqb2NoZW4ua21pZXRzY2hAdHUtY2xhdXN0aGFsLmRlPgogICAgSnVuLWljaGlybyBpdG9qdW4gSGFnaW5vIDxpdG9qdW5AaWlqbGFiLm5ldD4KICAgIEpvaG4gTCBWaWxsYWxvdm9zIDxqb2huLmwudmlsbGFsb3Zvc0BpbnRlbC5jb20+CiAgICBDaHJpc3RvcGggTWFtbWl0enNjaCA8Q2hyaXN0b3BoLk1hbW1pdHpzY2hAdHUtY2xhdXN0aGFsLmRlPgogICAgQXJuZSBPZXNsZWJvZSA8QXJuZS5PZXNsZWJvZUBpdGVtLm50bnUubm8+CiAgICBKZWZmIENvdXJzIDxqZWZmQHVsdHJhZG5zLmNvbT4KICAgIEthcmwgU2NoaWxrZSA8a2FybF9zY2hpbGtlQGVsaS5uZXQ+CiAgICBKb2huIE5heWxvbiA8amJwbkBjYW1icmlkZ2Vicm9hZGJhbmQuY29tPgogICAgS2VuIEhvcm5zdGVpbiA8a2VuaEBjbWYubnJsLm5hdnkubWlsPgogICAgTWFydGluIE9sZGZpZWxkIDxtQG1haWwudGM+CiAgICBIYXJyaWUgSGF6ZXdpbmtlbCA8aGFycmllQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KICAgIE1hcmsgRmVybGF0dGUgPGZlcmxhdHRlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KICAgIE1hcnVzIE1laXNzbmVyIDxtYXJjdXNtZWlzc25lckB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CiAgICBTdGVwaGFuIFdlbnplciA8c3RlcGhhbndlbnplbEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CiAgICBSb24gTWV2aXNzZW4gPHJvbi5tZXZpc3NlbkBlZWQuZXJpY3Nzb24uc2U+CiAgICBULkouIE1hdGhlciA8dGptYXRoZXJAdGptYXRoZXIuY29tPgogICAgQ3JhaWcgU2V0ZXJhIDxzZXRlcmFqdW5rQGNoYXJ0ZXIubmV0PgogICAgS2F0c3VoaXNhIEFCRSA8YWJla2F0c3VAY3lzb2xzLmNvbT4KICAgIEF4ZWwgS2l0dGVuYmVyZ2VyIDxBeGVsLktpdHRlbmJlcmdlckBtYXh4aW8uY29tPgogICAgSm9oYW5uZXMgU2NobWlkdC1GaXNjaGVyIDxqc2ZASW50ZXJGYWNlLUFHLmNvbT4KICAgIEplZmZyZXkgV2F0c29uIDxub3N0YXdAdXNlcnMuc291cmNlZm9yZ2UubmV0PgogICAgQnJ1Y2UgU2hhdyA8QnJ1Y2UuU2hhd0Bnb3YuYWIuY2E+CiAgICBTdGVmYW4gUmFkbWFuIDxzcmFkbWFuQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KICAgIFN0ZXBoZW4gSi4gRnJpZWRsIDxzamZyaWVkbEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CiAgICBBbGV4IEJ1cmdlciA8YWxleF9iQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KICAgIENocmlzdG9waGUgVmFyb3F1aSA8ZXh0LmRldm90ZWFtLnZhcm9xdWlAc25jZi5mcj4KICAgIFNyaWthbnRoIFBpbmRpcHJvbGkgPHNyaXBpbmRpcEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CiAgICBLZXZpbiBHcmFoYW0gPGtldmdyYWhhbTdAdXNlcnMuc291cmNlZm9yZ2UubmV0PgogICAgWGlhb2ZlbmcgTGluZyA8eGZsaW5nQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KICAgIEJyYW5kb24gS25pdHRlciA8a25pdHRlcmJAYmwuLi4+CiAgICBBbmRyZXcgRmluZGxheSA8YW5kcmV3LmZpbmRsYXlAc2tpbGxzLTFzdC5jby51az4KICAgIFJvbiBUYWJvciA8cnRhYm9yQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KICAgIFBldGVyIFdhcmFzaW4gPGRyZy1yM0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CiAgICBCb2IgUm93bGFuZHMgPHJvYmVydC5yb3dsYW5kc0BzdW4uY29tPgogICAgUGV0ZXIgSGlja3MgPFBldGVyLkhpY2tzQFBPR0dTLkNPLlVLPgogICAgQW5keSBTbWl0aCA8d2FzbWl0aDMyQGVhcnRobGluay5uZXQ+CiAgICBOaWNrIEJhcmthcyA8bmJhcmthc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CiAgICBOb2FoIEZyaWVkbWFuIDxmcmllZG1hbkBwcmVwLmFpLm1pdC5lZHU+CiAgICBHZWVydCBEZSBQZXV0ZXIgPGdlZXJ0QGRlcGV1dGVyLm9yZz4KICAgIE1hZ251cyBGcm9tcmVpZGUgPG1hZ2ZyQGx5c2F0b3IubGl1LnNlPgogICAgTWFyY3VzIE1laXNzbmVyIDxtYXJjdXNtZWlzc25lckB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CiAgICBBbmRyZXcgUnVja2VyIEpvbmVzIDxhcmpvbmVzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KICAgIERhaS5ILiA8ZGctZkB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CiAgICBUaG9tYXMgQW5kZXJzIDx0YW5kZXJzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KICAgIFZsYWRpc2xhdiBCb2dkYW5vdiA8c2xhdmFfcmVnQG5zeXMuYnk+CiAgICBQZXRlciBNYXJ0aW4gPHBubWFydGluQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KICAgIFRob21hcyBMYWNrZXkgPHRlbGFja2V5QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KICAgIEpvZSBCdWVobGVyIDxqYnVlaGxlckBzcGlyZW50Y29tLmNvbT4KICAgIEFuZGVycyBQZXJzc29uIDxhcGVyc3NvbkB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CiAgICBSb2plciA8cm9qZXJAdXNlcnMuc291cmNlZm9yZ2UubmV0PgogICAgQmFydCBWYW4gQXNzY2hlIDxiYXJ0LnZhbmFzc2NoZUBnbWFpbC5jb20+CiAgICBQYWJsbyBDYXJib25pIDxwY2FyYm9uaUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CiAgICBCaWxsIEZlbm5lciA8ZmVubmVyQGdtYWlsLmNvbT4KICAgIEJyaWFuIFNpcG9zIDxic2lwb3Nya2ZAdXNlcnMuc291cmNlZm9yZ2UubmV0PgoKICBXZSd2ZSBwcm9iYWJseSBmb3Jnb3R0ZW4gcGVvcGxlIG9uIHRoaXMgbGlzdC4gIExldCB1cyBrbm93IGlmIHlvdSd2ZQogIGNvbnRyaWJ1dGVkIGNvZGUgYW5kIHdlJ3ZlIGxlZnQgeW91IG91dC4K