UkVBRE1FIGZvciB0aGUgSVNETi1zdWJzeXN0ZW0KCjEuIFByZWZhY2UKCiAgMS4xIEludHJvZHVjdGlvbgoKICBUaGlzIFJFQURNRSBkZXNjcmliZXMgaG93IHRvIHNldCB1cCBhbmQgaG93IHRvIHVzZSB0aGUgZGlmZmVyZW50IHBhcnRzCiAgb2YgdGhlIElTRE4tc3Vic3lzdGVtLgoKICBGb3IgdXNpbmcgdGhlIElTRE4tc3Vic3lzdGVtLCBzb21lIGFkZGl0aW9uYWwgdXNlcmxldmVsIHByb2dyYW1zIGFyZQogIG5lY2Vzc2FyeS4gVGhvc2UgcHJvZ3JhbXMgYW5kIHNvbWUgY29udHJpYnV0ZWQgdXRpbGl0aWVzIGFyZSBhdmFpbGFibGUKICBhdAoKICAgZnRwLmlzZG40bGludXguZGUKCiAgIC9wdWIvaXNkbjRsaW51eC9pc2RuNGstdXRpbHMtPFZlcnNpb25OdW1iZXI+LnRhci5negoKCiAgV2UgYWxzbyBoYXZlIHNldCB1cCBhIG1haWxpbmctbGlzdDoKCiAgIFRoZSBpc2RuNGxpbnV4LXByb2plY3Qgb3JpZ2luYXRlcyBpbiBHZXJtYW55LCBhbmQgdGhlcmVmb3JlIGJ5IGhpc3RvcmljYWwKICAgcmVhc29ucywgdGhlIG1haWxpbmctbGlzdCdzIHByaW1hcnkgbGFuZ3VhZ2UgaXMgZ2VybWFuLiBIb3dldmVyIG1haWxzCiAgIHdyaXR0ZW4gaW4gZW5nbGlzaCBoYXZlIGJlZW4gd2VsY29tZSBhbGwgdGhlIHRpbWUuCgogICB0byBzdWJzY3JpYmU6IHdyaXRlIGEgZW1haWwgdG8gbWFqb3Jkb21vQGxpc3RzZXJ2LmlzZG40bGludXguZGUsCiAgIFN1YmplY3QgaXJyZWxldmFudCwgaW4gdGhlIG1lc3NhZ2UgYm9keToKICAgc3Vic2NyaWJlIGlzZG40bGludXggPHlvdXJfZW1haWxfYWRkcmVzcz4KCiAgIFRvIHdyaXRlIHRvIHRoZSBtYWlsaW5nLWxpc3QsIHdyaXRlIHRvIGlzZG40bGludXhAbGlzdHNlcnYuaXNkbjRsaW51eC5kZQoKICAgVGhpcyBtYWlsaW5nbGlzdCBpcyBiaWRpcmVjdGlvbmFsbHkgZ2F0ZWQgdG8gdGhlIG5ld3Nncm91cAoKICAgICBkZS5hbHQuY29tbS5pc2RuNGxpbnV4CgogIFRoZXJlIGlzIGFsc28gYSB3ZWxsIG1haW50YWluZWQgRkFRIGluIEVuZ2xpc2ggYXZhaWxhYmxlIGF0CiAgICAgaHR0cDovL3d3dy5taGVzc2xlci5kZS9pNGxmYXEvCiAgSXQgY2FuIGJlIHZpZXdlZCBvbmxpbmUsIG9yIGRvd25sb2FkZWQgaW4gc2dtbC90ZXh0L2h0bWwgZm9ybWF0LgogIFRoZSBGQVEgY2FuIGFsc28gYmUgdmlld2VkIG9ubGluZSBhdAogICAgIGh0dHA6Ly93d3cuaXNkbjRpbnV4LmRlL2ZhcS8KICBvciBkb3dubG9hZGVkIGZyb20KICAgICBmdHA6Ly9mdHAuaXNkbjRsaW51eC5kZS9wdWIvaXNkbjRsaW51eC9GQVEvCgogIDEuMSBUZWNobmljYWwgZGV0YWlscwoKICBJbiB0aGUgZm9sbG93aW5nIFRleHQsIHRoZSB0ZXJtcyBNU04gYW5kIEVBWiBhcmUgdXNlZC4KCiAgTVNOIGlzIHRoZSBhYmJyZXZpYXRpb24gZm9yIChNKXVsdGlwbGUoUyl1YnNjcmliZXIoTil1bWJlciwgYW5kIGFwcGxpZXMKICB0byBFdXJvKEVEU1MxKS10eXBlIGxpbmVzLiBVc3VhbGx5IGl0IGlzIHNpbXBseSB0aGUgcGhvbmUgbnVtYmVyLgoKICBFQVogaXMgdGhlIGFiYnJldmlhdGlvbiBvZiAoRSluZGdlcmFldGUoQSl1c3dhaGwoWilpZmZlciBhbmQKICBhcHBsaWVzIHRvIEdlcm1hbiAxVFI2LXR5cGUgbGluZXMuIFRoaXMgaXMgYSBvbmUtZGlnaXQgc3RyaW5nLAogIHNpbXBseSBhcHBlbmRlZCB0byB0aGUgYmFzZSBwaG9uZSBudW1iZXIKCiAgVGhlIGludGVybmFsIGhhbmRsaW5nIGlzIG5lYXJseSBpZGVudGljYWwsIHNvIHJlcGxhY2UgdGhlIGFwcHJvcHJpYXRlCiAgdGVybSB0byB0aGF0IG9uZSwgd2hpY2ggYXBwbGllcyB0byB5b3VyIGxvY2FsIElTRE4tZW52aXJvbm1lbnQuCgogIFdoZW4gdGhlIGxpbmstbGV2ZWwtbW9kdWxlIGlzZG4ubyBpcyBsb2FkZWQsIGl0IHN1cHBvcnRzIHVwIHRvIDE2CiAgbG93LWxldmVsLW1vZHVsZXMgd2l0aCB1cCB0byA2NCBjaGFubmVscy4gKFRoZSBudW1iZXIgNjQgaXMgYXJiaXRyYXJpbHkKICBjaG9zZW4gYW5kIGNhbiBiZSBjb25maWd1cmVkIGF0IGNvbXBpbGUtdGltZSAtLUlTRE5fTUFYIGluIGlzZG4uaCkuCiAgQSBsb3ctbGV2ZWwtZHJpdmVyIGNhbiByZWdpc3RlciBpdHNlbGYgdGhyb3VnaCBhbiBpbnRlcmZhY2UgKHdoaWNoIGlzCiAgZGVmaW5lZCBpbiBpc2RuaWYuaCkgYW5kIGdldHMgYXNzaWduZWQgYSBzbG90LgogIFRoZSBmb2xsb3dpbmcgY2hhci1kZXZpY2VzIGFyZSBtYWRlIGF2YWlsYWJsZSBmb3IgZWFjaCBjaGFubmVsOgoKICBBIHJhdy1jb250cm9sLWRldmljZSB3aXRoIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgogICAgIHdyaXRlOiByYXcgRC1jaGFubmVsLW1lc3NhZ2VzIChmb3JtYXQ6IGRlcGVuZHMgb24gZHJpdmVyKS4KICAgICByZWFkOiAgcmF3IEQtY2hhbm5lbC1tZXNzYWdlcyAoZm9ybWF0OiBkZXBlbmRzIG9uIGRyaXZlcikuCiAgICAgaW9jdGw6IGRlcGVuZHMgb24gZHJpdmVyLCBpLmUuIGZvciB0aGUgSUNOLWRyaXZlciwgdGhlIGJhc2UtYWRkcmVzcyBvZgogICAgICAgICAgICB0aGUgcG9ydHMgYW5kIHRoZSBzaGFyZWQgbWVtb3J5IG9uIHRoZSBjYXJkIGNhbiBiZSBzZXQgYW5kIHJlYWQKICAgICAgICAgICAgYWxzbyB0aGUgYm9vdC1jb2RlIGFuZCB0aGUgcHJvdG9jb2wgc29mdHdhcmUgY2FuIGJlIGxvYWRlZCBpbnRvCiAgICAgICAgICAgIHRoZSBjYXJkLgoKICAgTyBOIEwgWSAhISEgIGZvciBkZWJ1Z2dpbmcgKG5vIGxvY2tpbmcgYWdhaW5zdCBvdGhlciBkZXZpY2VzKToKICAgT25lIHJhdy1kYXRhLWRldmljZSB3aXRoIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgogICAgIHdyaXRlOiBkYXRhIHRvIEItY2hhbm5lbC4KICAgICByZWFkOiAgZGF0YSBmcm9tIEItY2hhbm5lbC4KCiAgIEluIGFkZGl0aW9uIHRoZSBmb2xsb3dpbmcgZGV2aWNlcyBhcmUgbWFkZSBhdmFpbGFibGU6CgogICAxMjggdHR5LWRldmljZXMgKDY0IGN1aXggYW5kIDY0IHR0eUl4KSB3aXRoIGludGVncmF0ZWQgbW9kZW0tZW11bGF0b3I6CiAgIFRoZSBmdW5jdGlvbmFsaXR5IGlzIGFsbW9zdCB0aGUgc2FtZSBhcyB0aGF0IG9mIGEgc2VyaWFsIGRldmljZQogICAodGhlIGxpbmUtZGlzY3MgYXJlIGhhbmRsZWQgYnkgdGhlIGtlcm5lbCksIHdoaWNoIGxldHMgeW91IHJ1bgogICBTTElQLCBDU0xJUCBhbmQgYXN5bmNocm9ub3VzIFBQUCB0aHJvdWdoIHRoZSBkZXZpY2VzLiBXZSBoYXZlIHRlc3RlZAogICBTZXlvbiwgbWluaWNvbSwgQ1NMSVAgKHVyaS1kaXApIFBQUCwgbWdldHR5LCBYQ2VwdCBhbmQgSHlsYWZheC4gCgogICBUaGUgbW9kZW0tZW11bGF0aW9uIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmc6CiAgICAgICAgICAgMS4zLjEgQ29tbWFuZHM6CgogICAgICAgICAgICAgICBBVEEgICAgICBBbnN3ZXIgaW5jb21pbmcgY2FsbC4KICAgICAgICAgICAgICAgQVREPE5vLj4gRGlhbCwgdGhlIG51bWJlciBtYXkgY29udGFpbjoKICAgICAgICAgICAgICAgICAgICAgICAgWzAtOV0gYW5kIFssIy4qV1BULVNdCiAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBsYXR0ZXIgYXJlIGlnbm9yZWQgdW50aWwgJ1MnLgogICAgICAgICAgICAgICAgICAgICAgICBUaGUgJ1MnIG11c3QgcHJlY2VkZSB0aGUgbnVtYmVyLCBpZgogICAgICAgICAgICAgICAgICAgICAgICB0aGUgbGluZSBpcyBhIFNQViAoR2VybWFuIDFUUjYpLgogICAgICAgICAgICAgICBBVEUwICAgICBFY2hvIG9mZi4KICAgICAgICAgICAgICAgQVRFMSAgICAgRWNobyBvbiAoZGVmYXVsdCkuCiAgICAgICAgICAgICAgIEFUSCAgICAgIEhhbmctdXAuCiAgICAgICAgICAgICAgIEFUSDEgICAgIE9mZiBob29rIChpZ25vcmVkKS4KICAgICAgICAgICAgICAgQVRIMCAgICAgSGFuZy11cC4KICAgICAgICAgICAgICAgQVRJICAgICAgUmV0dXJuICJJU0ROIGZvciBMaW51eC4uLiIuCiAgICAgICAgICAgICAgIEFUSTAgICAgICAgICIKICAgICAgICAgICAgICAgQVRJMSAgICAgICAgIgogICAgICAgICAgICAgICBBVEkyICAgICBSZXBvcnQgb2YgbGFzdCBjb25uZWN0aW9uLgogICAgICAgICAgICAgICBBVE8gICAgICBPbiBsaW5lIChkYXRhIG1vZGUpLgogICAgICAgICAgICAgICBBVFEwICAgICBFbmFibGUgcmVzdWx0IGNvZGVzIChkZWZhdWx0KS4KICAgICAgICAgICAgICAgQVRRMSAgICAgRGlzYWJsZSByZXN1bHQgY29kZXMgKGRlZmF1bHQpLgogICAgICAgICAgICAgICBBVFN4PXkgICBTZXQgcmVnaXN0ZXIgeCB0byB5LgogICAgICAgICAgICAgICBBVFN4PyAgICBTaG93IGNvbnRlbnRzIG9mIHJlZ2lzdGVyIHguCiAgICAgICAgICAgICAgIEFUVjAgICAgIE51bWVyaWMgcmVzcG9uc2VzLgogICAgICAgICAgICAgICBBVFYxICAgICBFbmdsaXNoIHJlc3BvbnNlcyAoZGVmYXVsdCkuCiAgICAgICAgICAgICAgIEFUWiAgICAgIExvYWQgcmVnaXN0ZXJzIGFuZCBFQVovTVNOIGZyb20gUHJvZmlsZS4KICAgICAgICAgICAgICAgQVQmQnggICAgU2V0IFNlbmQtUGFja2V0LXNpemUgdG8geCAobWF4LiA0MDAwKQogICAgICAgICAgICAgICAgICAgICAgICBUaGUgcmVhbCBwYWNrZXQtc2l6ZSBtYXkgYmUgbGltaXRlZCBieSB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgbG93LWxldmVsLWRyaXZlciB1c2VkLiBlLmcuIHRoZSBIaVNheC1Nb2R1bGUtCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0IGlzIDIwMDAuIFlvdSB3aWxsIGdldCBOTyBFcnJvci1NZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICBpZiB5b3Ugc2V0IGl0IHRvIGhpZ2hlciB2YWx1ZXMsIGJlY2F1c2UgYXQgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUgb2YgZ2l2aW5nIHRoaXMgY29tbWFuZCB0aGUgY29ycmVzcG9uZGluZwogICAgICAgICAgICAgICAgICAgICAgICBkcml2ZXIgbWF5IG5vdCBiZSBzZWxlY3RlZCAoc2VlICJBdXRvbWF0aWMKICAgICAgICAgICAgICAgICAgICAgICAgQXNzaWdubWVudCIpIGhvd2V2ZXIgdGhlIHNpemUgb2Ygb3V0Z29pbmcgcGFja2V0cwogICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGxpbWl0ZWQgY29ycmVjdGx5LgogICAgICAgICAgICAgICBBVCZEMCAgICBJZ25vcmUgRFRSCiAgICAgICAgICAgICAgIEFUJkQyICAgIERUUi1sb3ctZWRnZTogSGFuZyB1cCBhbmQgcmV0dXJuIHRvCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgbW9kZSAoZGVmYXVsdCkuCiAgICAgICAgICAgICAgIEFUJkQzICAgIFNhbWUgYXMgQVQmRDIgYnV0IGFsc28gcmVzZXRzIGFsbCByZWdpc3RlcnMuCiAgICAgICAgICAgICAgIEFUJkV4ICAgIFNldCB0aGUgRUFaL01TTiBmb3IgdGhpcyBjaGFubmVsIHRvIHguCiAgICAgICAgICAgICAgIEFUJkYgICAgIFJlc2V0IGFsbCByZWdpc3RlcnMgYW5kIHByb2ZpbGUgdG8gImZhY3RvcnktZGVmYXVsdHMiCiAgICAgICAgICAgICAgIEFUJkx4ICAgIFNldCBsaXN0IG9mIHBob25lIG51bWJlcnMgdG8gbGlzdGVuIG9uLiAgeCBpcyBhCiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Qgb2Ygd2lsZGNhcmQgcGF0dGVybnMgc2VwYXJhdGVkIGJ5IHNlbWljb2xvbi4KICAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhpcyBpcyBzZXQsIGl0IGhhcyBwcmVjZWRlbmNlIG92ZXIgdGhlIE1TTiBzZXQKICAgICAgICAgICAgICAgICAgICAgICAgYnkgQVQmRS4KICAgICAgICAgICAgICAgQVQmUnggICAgU2VsZWN0IFYuMTEwIGJpdHJhdGUgYWRhcHRpb24uCiAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgY29tbWFuZCBlbmFibGVzIFYuMTEwIHByb3RvY29sIHdpdGggOTYwMCBiYXVkCiAgICAgICAgICAgICAgICAgICAgICAgICh4PTk2MDApLCAxOTIwMCBiYXVkICh4PTE5MjAwKSBvciAzODQwMCBiYXVkCiAgICAgICAgICAgICAgICAgICAgICAgICh4PTM4NDAwKS4gQSB2YWx1ZSBvZiB4PTAgZGlzYWJsZXMgVi4xMTAgc3dpdGNoaW5nCiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2sgdG8gZGVmYXVsdCBYLjc1LiBUaGlzIGNvbW1hbmQgc2V0cyB0aGUgZm9sbG93aW5nCiAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyczoKICAgICAgICAgICAgICAgICAgICAgICAgICBSZWcgMTQgKExheWVyLTIgcHJvdG9jb2wpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IDA6ICAgICAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gOTYwMDogIDcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSAxOTIwMDogOAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IDM4NDAwOiA5CiAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnIDE4LjIgPSAxCiAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnIDE5IChBZGRpdGlvbmFsIFNlcnZpY2UgSW5kaWNhdG9yKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSAwOiAgICAgICAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gOTYwMDogIDE5NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IDE5MjAwOiAxOTkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSAzODQwMDogMTk4CiAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZSBvbiB2YWx1ZSBpbiBSZWcgMTk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVyZSBpcyBfTk9fIGNvbW1vbiBjb252ZW50aW9uIGZvciAzODQwMCBiYXVkLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlIDE5OCBpcyBjaG9zZW4gYXJiaXRyYXJpbHkuIFVzZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTVVTVF8gbmVnb3RpYXRlIHRoaXMgdmFsdWUgYmVmb3JlIGVzdGFibGlzaGluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBjb25uZWN0aW9uLgogICAgICAgICAgICAgICBBVCZTeCAgICBTZXQgd2luZG93LXNpemUgKHggPSAxLi44KSAobm90IHlldCBpbXBsZW1lbnRlZCkKICAgICAgICAgICAgICAgQVQmViAgICAgU2hvdyBhbGwgc2V0dGluZ3MuCiAgICAgICAgICAgICAgIEFUJlcwICAgIFdyaXRlIHJlZ2lzdGVycyBhbmQgRUFaL01TTiB0byBwcm9maWxlLiBTZWUgYWxzbwogICAgICAgICAgICAgICAgICAgICAgICBpcHJvZmQgKDUuYyBpbiB0aGlzIFJFQURNRSkuCiAgICAgICAgICAgICAgIEFUJlgwICAgIEJUWC1tb2RlIGFuZCBULjcwLW1vZGUgb2ZmIChkZWZhdWx0KQogICAgICAgICAgICAgICBBVCZYMSAgICBCVFgtbW9kZSBvbi4gKFMxMy4xPTEsIFMxMy41PTAgUzE0PTAsIFMxNj03LCBTMTg9NywgUzE5PTApCiAgICAgICAgICAgICAgIEFUJlgyICAgIFQuNzAtbW9kZSBvbi4gKFMxMy4xPTEsIFMxMy41PTEsIFMxND0wLCBTMTY9NywgUzE4PTcsIFMxOT0wKQogICAgICAgICAgICAgICBBVCtSeCAgICBSZXN1bWUgYSBzdXNwZW5kZWQgY2FsbCB3aXRoIENhbGxJRCB4ICh4ID0gMSwyLDMuLi4pCiAgICAgICAgICAgICAgIEFUK1N4ICAgIFN1c3BlbmQgYSBjYWxsIHdpdGggQ2FsbElEIHggKHggPSAxLDIsMy4uLikKCiAgICAgICAgICAgRm9yIHZvaWNlLW1vZGUgY29tbWFuZHMgcmVmZXIgdG8gUkVBRE1FLmF1ZGlvCgogICAgICAgICAgIDEuMy4yIEVzY2FwZSBzZXF1ZW5jZToKICAgICAgICAgICAgICAgRHVyaW5nIGEgY29ubmVjdGlvbiwgdGhlIGVtdWxhdGlvbiByZWFjdHMganVzdCBsaWtlCiAgICAgICAgICAgICAgIGEgbm9ybWFsIG1vZGVtIHRvIHRoZSBlc2NhcGUgc2VxdWVuY2UgPERFTEFZPisrKzxERUxBWT4uCiAgICAgICAgICAgICAgIChUaGUgZXNjYXBlIGNoYXJhY3RlciAtIGRlZmF1bHQgJysnIC0gY2FuIGJlIHNldCBpbiB0aGUKICAgICAgICAgICAgICAgcmVnaXN0ZXIgMikuCiAgICAgICAgICAgICAgIFRoZSBERUxBWSBtdXN0IGF0IGxlYXN0IGJlIDEuNSBzZWNvbmRzIGxvbmcgYW5kIGRlbGF5CiAgICAgICAgICAgICAgIGJldHdlZW4gdGhlIGVzY2FwZSBjaGFyYWN0ZXJzIG11c3Qgbm90IGV4Y2VlZCAwLjUgc2Vjb25kcy4KCiAgICAgICAgICAgMS4zLjMgUmVnaXN0ZXJzOgoKICAgICAgICAgICAgICBOci4gIERlZmF1bHQgIERlc2NyaXB0aW9uCiAgICAgICAgICAgICAgMCAgICAwICAgICAgICBBbnN3ZXIgb24gcmluZyBudW1iZXIuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobm8gYXV0by1hbnN3ZXIgaWYgUzA9MCkuCiAgICAgICAgICAgICAgMSAgICAwICAgICAgICBDb3VudCBvZiByaW5ncy4KICAgICAgICAgICAgICAyICAgIDQzICAgICAgIEVzY2FwZSBjaGFyYWN0ZXIuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYSB2YWx1ZSA+PSAxMjggZGlzYWJsZXMgdGhlIGVzY2FwZSBzZXF1ZW5jZSkuCiAgICAgICAgICAgICAgMyAgICAxMyAgICAgICBDYXJyaWFnZSByZXR1cm4gY2hhcmFjdGVyIChBU0NJSSkuCiAgICAgICAgICAgICAgNCAgICAxMCAgICAgICBMaW5lIGZlZWQgY2hhcmFjdGVyIChBU0NJSSkuCiAgICAgICAgICAgICAgNSAgICA4ICAgICAgICBCYWNrc3BhY2UgY2hhcmFjdGVyIChBU0NJSSkuCiAgICAgICAgICAgICAgNiAgICAzICAgICAgICBEZWxheSBpbiBzZWNvbmRzIGJlZm9yZSBkaWFsaW5nLgogICAgICAgICAgICAgIDcgICAgNjAgICAgICAgV2FpdCBmb3IgY2Fycmllci4KICAgICAgICAgICAgICA4ICAgIDIgICAgICAgIFBhdXNlIHRpbWUgZm9yIGNvbW1hIChpZ25vcmVkKQogICAgICAgICAgICAgIDkgICAgNiAgICAgICAgQ2FycmllciBkZXRlY3QgdGltZSAoaWdub3JlZCkKICAgICAgICAgICAgIDEwICAgIDcgICAgICAgIENhcnJpZXIgbG9zcyB0byBkaXNjb25uZWN0IHRpbWUgKGlnbm9yZWQpLgogICAgICAgICAgICAgMTEgICAgNzAgICAgICAgVG91Y2ggdG9uZSB0aW1pbmcgKGlnbm9yZWQpLgogICAgICAgICAgICAgMTIgICAgNjkgICAgICAgQml0IGNvZGVkIHJlZ2lzdGVyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0IDA6ICAgIDAgPSBTdXBwcmVzcyByZXNwb25zZSBtZXNzYWdlcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxID0gU2hvdyByZXNwb25zZSBtZXNzYWdlcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdCAxOiAgICAwID0gRW5nbGlzaCByZXNwb25zZSBtZXNzYWdlcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxID0gTnVtZXJpYyByZXNwb25zZSBtZXNzYWdlcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdCAyOiAgICAwID0gRWNobyBvZmYuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSA9IEVjaG8gb24uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXQgMyAgICAgMCA9IERDRCBhbHdheXMgb24uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSA9IERDRCBmb2xsb3dzIGNhcnJpZXIuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXQgNCAgICAgMCA9IENUUyBmb2xsb3dzIFJUUwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPSBJZ25vcmUgUlRTLCBDVFMgYWx3YXlzIG9uLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0IDUgICAgIDAgPSByZXR1cm4gdG8gY29tbWFuZCBtb2RlIG9uIERUUiBsb3cuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSA9IFNhbWUgYXMgMCBidXQgYWxzbyByZXNldHMgYWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVycy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgYWxzbyByZWdpc3RlciAxMywgYml0IDIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdCA2ICAgICAwID0gRFNSIGFsd2F5cyBvbi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxID0gRFNSIG9ubHkgb24gaWYgY2hhbm5lbCBpcyBhdmFpbGFibGUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXQgNyAgICAgMCA9IENpc2NvLVBQUC1mbGFnLWhhY2sgb2ZmIChkZWZhdWx0KS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxID0gQ2lzY28tUFBQLWZsYWctaGFjayBvbi4KICAgICAgICAgICAgIDEzICAgMCAgICAgICAgIEJpdCBjb2RlZCByZWdpc3RlcjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdCAwOiAgICAwID0gVXNlIGRlbGF5ZWQgdHR5LXNlbmQtYWxnb3JpdGhtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSA9IERpcmVjdCB0dHktc2VuZC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdCAxOiAgICAwID0gVC43MCBwcm90b2NvbCAoT25seSBmb3IgQlRYISkgb2ZmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSA9IFQuNzAgcHJvdG9jb2wgKE9ubHkgZm9yIEJUWCEpIG9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXQgMjogICAgMCA9IERvbid0IGhhbmd1cCBvbiBEVFIgbG93LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPSBIYW5ndXAgb24gRFRSIGxvdy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdCAzOiAgICAwID0gU3RhbmRhcmQgcmVzcG9uc2UgbWVzc2FnZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxID0gRXh0ZW5kZWQgcmVzcG9uc2UgbWVzc2FnZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdCA0OiAgICAwID0gQ0FMTEVSIE5VTUJFUiBiZWZvcmUgZXZlcnkgUklORy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxID0gQ0FMTEVSIE5VTUJFUiBhZnRlciBmaXJzdCBSSU5HLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0IDU6ICAgIDAgPSBULjcwIGV4dGVuZGVkIHByb3RvY29sIG9mZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPSBULjcwIGV4dGVuZGVkIHByb3RvY29sIG9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXQgNjogICAgMCA9IFNwZWNpYWwgUlVORyBNZXNzYWdlIG9mZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPSBTcGVjaWFsIFJVTkcgTWVzc2FnZSBvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUlVORyIgaXMgZGVsaXZlcmVkIG9uIGEgdHR5SSwgaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW4gaW5jb21pbmcgY2FsbCBoYXBwZW5lZCAoUklORykgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByZW1vdGUgcGFydHkgaHVuZyB1cCBiZWZvcmUgYW55CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsIEFUQSB3YXMgZ2l2ZW4uCgkJCSAgICBCaXQgNzogICAgMCA9IERvbid0IHNob3cgZGlzcGxheSBtZXNzYWdlcyBmcm9tIG5ldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPSBTaG93IGRpc3BsYXkgbWVzc2FnZXMgZnJvbSBuZXQKCQkJCSAgICAgICAgICAoUzEyIEJpdCAxIG11c3QgYmUgMCB0b28pICAgICAgCiAgICAgICAgICAgICAxNCAgIDAgICAgICAgICBMYXllci0yIHByb3RvY29sOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgPSBYNzUvTEFQQiB3aXRoIEktZnJhbWVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSA9IFg3NS9MQVBCIHdpdGggVUktZnJhbWVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiA9IFg3NS9MQVBCIHdpdGggQlVJLWZyYW1lcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgPSBIRExDCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCA9IFRyYW5zcGFyZW50IChhdWRpbykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3ID0gVi4xMTAsIDk2MDAgYmF1ZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDggPSBWLjExMCwgMTkyMDAgYmF1ZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkgPSBWLjExMCwgMzg0MDAgYmF1ZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAgPSBBbmFsb2cgTW9kZW0gKG9ubHkgaWYgaGFyZHdhcmUgc3VwcG9ydHMgdGhpcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExID0gRmF4IEczIChvbmx5IGlmIGhhcmR3YXJlIHN1cHBvcnRzIHRoaXMpCiAgICAgICAgICAgICAxNSAgIDAgICAgICAgICBMYXllci0zIHByb3RvY29sOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgPSB0cmFuc3BhcmVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPSB0cmFuc3BhcmVudCB3aXRoIGF1ZGlvIGZlYXR1cmVzIChlLmcuIERTUCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyID0gRmF4IEczIENsYXNzIDIgY29tbWFuZHMgKFMxNCBoYXMgdG8gYmUgc2V0IHRvIDExKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgPSBGYXggRzMgQ2xhc3MgMSBjb21tYW5kcyAoUzE0IGhhcyB0byBiZSBzZXQgdG8gMTEpCiAgICAgICAgICAgICAxNiAgIDI1MCAgICAgICBTZW5kLVBhY2tldC1zaXplLzE2CiAgICAgICAgICAgICAxNyAgIDggICAgICAgICBXaW5kb3ctc2l6ZSAobm90IHlldCBpbXBsZW1lbnRlZCkKICAgICAgICAgICAgIDE4ICAgNCAgICAgICAgIEJpdCBjb2RlZCByZWdpc3RlciwgU2VydmljZS1PY3RldC0xIHRvIGFjY2VwdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHRvIGJlIHVzZWQgb24gZGlhbG91dDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdCAwOiAgICBTZXJ2aWNlIDEgKGF1ZGlvKSB3aGVuIHNldC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdCAxOiAgICBTZXJ2aWNlIDUgKEJUWCkgd2hlbiBzZXQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXQgMjogICAgU2VydmljZSA3IChkYXRhKSB3aGVuIHNldC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IEl0IGlzIHBvc3NpYmxlIHRvIHNldCBtb3JlIHRoYW4gb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXQuIEluIHRoaXMgY2FzZSwgb24gaW5jb21pbmcgY2FsbHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzZWxlY3RlZCBzZXJ2aWNlcyBhcmUgYWNjZXB0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgaWYgdGhlIHNlcnZpY2UgaXMgImF1ZGlvIiwgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXllci0yLXByb3RvY29sIGlzIGF1dG9tYXRpY2FsbHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgdG8gNCByZWdhcmRsZXNzIG9mIHRoZSBzZXR0aW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiByZWdpc3RlciAxNC4gT24gb3V0Z29pbmcgY2FsbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbW9zdCBzaWduaWZpY2FudCAxLWJpdCBpcyBjaG9zZW4gdG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCB0aGUgb3V0Z29pbmcgc2VydmljZSBvY3RldC4KICAgICAgICAgICAgIDE5ICAgMCAgICAgICAgIFNlcnZpY2UtT2N0ZXQtMgogICAgICAgICAgICAgMjAgICAwICAgICAgICAgQml0IGNvZGVkIHJlZ2lzdGVyIChyZWFkb25seSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2UtT2N0ZXQtMSBvZiBsYXN0IGNhbGwuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXQgbWFwcGluZyBpcyB0aGUgc2FtZSBhcyByZWdpc3RlciAxOAogICAgICAgICAgICAgMjEgICAwICAgICAgICAgQml0IGNvZGVkIHJlZ2lzdGVyIChyZWFkb25seSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCBvbiBpbmNvbWluZyBjYWxsIChkdXJpbmcgUklORykgdG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9jdGV0IDMgb2YgY2FsbGluZyBwYXJ0eSBudW1iZXIgSUUgKE51bWJlcmluZyBwbGFuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIHNlY3Rpb24gNC41LjEwIG9mIElUVSBRLjkzMQogICAgICAgICAgICAgMjIgICAwICAgICAgICAgQml0IGNvZGVkIHJlZ2lzdGVyIChyZWFkb25seSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCBvbiBpbmNvbWluZyBjYWxsIChkdXJpbmcgUklORykgdG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9jdGV0IDNhIG9mIGNhbGxpbmcgcGFydHkgbnVtYmVyIElFIChTY3JlZW5pbmcgaW5mbykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSBzZWN0aW9uIDQuNS4xMCBvZiBJVFUgUS45MzEKICAgICAgICAgICAgIDIzICAgMCAgICAgICAgIEJpdCBjb2RlZCByZWdpc3RlcjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdCAwOiAgICAwID0gQWRkIENQTiB0byBSSU5HIG1lc3NhZ2Ugb2ZmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSA9IEFkZCBDUE4gdG8gUklORyBtZXNzYWdlIG9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXQgMTogICAgMCA9IEFkZCBDUE4gdG8gRkNPTiBtZXNzYWdlIG9mZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPSBBZGQgQ1BOIHRvIEZDT04gbWVzc2FnZSBvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0IDI6ICAgIDAgPSBBZGQgQ0ROIHRvIFJJTkcvRkNPTiBtZXNzYWdlIG9mZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPSBBZGQgQ0ROIHRvIFJJTkcvRkNPTiBtZXNzYWdlIG9uCgogIExhc3QgYnV0IG5vdCBsZWFzdCBhIChhdCB0aGUgbW9tZW50IGZhaXJseSBwcmltaXRpdmUpIGRldmljZSB0byByZXF1ZXN0CiAgdGhlIGxpbmUtc3RhdHVzICgvZGV2L2lzZG5pbmZvKSBpcyBtYWRlIGF2YWlsYWJsZS4KCiAgQXV0b21hdGljIGFzc2lnbm1lbnQgb2YgZGV2aWNlcyB0byBsaW5lczoKCiAgQWxsIGluYWN0aXZlIHBoeXNpY2FsIGxpbmVzIGFyZSBsaXN0ZW5pbmcgdG8gYWxsIEVBWnMgZm9yIGluY29taW5nCiAgY2FsbHMgYW5kIGFyZSBOT1QgYXNzaWduZWQgdG8gYSBzcGVjaWZpYyB0dHkgb3IgbmV0d29yayBpbnRlcmZhY2UuCiAgV2hlbiBhbiBpbmNvbWluZyBjYWxsIGlzIGRldGVjdGVkLCB0aGUgZHJpdmVyIGxvb2tzIGZpcnN0IGZvciBhIG5ldHdvcmsKICBpbnRlcmZhY2UgYW5kIHRoZW4gZm9yIGFuIG9wZW5lZCB0dHkgd2hpY2g6CgogIDEuIGlzIGNvbmZpZ3VyZWQgZm9yIHRoZSBzYW1lIEVBWi4KICAyLiBoYXMgdGhlIHNhbWUgcHJvdG9jb2wgc2V0dGluZ3MgZm9yIHRoZSBCLWNoYW5uZWwuCiAgMy4gKG9ubHkgZm9yIG5ldHdvcmsgaW50ZXJmYWNlcyBpZiB0aGUgc2VjdXJpdHkgZmxhZyBpcyBzZXQpCiAgICAgY29udGFpbnMgdGhlIGNhbGxlciBudW1iZXIgaW4gaXRzIGFjY2VzcyBsaXN0LgogIDQuIEVpdGhlciB0aGUgY2hhbm5lbCBpcyBub3QgYm91bmQgZXhjbHVzaXZlbHkgdG8gYW5vdGhlciBOZXQtaW50ZXJmYWNlLCBvcgogICAgIGl0IGlzIGJvdW5kIEFORCB0aGUgb3RoZXIgY2hlY2tzIGFwcGx5IHRvIGV4YWN0bHkgdGhpcyBpbnRlcmZhY2UuCiAgICAgKEZvciB1c2FnZSBvZiB0aGUgYmluZC1mZWF0dXJlcywgcmVmZXIgdG8gdGhlIGlzZG5jdHJsLW1hbi1wYWdlKQoKICBPbmx5IHdoZW4gYSBtYXRjaGluZyBpbnRlcmZhY2Ugb3IgdHR5IGlzIGZvdW5kIGlzIHRoZSBjYWxsIGFjY2VwdGVkCiAgYW5kIHRoZSAiY29ubmVjdGlvbiIgYmV0d2VlbiB0aGUgbG93LWxldmVsLWxheWVyIGFuZCB0aGUgbGluay1sZXZlbC1sYXllcgogIGlzIGVzdGFibGlzaGVkIGFuZCBrZXB0IHVudGlsIHRoZSBlbmQgb2YgdGhlIGNvbm5lY3Rpb24uCiAgSW4gYWxsIG90aGVyIGNhc2VzIG5vIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQuIElzZG40bGludXggY2FuIGJlCiAgY29uZmlndXJlZCB0byBlaXRoZXIgZG8gTk9USElORyBpbiB0aGlzIGNhc2UgKHdoaWNoIGlzIHVzZWZ1bCwgaWYKICBvdGhlciwgZXh0ZXJuYWwgZGV2aWNlcyB3aXRoIHRoZSBzYW1lIEVBWi9NU04gYXJlIGNvbm5lY3RlZCB0byB0aGUgYnVzKQogIG9yIHRvIHJlamVjdCB0aGUgY2FsbCBhY3RpdmVseS4gKGlzZG5jdHJsIGJ1c3JlamVjdCAuLi4pCgogIEZvciBhbiBvdXRnb2luZyBjYWxsLCB0aGUgaW5hY3RpdmUgcGh5c2ljYWwgbGluZXMgYXJlIHNlYXJjaGVkLgogIFRoZSBjYWxsIGlzIHBsYWNlZCBvbiB0aGUgZmlyc3QgcGh5c2ljYWwgbGluZSwgd2hpY2ggc3VwcG9ydHMgdGhlCiAgcmVxdWVzdGVkIHByb3RvY29scyBmb3IgdGhlIEItY2hhbm5lbC4gSWYgYSBuZXQtaW50ZXJmYWNlLCBob3dldmVyCiAgaXMgcHJlLWJvdW5kIHRvIGEgY2hhbm5lbCwgdGhpcyBjaGFubmVsIGlzIHVzZWQgZGlyZWN0bHkuCgogIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gY29uZmlndXJlIHNldmVyYWwgbmV0d29yayBpbnRlcmZhY2VzIGFuZCB0dHlzCiAgZm9yIG9uZSBFQVosIGlmIHRoZSBuZXR3b3JrIGludGVyZmFjZXMgYXJlIHNldCB0byBzZWN1cmUgb3BlcmF0aW9uLgogIElmIGFuIGluY29taW5nIGNhbGwgbWF0Y2hlcyBvbmUgbmV0d29yayBpbnRlcmZhY2UsIGl0IGdldHMgY29ubmVjdGVkIHRvIGl0LgogIElmIGFub3RoZXIgaW5jb21pbmcgY2FsbCBmb3IgdGhlIHNhbWUgRUFaIGFycml2ZXMsIHdoaWNoIGRvZXMgbm90IG1hdGNoCiAgYSBuZXR3b3JrIGludGVyZmFjZSwgdGhlIGZpcnN0IHR0eSBnZXRzIGEgIlJJTkciIGFuZCBzbyBvbi4KCjIgU3lzdGVtIHByZXJlcXVpc2l0ZXM6CgogIEFUVEVOVElPTiEKCiAgQWx3YXlzIHVzZSB0aGUgbGF0ZXN0IG1vZHVsZSB1dGlsaXRpZXMuIFRoZSBjdXJyZW50IHZlcnNpb24gaXMKICBuYW1lZCBpbiBEb2N1bWVudGF0aW9uL0NoYW5nZXMuIFNvbWUgb2xkIHZlcnNpb25zIG9mIGluc21vZAogIGFyZSBub3QgY2FwYWJsZSBvZiBzZXR0aW5nIHRoZSBkcml2ZXItSWRzIGNvcnJlY3RseS4KCjMuIExvd2xldmVsLWRyaXZlciBjb25maWd1cmF0aW9uLgoKICAgQ29uZmlndXJhdGlvbiBkZXBlbmRzIG9uIGhvdyB0aGUgZHJpdmVycyBhcmUgYnVpbHQuIFNlZSB0aGUKICAgUkVBRE1FLjx5b3VyRHJpdmVyPiBmb3IgaW5mb3JtYXRpb24gb24gZHJpdmVyLXNwZWNpZmljIHNldHVwLgoKNC4gRGV2aWNlLWlub2RlcwoKICAgVGhlIG1ham9yIGFuZCBtaW5vciBudW1iZXJzIGFuZCB0aGVpciBuYW1lcyBhcmUgZGVzY3JpYmVkIGluCiAgIERvY3VtZW50YXRpb24vZGV2aWNlcy50eHQuIFRoZSBtYWpvciBudW1iZXJzIGFyZToKCiAgICAgNDMgZm9yIHRoZSBJU0ROLXR0eSdzLgogICAgIDQ0IGZvciB0aGUgSVNETi1jYWxsb3V0LXR0eSdzLgogICAgIDQ1IGZvciBjb250cm9sL2luZm8vZGVidWcgZGV2aWNlcy4KCjUuIEFwcGxpY2F0aW9uCgogICBhKSBGb3Igc29tZSBjYXJkLXR5cGVzLCBmaXJtd2FyZSBoYXMgdG8gYmUgbG9hZGVkIGludG8gdGhlIGNhcmRzLCBiZWZvcmUKICAgICAgcHJvY2VlZGluZyB3aXRoIGRldmljZS1pbmRlcGVuZGVudCBzZXR1cC4gU2VlIFJFQURNRS48eW91ckRyaXZlcj4KICAgICAgZm9yIGhvdyB0byBkbyB0aGF0LgoKICAgYikgSWYgeW91IG9ubHkgaW50ZW5kIHRvIHVzZSB0dHlzLCB5b3UgYXJlIG5lYXJseSByZWFkeSBub3cuCgogICBjKSBJZiB5b3Ugd2FudCB0byBoYXZlIHJlYWxseSBwZXJtYW5lbnQgIk1vZGVtIi1zZXR0aW5ncyBvbiBkaXNrLCB5b3UKICAgICAgY2FuIHN0YXJ0IHRoZSBkYWVtb24gaXByb2ZkLiBHaXZlIGl0IGEgcGF0aCB0byBhIGZpbGUgYXQgdGhlIGNvbW1hbmQtCiAgICAgIGxpbmUuIEl0IHdpbGwgc3RvcmUgdGhlIHByb2ZpbGUtc2V0dGluZ3MgaW4gdGhpcyBmaWxlIGV2ZXJ5IHRpbWUKICAgICAgYW4gQVQmVzAgaXMgcGVyZm9ybWVkIG9uIGFueSBJU0ROLXR0eS4gSWYgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMsCiAgICAgIGFsbCBwcm9maWxlcyBhcmUgaW5pdGlhbGl6ZWQgZnJvbSB0aGlzIGZpbGUuIElmIHlvdSB3YW50IHRvIHVubG9hZAogICAgICBhbnkgb2YgdGhlIG1vZHVsZXMsIGtpbGwgaXByb2ZkIGZpcnN0LgoKICAgZCkgRm9yIG5ldHdvcmtpbmcsIGNvbnRpbnVlOiBDcmVhdGUgYW4gaW50ZXJmYWNlOgogICAgICAgaXNkbmN0cmwgYWRkaWYgaXNkbjAKCiAgIGUpIFNldCB0aGUgRUFaIChvciBNU04gZm9yIEV1cm8tSVNETik6CiAgICAgICBpc2RuY3RybCBlYXogaXNkbjAgMgoKICAgICAoRm9yIDFUUjYgYSBzaW5nbGUgZGlnaXQgaXMgYWxsb3dlZCwgZm9yIEV1cm8tSVNETiB0aGUgbnVtYmVyIGlzIHlvdXIKICAgICAgcmVhbCBNU04gZS5nLjogUGhvbmUtTnVtYmVyKQoKICAgZikgU2V0IHRoZSBudW1iZXIgZm9yIG91dGdvaW5nIGNhbGxzIG9uIHRoZSBpbnRlcmZhY2U6CiAgICAgICBpc2RuY3RybCBhZGRwaG9uZSBpc2RuMCBvdXQgMTIzNDU2NwogICAgICAgLi4uICh0aGlzIGNhbiBiZSBleGVjdXRlZCBtb3JlIHRoYW4gb25jZSwgYWxsIGFzc2lnbmVkIG51bWJlcnMgYXJlCiAgICAgICAgICAgIHRyaWVkIGluIG9yZGVyKQogICAgICBhbmQgdGhlIG51bWJlcihzKSBmb3IgaW5jb21pbmcgY2FsbHM6CiAgICAgICBpc2RuY3RybCBhZGRwaG9uZSBpc2RuMCBpbiAxMjM0NTY3CgogICBnKSBTZXQgdGhlIHRpbWVvdXQgZm9yIGhhbmctdXA6CiAgICAgICBpc2RuY3RybCBodXB0aW1lb3V0IGlzZG4wIDx0aW1lb3V0X2luX3NlY29uZHM+CgogICBoKSBhZGRpdGlvbmFsbHkgeW91IG1heSBhY3RpdmF0ZSBjaGFyZ2UtaGFuZy11cCAoPSBIYW5nIHVwIGJlZm9yZQogICAgICBuZXh0IGNoYXJnZS1pbmZvLCB0aGlzIG9ubHkgd29ya3MsIGlmIHlvdXIgaXNkbi1wcm92aWRlciB0cmFuc21pdHMKICAgICAgdGhlIGNoYXJnZS1pbmZvIGR1cmluZyBhbmQgYWZ0ZXIgdGhlIGNvbm5lY3Rpb24pOgogICAgICAgaXNkbmN0cmwgY2hhcmdlaHVwIGlzZG4wIG9uCgogICBpKSBTZXQgdGhlIGRpYWwgbW9kZSBvZiB0aGUgaW50ZXJmYWNlOgogICAgICAgaXNkbmN0cmwgZGlhbG1vZGUgaXNkbjAgYXV0bwogICAgICAib2ZmIiBtZWFucyB0aGF0IHlvdSAob3IgdGhlIHN5c3RlbSkgY2Fubm90IG1ha2UgYW55IGNvbm5lY3Rpb24KICAgICAgICAobmVpdGhlciBpbmNvbWluZyBvciBvdXRnb2luZyBjb25uZWN0aW9ucyBhcmUgcG9zc2libGUpLiBVc2UKICAgICAgICB0aGlzIGlmIHlvdSB3YW50IHRvIGJlIHN1cmUgdGhhdCBubyBjb25uZWN0aW9ucyB3aWxsIGJlIG1hZGUuCiAgICAgICJhdXRvIiBtZWFucyB0aGF0IHRoZSBpbnRlcmZhY2UgaXMgaW4gYXV0by1kaWFsIG1vZGUsIGFuZCB3aWxsCiAgICAgICAgYXR0ZW1wdCB0byBtYWtlIGEgY29ubmVjdGlvbiB3aGVuZXZlciBhIG5ldHdvcmsgZGF0YSBwYWNrZXQgbmVlZHMKICAgICAgICB0aGUgaW50ZXJmYWNlJ3MgbGluay4gTm90ZSB0aGF0IHRoaXMgY2FuIGNhdXNlIHVuZXhwZWN0ZWQgZGlhbG91dHMsCiAgICAgICAgYW5kIGxlYWQgdG8gYSBoaWdoIHBob25lIGJpbGwhIFNvbWUgZGFlbW9ucyBvciBvdGhlciBwYydzIHRoYXQgdXNlCiAgICAgICAgdGhpcyBpbnRlcmZhY2UgY2FuIGNhdXNlIHRoaXMuCiAgICAgICAgSW5jb21pbmcgY29ubmVjdGlvbnMgYXJlIGFsc28gcG9zc2libGUuCiAgICAgICJtYW51YWwiIGlzIGEgZGlhbCBtb2RlIGNyZWF0ZWQgdG8gcHJldmVudCB0aGUgdW5leHBlY3RlZCBkaWFsb3V0cy4KICAgICAgICBJbiB0aGlzIG1vZGUsIHRoZSBpbnRlcmZhY2Ugd2lsbCBuZXZlciBtYWtlIGFueSBjb25uZWN0aW9ucyBvbiBpdHMKICAgICAgICBvd24uIFlvdSBtdXN0IGV4cGxpY2l0bHkgaW5pdGlhdGUgYSBjb25uZWN0aW9uIHdpdGggImlzZG5jdHJsIGRpYWwKICAgICAgICBpc2RuMCIuIEhvd2V2ZXIsIGFmdGVyIGFuIGlkbGUgdGltZSBvZiBubyB0cmFmZmljIGFzIGNvbmZpZ3VyZWQgZm9yCgl0aGUgaHVwdGltZW91dCB2YWx1ZSB3aXRoIGlzZG5jdHJsLCB0aGUgY29ubmVjdGlvbiBfd2lsbF8gYmUgZW5kZWQuCglJZiB5b3UgZG9uJ3Qgd2FudCBhbnkgYXV0b21hdGljIGhhbmd1cCwgc2V0IHRoZSBodXB0aW1lb3V0IHZhbHVlIHRvIDAuCiAgICAgICAgIm1hbnVhbCIgaXMgdGhlIGRlZmF1bHQuCgogICBqKSBTZXR1cCB0aGUgaW50ZXJmYWNlIHdpdGggaWZjb25maWcgYXMgdXN1YWwsIGFuZCBzZXQgYSByb3V0ZSB0byBpdC4KCiAgIGspIChvcHRpb25hbCkgSWYgeW91IHJ1biBYMTEgYW5kIGhhdmUgVGNsL1RrLXdpc2ggdmVyc2lvbiA0LjAsIHlvdSBjYW4gdXNlCiAgICAgdGhlIHNjcmlwdCB0b29scy90Y2x0ay9pc2RubW9uLiBZb3UgY2FuIGFkZCBhY3Rpb25zIGZvciBsaW5lLXN0YXR1cwogICAgIGNoYW5nZXMuIFNlZSB0aGUgY29tbWVudHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc2NyaXB0IGZvciBob3cgdG8KICAgICBkbyB0aGF0LiBUaGVyZSBhcmUgb3RoZXIgdHR5LWJhc2VkIHRvb2xzIGluIHRoZSB0b29scy1zdWJkaXJlY3RvcnkKICAgICBjb250cmlidXRlZCBieSBNaWNoYWVsIEtuaWdnZSAoaW1vbiksIFZvbGtlciBH9nR6IChpbW9udHR5KSBhbmQKICAgICBBbmRyZWFzIEtvb2wgKGlzZG5tb24pLgoKICAgbCkgRm9yIGluaXRpYWwgdGVzdGluZywgeW91IGNhbiBzZXQgdGhlIHZlcmJvc2UtbGV2ZWwgdG8gMiAoZGVmYXVsdDogMCkuCiAgICAgIFRoZW4gYWxsIGluY29taW5nIGNhbGxzIGFyZSBsb2dnZWQsIGV2ZW4gaWYgdGhleSBhcmUgbm90IGFkZHJlc3NlZAogICAgICB0byBvbmUgb2YgdGhlIGNvbmZpZ3VyZWQgbmV0LWludGVyZmFjZXM6CiAgICAgIGlzZG5jdHJsIHZlcmJvc2UgMgoKICBOb3cgeW91IGFyZSByZWFkeSEgQSBwaW5nIHRvIHRoZSBzZXQgYWRkcmVzcyBzaG91bGQgbm93IHJlc3VsdCBpbiBhbgogIGF1dG9tYXRpYyBkaWFsLW91dCAobG9vayBhdCBzeXNsb2cga2VybmVsLW1lc3NhZ2VzKS4KICBUaGUgcGhvbmUgbnVtYmVycyBhbmQgRUFacyBjYW4gYmUgYXNzaWduZWQgYXQgYW55IHRpbWUgd2l0aCBpc2RuY3RybC4KICBZb3UgY2FuIGFkZCBhcyBtYW55IGludGVyZmFjZXMgYXMgeW91IGxpa2Ugd2l0aCBhZGRpZiBmb2xsb3dpbmcgdGhlCiAgZGlyZWN0aW9ucyBhYm92ZS4gT2YgY291cnNlLCB0aGVyZSBtYXkgYmUgc29tZSBsaW1pdGF0aW9ucy4gQnV0IHdlIGhhdmUKICB0ZXN0ZWQgYXMgbWFueSBhcyAyMCBpbnRlcmZhY2VzIHdpdGhvdXQgYW55IHByb2JsZW0uIEhvd2V2ZXIsIGlmIHlvdQogIGRvbid0IGdpdmUgYW4gaW50ZXJmYWNlIG5hbWUgdG8gYWRkaWYsIHRoZSAga2VybmVsIHdpbGwgYXNzaWduIGEgbmFtZQogIHdoaWNoIHN0YXJ0cyB3aXRoICJldGgiLiBUaGUgbnVtYmVyIG9mICJldGgiLWludGVyZmFjZXMgaXMgbGltaXRlZCBieQogIHRoZSBrZXJuZWwuCgo1LiBBZGRpdGlvbmFsIG9wdGlvbnMgZm9yIGlzZG5jdHJsOgoKICAgImlzZG5jdHJsIHNlY3VyZSA8SW50ZXJmYWNlTmFtZT4gb24iCiAgIE9ubHkgaW5jb21pbmcgY2FsbHMsIGZvciB3aGljaCB0aGUgY2FsbGVyLWlkIGlzIGxpc3RlZCBpbiB0aGUgYWNjZXNzCiAgIGxpc3Qgb2YgdGhlIGludGVyZmFjZSBhcmUgYWNjZXB0ZWQuIFlvdSBjYW4gYWRkIGNhbGxlci1pZCdzIFdpdGggdGhlCiAgIGNvbW1hbmQgImlzZG5jdHJsIGFkZHBob25lIDxJbnRlcmZhY2VOYW1lPiBpbiA8Y2FsbGVyLWlkPiIKICAgRXVyby1JU0ROIGRvZXMgbm90IHRyYW5zbWl0IHRoZSBsZWFkaW5nICcwJyBvZiB0aGUgY2FsbGVyLWlkIGZvciBhbgogICBpbmNvbWluZyBjYWxsLCB0aGVyZWZvcmUgeW91IHNob3VsZCBjb25maWd1cmUgaXQgYWNjb3JkaW5nbHkuCiAgIElmIHRoZSByZWFsIG51bWJlciBmb3IgdGhlIGRpYWxvdXQgZS5nLiBpcyAiMDkzMTEyMzQ1NjciIHRoZSBudW1iZXIKICAgdG8gY29uZmlndXJlIGhlcmUgaXMgIjkzMTEyMzQ1NjciLiBUaGUgcGF0dGVybi1tYXRjaCBmdW5jdGlvbgogICB3b3JrcyBzaW1pbGFyIHRvIHRoZSBzaGVsbCBtZWNoYW5pc20uCgogICAgID8gICAgIG9uZSBhcmJpdHJhcnkgZGlnaXQKICAgICAqICAgICB6ZXJvIG9yIGFyYml0cmFyeSBtYW55IGRpZ2l0cwogICAgIFsxMjNdIG9uZSBvZiB0aGUgZGlnaXRzIGluIHRoZSBsaXN0CiAgICAgWzEtNV0gb25lIGRpZ2l0IGJldHdlZW4gJzEnIGFuZCAnNScKICAgICAgICAgICBhICdeJyBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIGEgbGlzdCBpbnZlcnRzIHRoZSBsaXN0CgoKICAgImlzZG5jdHJsIHNlY3VyZSA8SW50ZXJmYWNlTmFtZT4gb2ZmIgogICBTd2l0Y2ggb2ZmIHNlY3VyZSBvcGVyYXRpb24gKGRlZmF1bHQpLgoKICAgImlzZG5jdHJsIGlodXAgPEludGVyZmFjZU5hbWU+IFtvbnxvZmZdIgogICBTd2l0Y2ggdGhlIGhhbmctdXAtdGltZXIgZm9yIGluY29taW5nIGNhbGxzIG9uIG9yIG9mZi4KCiAgICJpc2RuY3RybCBlYXogPEludGVyZmFjZU5hbWU+IgogICBSZXR1cm5zIHRoZSBFQVogb2YgYW4gaW50ZXJmYWNlLgoKICAgImlzZG5jdHJsIGRlbHBob25lIDxJbnRlcmZhY2VOYW1lPiBpbnxvdXQgPG51bWJlcj4iCiAgIERlbGV0ZXMgYSBudW1iZXIgZnJvbSBvbmUgb2YgdGhlIGFjY2Vzcy1saXN0cyBvZiB0aGUgaW50ZXJmYWNlLgoKICAgImlzZG5jdHJsIGRlbGlmIDxJbnRlcmZhY2VOYW1lPiIKICAgUmVtb3ZlcyB0aGUgaW50ZXJmYWNlIChhbmQgcG9zc2libGUgc2xhdmVzKSBmcm9tIHRoZSBrZXJuZWwuCiAgIChZb3UgaGF2ZSB0byB1bnJlZ2lzdGVyIGl0IHdpdGggImlmY29uZmlnIDxJbnRlcmZhY2VOYW1lPiBkb3duIiBiZWZvcmUpLgoKICAgImlzZG5jdHJsIGNhbGxiYWNrIDxJbnRlcmZhY2VOYW1lPiBbb258b2ZmXSIKICAgU3dpdGNoZXMgYW4gaW50ZXJmYWNlIHRvIGNhbGxiYWNrLW1vZGUuIEluIHRoaXMgbW9kZSwgYW4gaW5jb21pbmcgY2FsbAogICB3aWxsIGJlIHJlamVjdGVkIGFuZCBhZnRlciB0aGlzIHRoZSByZW1vdGUtc3RhdGlvbiB3aWxsIGJlIGNhbGxlZC4gSWYKICAgeW91IHRlc3QgdGhpcyBmZWF0dXJlIGJ5IHVzaW5nIHBpbmcsIHNvbWUgcm91dGVycyB3aWxsIHJlLWRpYWwgdmVyeQogICBxdWlja2x5LCBzbyB0aGF0IHRoZSBjYWxsYmFjayBmcm9tIGlzZG40bGludXggbWF5IG5vdCBiZSByZWNvZ25pemVkLgogICBJbiB0aGlzIGNhc2UgdXNlIHBpbmcgd2l0aCB0aGUgb3B0aW9uIC1pIDxzZWM+IHRvIGluY3JlYXNlIHRoZSBpbnRlcnZhbAogICBiZXR3ZWVuIGVjaG8tcGFja2V0cy4KCiAgICJpc2RuY3RybCBjYmRlbGF5IDxJbnRlcmZhY2VOYW1lPiBbc2Vjb25kc10iCiAgIFNldHMgdGhlIGRlbGF5IChkZWZhdWx0IDUgc2VjKSBiZXR3ZWVuIGFuIGluY29taW5nIGNhbGwgYW5kIHN0YXJ0IG9mCiAgIGRpYWxpbmcgd2hlbiBjYWxsYmFjayBpcyBlbmFibGVkLgoKICAgImlzZG5jdHJsIGNiaHVwIDxJbnRlcmZhY2VOYW1lPiBbb258b2ZmXSIKICAgVGhpcyBlbmFibGVzIChkZWZhdWx0KSBvciBkaXNhYmxlcyBhbiBhY3RpdmUgaGFuZ3VwIChyZWplY3QpIHdoZW4gZ2V0dGluZyBhbgogICBpbmNvbWluZyBjYWxsIGZvciBhbiBpbnRlcmZhY2Ugd2hpY2ggaXMgY29uZmlndXJlZCBmb3IgY2FsbGJhY2suCgogICAiaXNkbmN0cmwgZW5jYXAgPEludGVyZmFjZU5hbWU+IDxFbmNhcFR5cGU+IgogICBTZWxlY3RzIHRoZSB0eXBlIG9mIHBhY2tldC1lbmNhcHN1bGF0aW9uLiBUaGUgZW5jYXBzdWxhdGlvbiBjYW4gYmUgY2hhbmdlZAogICBvbmx5IHdoaWxlIGFuIGludGVyZmFjZSBpcyBkb3duLgoKICAgQXQgdGhlIG1vbWVudCB0aGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgc3VwcG9ydGVkOgoKICAgcmF3aXAgICAgKERlZmF1bHQpIFNlbGVjdHMgcmF3LUlQLWVuY2Fwc3VsYXRpb24uIFRoaXMgbWVhbnMsIE1BQy1oZWFkZXJzCiAgICAgICAgICAgIGFyZSBzdHJpcHBlZCBvZmYuCiAgIGlwICAgICAgIElQIHdpdGggdHlwZS1maWVsZC4gU2FtZSBhcyBJUCBidXQgdGhlIHR5cGUtZmllbGQgb2YgdGhlIE1BQy1oZWFkZXIKICAgICAgICAgICAgaXMgcHJlc2VydmVkLgogICB4MjVpZmFjZSBYLjI1IGludGVyZmFjZSBlbmNhcHN1bGF0aW9uIChmaXJzdCBieXRlIHNlbWFudGljcyBhcyBkZWZpbmVkIGluCiAgICAgICAgICAgIC4uL25ldHdvcmtpbmcveDI1LWlmYWNlLnR4dCkuIFVzZSB0aGlzIGZvciBydW5uaW5nIHRoZSBsaW51eAogICAgICAgICAgICBYLjI1IG5ldHdvcmsgcHJvdG9jb2wgc3RhY2sgKEFGX1gyNSBzb2NrZXRzKSBvbiB0b3Agb2YgaXNkbi4KICAgY2lzY28taCAgQSBzcGVjaWFsLW1vZGUgZm9yIGNvbW11bmljYXRpbmcgd2l0aCBhIENpc2NvLCB3aGljaCBpcyBjb25maWd1cmVkCiAgICAgICAgICAgIHRvIGRvICJoZGxjIgogICBldGhlcm5ldCBObyBzdHJpcHBpbmcuIFBhY2tldHMgYXJlIHNlbnQgd2l0aCBmdWxsIE1BQy1oZWFkZXIuCiAgICAgICAgICAgIFRoZSBFdGhlcm5ldC1hZGRyZXNzIG9mIHRoZSBpbnRlcmZhY2UgaXMgZmFrZWQsIGZyb20gaXRzCiAgICAgICAgICAgIElQLWFkZHJlc3M6IGZjOmZjOmkxOmkyOmkzOmk0LCB3aGVyZSBpMS00IGFyZSB0aGUgSVAtYWRkci4tdmFsdWVzLgogICBzeW5jcHBwICBTeW5jaHJvbm91cyBQUFAKCiAgIHVpaGRsYyAgIEhETEMgd2l0aCBVSS1mcmFtZS1oZWFkZXIgKGZvciB1c2Ugd2l0aCBET1MgSVNQQSwgb3B0aW9uIC1oMSkKCgogICBOT1RFOiAgICB4MjVpZmFjZSBlbmNhcHN1bGF0aW9uIGlzIGN1cnJlbnRseSBleHBlcmltZW50YWwuIFBsZWFzZQogICAgICAgICAgICByZWFkIFJFQURNRS54MjUgZm9yIGZ1cnRoZXIgZGV0YWlscwoKCiAgIFdhdGNoaW5nIHBhY2tldHMsIHVzaW5nIHN0YW5kYXJkLXRjcGR1bXAgd2lsbCBmYWlsIGZvciBhbGwgZW5jYXBzdWxhdGlvbnMKICAgZXhjZXB0IGV0aGVybmV0IGJlY2F1c2UgdGNwZHVtcCBkb2VzIG5vdCBrbm93IGhvdyB0byBoYW5kbGUgcGFja2V0cwogICB3aXRob3V0IE1BQy1oZWFkZXIuIEEgcGF0Y2ggZm9yIHRjcGR1bXAgaXMgaW5jbHVkZWQgaW4gdGhlIHV0aWxpdHktcGFja2FnZQogICBtZW50aW9uZWQgYWJvdmUuCgogICAiaXNkbmN0cmwgbDJfcHJvdCA8SW50ZXJmYWNlTmFtZT4gPEwyLVByb3RvY29sTmFtZT4iCiAgIFNlbGVjdHMgYSBsYXllci0yLXByb3RvY29sLgogICAoV2l0aCB0aGUgSUNOLWRyaXZlciBhbmQgdGhlIEhpU2F4LWRyaXZlciwgIng3NWkiIGFuZCAiaGRsYyIgaXMgYXZhaWxhYmxlLgogICBXaXRoIG90aGVyIGRyaXZlcnMsICJ4NzV1aSIsICJ4NzVidWkiLCAieDI1ZHRlIiwgIngyNWRjZSIgbWF5IGJlCiAgIHBvc3NpYmxlIHRvby4gU2VlIFJFQURNRS54MjUgZm9yIHgyNSByZWxhdGVkIGwyIHByb3RvY29scy4pCgogICBpc2RuY3RybCBsM19wcm90IDxJbnRlcmZhY2VOYW1lPiA8TDMtUHJvdG9jb2xOYW1lPgogICBUaGUgc2FtZSBmb3IgbGF5ZXItMy4gKEF0IHRoZSBtb21lbnQgb25seSAidHJhbnMiIGlzIGFsbG93ZWQpCgogICAiaXNkbmN0cmwgbGlzdCA8SW50ZXJmYWNlTmFtZT4iCiAgIFNob3dzIGFsbCBwYXJhbWV0ZXJzIG9mIGFuIGludGVyZmFjZSBhbmQgdGhlIGNoYXJnZS1pbmZvLgogICBUcnkgImFsbCIgYXMgdGhlIGludGVyZmFjZSBuYW1lLgoKICAgImlzZG5jdHJsIGhhbmd1cCA8SW50ZXJmYWNlTmFtZT4iCiAgIEZvcmNlcyBoYW5ndXAgb2YgYW4gaW50ZXJmYWNlLgoKICAgImlzZG5jdHJsIGJpbmQgPEludGVyZmFjZU5hbWU+IDxEcml2ZXJJZD4sPENoYW5uZWxOdW1iZXI+IFtleGNsdXNpdmVdIgogICBJZiB5b3UgYXJlIHVzaW5nIG1vcmUgdGhhbiBvbmUgSVNETiBjYXJkLCBpdCBpcyBzb21ldGltZXMgbmVjZXNzYXJ5IHRvCiAgIGRpYWwgb3V0IHVzaW5nIGEgc3BlY2lmaWMgY2FyZCBvciBldmVuIHByZXNlcnZlIGEgc3BlY2lmaWMgY2hhbm5lbCBmb3IKICAgZGlhbG91dCBvZiBhIHNwZWNpZmljIG5ldC1pbnRlcmZhY2UuIFRoaXMgY2FuIGJlIGRvbmUgd2l0aCB0aGUgYWJvdmUKICAgY29tbWFuZC4gUmVwbGFjZSA8RHJpdmVySWQ+IGJ5IHdoYXRldmVyIHlvdSBhc3NpZ25lZCB3aGlsZSBsb2FkaW5nIHRoZQogICBtb2R1bGUuIFRoZSA8Q2hhbm5lbE51bWJlcj4gaXMgY291bnRlZCBmcm9tIHplcm8uIFRoZSB1cHBlciBsaW1pdAogICBkZXBlbmRzIG9uIHRoZSBjYXJkIHVzZWQuIEF0IHRoZSBtb21lbnQgbm8gY2FyZCBzdXBwb3J0cyBtb3JlIHRoYW4KICAgMiBjaGFubmVscywgc28gdGhlIHVwcGVyIGxpbWl0IGlzIG9uZS4KCiAgICJpc2RuY3RybCB1bmJpbmQgPEludGVyZmFjZU5hbWU+IgogICB1bmJpbmRzIGEgcHJldmlvdXNseSBib3VuZCBpbnRlcmZhY2UuCgogICAiaXNkbmN0cmwgYnVzcmVqZWN0IDxEcml2ZXJJZD4gb258b2ZmIgogICBJZiBzd2l0Y2hlZCBvbiwgaXNkbjRsaW51eCByZXBsaWVzIGEgUkVKRUNUIHRvIGluY29taW5nIGNhbGxzLCBpdAogICBjYW5ub3QgbWF0Y2ggdG8gYW55IGNvbmZpZ3VyZWQgaW50ZXJmYWNlLgogICBJZiBzd2l0Y2hlZCBvZmYsIG5vdGhpbmcgaGFwcGVucyBpbiB0aGlzIGNhc2UuCiAgIFlvdSBub3JtYWxseSBzaG91bGQgTk9UIGVuYWJsZSB0aGlzIGZlYXR1cmUsIGlmIHRoZSBJU0ROIGFkYXB0ZXIgaXMgbm90CiAgIHRoZSBvbmx5IGRldmljZSBjb25uZWN0ZWQgdG8gdGhlIFMwLWJ1cy4gT3RoZXJ3aXNlIGl0IGNvdWxkIGhhcHBlbiB0aGF0CiAgIGlzZG40bGludXggcmVqZWN0cyBhbiBpbmNvbWluZyBjYWxsLCB3aGljaCBiZWxvbmdzIHRvIGFub3RoZXIgZGV2aWNlIG9uCiAgIHRoZSBidXMuCgogICAiaXNkbmN0cmwgYWRkc2xhdmUgPEludGVyZmFjZU5hbWU+IDxTbGF2ZU5hbWU+CiAgIENyZWF0ZXMgYSBzbGF2ZSBpbnRlcmZhY2UgZm9yIGNoYW5uZWwtYnVuZGxpbmcuIFNsYXZlIGludGVyZmFjZXMgYXJlCiAgIG5vdCBzZWVuIGJ5IHRoZSBrZXJuZWwsIGJ1dCB0aGVpciBJU0ROLXBhcnQgY2FuIGJlIGNvbmZpZ3VyZWQgd2l0aAogICBpc2RuY3RybCBhcyB1c3VhbC4gKFBob25lIG51bWJlcnMsIEVBWi9NU04sIHRpbWVvdXRzIGV0Yy4pIElmIG1vcmUKICAgdGhhbiB0d28gY2hhbm5lbHMgYXJlIHRvIGJlIGJ1bmRsZWQsIGZlZWwgZnJlZSB0byBjcmVhdGUgYXMgbWFueSBhcyB5b3UKICAgd2FudC4gSW50ZXJmYWNlTmFtZSBtdXN0IGJlIGEgcmVhbCBpbnRlcmZhY2UsIE5PVCBhIHNsYXZlLiBTbGF2ZSBpbnRlcmZhY2VzCiAgIHN0YXJ0IGRpYWxpbmcsIGlmIHRoZSBtYXN0ZXIgaW50ZXJmYWNlIHJlc3AuIHRoZSBwcmV2aW91cyBzbGF2ZSBpbnRlcmZhY2UKICAgaGFzIGEgbG9hZCBvZiBtb3JlIHRoYW4gNzAwMCBjcHMuIFRoZXkgaGFuZ3VwIGlmIHRoZSBsb2FkIGdvZXMgdW5kZXIgNzAwMAogICBjcHMsIGFjY29yZGluZyB0byB0aGVpciAiaHVwdGltZW91dCItcGFyYW1ldGVyLgoKICAgImlzZG5jdHJsIHNkZWxheSA8SW50ZXJmYWNlTmFtZT4gc2Vjcy4iCiAgIFRoaXMgc2V0cyB0aGUgbWluaW11bSB0aW1lIGFuIEludGVyZmFjZSBoYXMgdG8gYmUgZnVsbHkgbG9hZGVkLCB1bnRpbAogICBpdCBzZW5kcyBhIGRpYWwtcmVxdWVzdCB0byBpdHMgc2xhdmUuCgogICAiaXNkbmN0cmwgZGlhbCA8SW50ZXJmYWNlTmFtZT4iCiAgIEZvcmNlcyBhbiBpbnRlcmZhY2UgdG8gc3RhcnQgZGlhbGluZyBldmVuIGlmIG5vIHBhY2tldHMgYXJlIHRvIGJlCiAgIHRyYW5zZmVycmVkLgoKICAgImlzZG5jdHJsIG1hcHBpbmcgPERyaXZlcklkPiBNU04wLE1TTjEsTVNOMiwuLi5NU045IgogICBUaGlzIGluc3RhbGxzIGEgbWFwcGluZyB0YWJsZSBmb3IgRUFaPC0+TVNOLW1hcHBpbmcgZm9yIGEgc2luZ2xlIGxpbmUuCiAgIE1pc3NpbmcgTVNOJ3MgaGF2ZSB0byBiZSBnaXZlbiBhcyAiLSIgb3IgY2FuIGJlIG9taXR0ZWQsIGlmIGF0IHRoZSBlbmQKICAgb2YgdGhlIGNvbW1hbmRsaW5lLgogICBXaXRoIHRoaXMgY29tbWFuZCwgaXQncyBub3cgcG9zc2libGUgdG8gaGF2ZSBhbiBpbnRlcmZhY2UgbGlzdGVuaW5nIHRvCiAgIG1peGVkIDFUUjYtIGFuZCBFdXJvLVR5cGUgbGluZXMuIEluIHRoaXMgY2FzZSwgdGhlIGludGVyZmFjZSBoYXMgdG8gYmUKICAgY29uZmlndXJlZCB0byBhIDFUUjYtdHlwZSBFQVogKG9uZSBkaWdpdCkuIFRoZSBtYXBwaW5nIGlzIGFsc28gdmFsaWQKICAgZm9yIHR0eS1lbXVsYXRpb24uIFNlZW4gZnJvbSB0aGUgaW50ZXJmYWNlL3R0eS1sZXZlbCB0aGUgbWFwcGluZwogICBDQU4gYmUgdXNlZCwgaG93ZXZlciBpdCdzIHBvc3NpYmxlIHRvIHVzZSBzaW5nbGUgdHR5J3MvaW50ZXJmYWNlcyB3aXRoCiAgIHJlYWwgTVNOJ3MgKG1vcmUgZGlnaXRzKSBhbHNvLCBpbiB3aGljaCBjYXNlIHRoZSBtYXBwaW5nIHdpbGwgYmUgaWdub3JlZC4KICAgSGVyZSBpcyBhbiBleGFtcGxlOgoKICAgWW91IGhhdmUgYSAxVFI2LXR5cGUgbGluZSB3aXRoIGJhc2UtbnIuIDEyMzQ1NjcgYW5kIGEgRXVyby1saW5lIHdpdGgKICAgTVNOJ3MgOTg3NjU0LCA5ODc2NTUgYW5kIDk4NzY1Ni4gVGhlIERyaXZlcklkIGZvciB0aGUgRXVyby1saW5lIGlzICJFVVJPIi4KCiAgIGlzZG5jdHJsIG1hcHBpbmcgRVVSTyAtLDk4NzY1NCw5ODc2NTUsOTg3NjU2LC0sOTg3NjU1CiAgIC4uLgogICBpc2RuY3RybCBlYXogaXNkbjAgMSAgICAgICMgbGlzdGVuIG9uIDEyMzQ1NjcxKDF0cjYpIGFuZCA5ODc2NTQoZXVybykKICAgLi4uCiAgIGlzZG5jdHJsIGVheiBpc2RuMSA0ICAgICAgIyBsaXN0ZW4gb24gMTIzNDU2NzQoMXRyNikgb25seS4KICAgLi4uCiAgIGlzZG5jdHJsIGVheiBpc2RuMiA5ODc2NTQgIyBsaXN0ZW4gb24gOTg3NjU0KGV1cm8pIG9ubHkuCgogICBTYW1lIHNjaGVtZSBpcyB1c2VkIHdpdGggQVQmRS4uLiAgYXQgdGhlIHR0eSdzLgoKNi4gSWYgeW91IHdhbnQgdG8gd3JpdGUgYSBuZXcgbG93LWxldmVsLWRyaXZlciwgeW91IGFyZSB3ZWxjb21lLgogICBUaGUgaW50ZXJmYWNlIHRvIHRoZSBsaW5rLWxldmVsLW1vZHVsZSBpcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgSU5URVJGQUNFLgogICBJZiB0aGUgaW50ZXJmYWNlIHNob3VsZCBiZSBleHBhbmRlZCBmb3IgYW55IHJlYXNvbiwgZG9uJ3QgZG8gaXQKICAgb24geW91ciBvd24sIHNlbmQgbWUgYSBtYWlsIGNvbnRhaW5pbmcgdGhlIHByb3Bvc2VkIGNoYW5nZXMgYW5kCiAgIHNvbWUgcmVhc29uaW5nIGFib3V0IHRoZW0uCiAgIElmIG90aGVyIGRyaXZlcnMgd2lsbCBub3QgYmUgYWZmZWN0ZWQsIEkgd2lsbCBpbmNsdWRlIHRoZSBjaGFuZ2VzCiAgIGluIHRoZSBuZXh0IHJlbGVhc2UuCiAgIEZvciBkZXZlbG9wZXJzIG9ubHksIHRoZXJlIGlzIGEgc2Vjb25kIG1haWxpbmctbGlzdC4gV3JpdGUgdG8gbWUKICAgKGZyaXR6QGlzZG40bGludXguZGUpLCBpZiB5b3Ugd2FudCB0byBqb2luIHRoYXQgbGlzdC4KCkhhdmUgZnVuIQoKIC1Gcml0egoK