CiAgICAgICAgICAgICAgICAgICAgU2NhdHRlcmxpc3QgQ3J5cHRvZ3JhcGhpYyBBUEkKICAgICAgICAgICAgICAgICAgIApJTlRST0RVQ1RJT04KClRoZSBTY2F0dGVybGlzdCBDcnlwdG8gQVBJIHRha2VzIHBhZ2UgdmVjdG9ycyAoc2NhdHRlcmxpc3RzKSBhcwphcmd1bWVudHMsIGFuZCB3b3JrcyBkaXJlY3RseSBvbiBwYWdlcy4gIEluIHNvbWUgY2FzZXMgKGUuZy4gRUNCCm1vZGUgY2lwaGVycyksIHRoaXMgd2lsbCBhbGxvdyBmb3IgcGFnZXMgdG8gYmUgZW5jcnlwdGVkIGluLXBsYWNlCndpdGggbm8gY29weWluZy4KCk9uZSBvZiB0aGUgaW5pdGlhbCBnb2FscyBvZiB0aGlzIGRlc2lnbiB3YXMgdG8gcmVhZGlseSBzdXBwb3J0IElQc2VjLApzbyB0aGF0IHByb2Nlc3NpbmcgY2FuIGJlIGFwcGxpZWQgdG8gcGFnZWQgc2tiJ3Mgd2l0aG91dCB0aGUgbmVlZApmb3IgbGluZWFyaXphdGlvbi4KCgpERVRBSUxTCgpBdCB0aGUgbG93ZXN0IGxldmVsIGFyZSBhbGdvcml0aG1zLCB3aGljaCByZWdpc3RlciBkeW5hbWljYWxseSB3aXRoIHRoZQpBUEkuCgonVHJhbnNmb3JtcycgYXJlIHVzZXItaW5zdGFudGlhdGVkIG9iamVjdHMsIHdoaWNoIG1haW50YWluIHN0YXRlLCBoYW5kbGUgYWxsCm9mIHRoZSBpbXBsZW1lbnRhdGlvbiBsb2dpYyAoZS5nLiBtYW5pcHVsYXRpbmcgcGFnZSB2ZWN0b3JzKSBhbmQgcHJvdmlkZSBhbiAKYWJzdHJhY3Rpb24gdG8gdGhlIHVuZGVybHlpbmcgYWxnb3JpdGhtcy4gIEhvd2V2ZXIsIGF0IHRoZSB1c2VyIApsZXZlbCB0aGV5IGFyZSB2ZXJ5IHNpbXBsZS4KCkNvbmNlcHR1YWxseSwgdGhlIEFQSSBsYXllcmluZyBsb29rcyBsaWtlIHRoaXM6CgogIFt0cmFuc2Zvcm0gYXBpXSAgKHVzZXIgaW50ZXJmYWNlKQogIFt0cmFuc2Zvcm0gb3BzXSAgKHBlci10eXBlIGxvZ2ljIGdsdWUgZS5nLiBjaXBoZXIuYywgY29tcHJlc3MuYykKICBbYWxnb3JpdGhtIGFwaV0gIChmb3IgcmVnaXN0ZXJpbmcgYWxnb3JpdGhtcykKICAKVGhlIGlkZWEgaXMgdG8gbWFrZSB0aGUgdXNlciBpbnRlcmZhY2UgYW5kIGFsZ29yaXRobSByZWdpc3RyYXRpb24gQVBJCnZlcnkgc2ltcGxlLCB3aGlsZSBoaWRpbmcgdGhlIGNvcmUgbG9naWMgZnJvbSBib3RoLiAgTWFueSBnb29kIGlkZWFzCmZyb20gZXhpc3RpbmcgQVBJcyBzdWNoIGFzIENyeXB0b2FwaSBhbmQgTmV0dGxlIGhhdmUgYmVlbiBhZGFwdGVkIGZvciB0aGlzLgoKVGhlIEFQSSBjdXJyZW50bHkgc3VwcG9ydHMgdGhyZWUgdHlwZXMgb2YgdHJhbnNmb3JtczogQ2lwaGVycywgRGlnZXN0cyBhbmQKQ29tcHJlc3NvcnMuICBUaGUgY29tcHJlc3Npb24gYWxnb3JpdGhtcyBlc3BlY2lhbGx5IHNlZW0gdG8gYmUgcGVyZm9ybWluZwp2ZXJ5IHdlbGwgc28gZmFyLgoKU3VwcG9ydCBmb3IgaGFyZHdhcmUgY3J5cHRvIGRldmljZXMgdmlhIGFuIGFzeW5jaHJvbm91cyBpbnRlcmZhY2UgaXMKdW5kZXIgZGV2ZWxvcG1lbnQuCgpIZXJlJ3MgYW4gZXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBBUEk6CgoJI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgoJI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgoJI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CgkKCXN0cnVjdCBzY2F0dGVybGlzdCBzZ1syXTsKCWNoYXIgcmVzdWx0WzEyOF07CglzdHJ1Y3QgY3J5cHRvX2hhc2ggKnRmbTsKCXN0cnVjdCBoYXNoX2Rlc2MgZGVzYzsKCQoJdGZtID0gY3J5cHRvX2FsbG9jX2hhc2goIm1kNSIsIDAsIENSWVBUT19BTEdfQVNZTkMpOwoJaWYgKElTX0VSUih0Zm0pKQoJCWZhaWwoKTsKCQkKCS8qIC4uLiBzZXQgdXAgdGhlIHNjYXR0ZXJsaXN0cyAuLi4gKi8KCglkZXNjLnRmbSA9IHRmbTsKCWRlc2MuZmxhZ3MgPSAwOwoJCglpZiAoY3J5cHRvX2hhc2hfZGlnZXN0KCZkZXNjLCAmc2csIDIsIHJlc3VsdCkpCgkJZmFpbCgpOwoJCgljcnlwdG9fZnJlZV9oYXNoKHRmbSk7CgogICAgCk1hbnkgcmVhbCBleGFtcGxlcyBhcmUgYXZhaWxhYmxlIGluIHRoZSByZWdyZXNzaW9uIHRlc3QgbW9kdWxlICh0Y3J5cHQuYykuCgoKQ09ORklHVVJBVElPTiBOT1RFUwoKQXMgVHJpcGxlIERFUyBpcyBwYXJ0IG9mIHRoZSBERVMgbW9kdWxlLCBmb3IgdGhvc2UgdXNpbmcgbW9kdWxhciBidWlsZHMsCmFkZCB0aGUgZm9sbG93aW5nIGxpbmUgdG8gL2V0Yy9tb2Rwcm9iZS5jb25mOgoKICBhbGlhcyBkZXMzX2VkZSBkZXMKClRoZSBOdWxsIGFsZ29yaXRobXMgcmVzaWRlIGluIHRoZSBjcnlwdG9fbnVsbCBtb2R1bGUsIHNvIHRoZXNlIGxpbmVzCnNob3VsZCBhbHNvIGJlIGFkZGVkOgoKICBhbGlhcyBjaXBoZXJfbnVsbCBjcnlwdG9fbnVsbAogIGFsaWFzIGRpZ2VzdF9udWxsIGNyeXB0b19udWxsCiAgYWxpYXMgY29tcHJlc3NfbnVsbCBjcnlwdG9fbnVsbAoKVGhlIFNIQTM4NCBhbGdvcml0aG0gc2hhcmVzIGNvZGUgd2l0aGluIHRoZSBTSEE1MTIgbW9kdWxlLCBzbyB5b3UnbGwKYWxzbyBuZWVkOgogIGFsaWFzIHNoYTM4NCBzaGE1MTIKCgpERVZFTE9QRVIgTk9URVMKClRyYW5zZm9ybXMgbWF5IG9ubHkgYmUgYWxsb2NhdGVkIGluIHVzZXIgY29udGV4dCwgYW5kIGNyeXB0b2dyYXBoaWMKbWV0aG9kcyBtYXkgb25seSBiZSBjYWxsZWQgZnJvbSBzb2Z0aXJxIGFuZCB1c2VyIGNvbnRleHRzLgoKV2hlbiB1c2luZyB0aGUgQVBJIGZvciBjaXBoZXJzLCBwZXJmb3JtYW5jZSB3aWxsIGJlIG9wdGltYWwgaWYgZWFjaApzY2F0dGVybGlzdCBjb250YWlucyBkYXRhIHdoaWNoIGlzIGEgbXVsdGlwbGUgb2YgdGhlIGNpcGhlcidzIGJsb2NrCnNpemUgKHR5cGljYWxseSA4IGJ5dGVzKS4gIFRoaXMgcHJldmVudHMgaGF2aW5nIHRvIGRvIGFueSBjb3B5aW5nCmFjcm9zcyBub24tYWxpZ25lZCBwYWdlIGZyYWdtZW50IGJvdW5kYXJpZXMuCgoKQURESU5HIE5FVyBBTEdPUklUSE1TCgpXaGVuIHN1Ym1pdHRpbmcgYSBuZXcgYWxnb3JpdGhtIGZvciBpbmNsdXNpb24sIGEgbWFuZGF0b3J5IHJlcXVpcmVtZW50CmlzIHRoYXQgYXQgbGVhc3QgYSBmZXcgdGVzdCB2ZWN0b3JzIGZyb20ga25vd24gc291cmNlcyAocHJlZmVyYWJseQpzdGFuZGFyZHMpIGJlIGluY2x1ZGVkLgoKQ29udmVydGluZyBleGlzdGluZyB3ZWxsIGtub3duIGNvZGUgaXMgcHJlZmVycmVkLCBhcyBpdCBpcyBtb3JlIGxpa2VseQp0byBoYXZlIGJlZW4gcmV2aWV3ZWQgYW5kIHdpZGVseSB0ZXN0ZWQuICBJZiBzdWJtaXR0aW5nIGNvZGUgZnJvbSBMR1BMCnNvdXJjZXMsIHBsZWFzZSBjb25zaWRlciBjaGFuZ2luZyB0aGUgbGljZW5zZSB0byBHUEwgKHNlZSBzZWN0aW9uIDMgb2YKdGhlIExHUEwpLgoKQWxnb3JpdGhtcyBzdWJtaXR0ZWQgbXVzdCBhbHNvIGJlIGdlbmVyYWxseSBwYXRlbnQtZnJlZSAoZS5nLiBJREVBCndpbGwgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBtYWlubGluZSB1bnRpbCBhcm91bmQgMjAxMSksIGFuZCBiZSBiYXNlZApvbiBhIHJlY29nbml6ZWQgc3RhbmRhcmQgYW5kL29yIGhhdmUgYmVlbiBzdWJqZWN0ZWQgdG8gYXBwcm9wcmlhdGUKcGVlciByZXZpZXcuCgpBbHNvIGNoZWNrIGZvciBhbnkgUkZDcyB3aGljaCBtYXkgcmVsYXRlIHRvIHRoZSB1c2Ugb2Ygc3BlY2lmaWMgYWxnb3JpdGhtcywKYXMgd2VsbCBhcyBnZW5lcmFsIGFwcGxpY2F0aW9uIG5vdGVzIHN1Y2ggYXMgUkZDMjQ1MSAoIlRoZSBFU1AgQ0JDLU1vZGUKQ2lwaGVyIEFsZ29yaXRobXMiKS4KCkl0J3MgYSBnb29kIGlkZWEgdG8gYXZvaWQgdXNpbmcgbG90cyBvZiBtYWNyb3MgYW5kIHVzZSBpbmxpbmVkIGZ1bmN0aW9ucwppbnN0ZWFkLCBhcyBnY2MgZG9lcyBhIGdvb2Qgam9iIHdpdGggaW5saW5pbmcsIHdoaWxlIGV4Y2Vzc2l2ZSB1c2Ugb2YKbWFjcm9zIGNhbiBjYXVzZSBjb21waWxhdGlvbiBwcm9ibGVtcyBvbiBzb21lIHBsYXRmb3Jtcy4KCkFsc28gY2hlY2sgdGhlIFRPRE8gbGlzdCBhdCB0aGUgd2ViIHNpdGUgbGlzdGVkIGJlbG93IHRvIHNlZSB3aGF0IHBlb3BsZQptaWdodCBhbHJlYWR5IGJlIHdvcmtpbmcgb24uCgoKQlVHUwoKU2VuZCBidWcgcmVwb3J0cyB0bzoKSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1PgpDYzogRGF2aWQgUy4gTWlsbGVyIDxkYXZlbUByZWRoYXQuY29tPgoKCkZVUlRIRVIgSU5GT1JNQVRJT04KCkZvciBmdXJ0aGVyIHBhdGNoZXMgYW5kIHZhcmlvdXMgdXBkYXRlcywgaW5jbHVkaW5nIHRoZSBjdXJyZW50IFRPRE8KbGlzdCwgc2VlOgpodHRwOi8vZ29uZG9yLmFwYW5hLm9yZy5hdS9+aGVyYmVydC9jcnlwdG8vCgoKQVVUSE9SUwoKSmFtZXMgTW9ycmlzCkRhdmlkIFMuIE1pbGxlcgpIZXJiZXJ0IFh1CgoKQ1JFRElUUwoKVGhlIGZvbGxvd2luZyBwZW9wbGUgcHJvdmlkZWQgaW52YWx1YWJsZSBmZWVkYmFjayBkdXJpbmcgdGhlIGRldmVsb3BtZW50Cm9mIHRoZSBBUEk6CgogIEFsZXhleSBLdXpuZXR6b3YKICBSdXN0eSBSdXNzZWxsCiAgSGVyYmVydCBWYWxlcmlvIFJpZWRlbAogIEplZmYgR2FyemlrCiAgTWljaGFlbCBSaWNoYXJkc29uCiAgQW5kcmV3IE1vcnRvbgogIEluZ28gT2VzZXIKICBDaHJpc3RvcGggSGVsbHdpZwoKUG9ydGlvbnMgb2YgdGhpcyBBUEkgd2VyZSBkZXJpdmVkIGZyb20gdGhlIGZvbGxvd2luZyBwcm9qZWN0czoKICAKICBLZXJuZWxpIENyeXB0b2FwaSAoaHR0cDovL3d3dy5rZXJuZWxpLm9yZy8pCiAgICBBbGV4YW5kZXIgS2plbGRhYXMKICAgIEhlcmJlcnQgVmFsZXJpbyBSaWVkZWwKICAgIEt5bGUgTWNNYXJ0aW4KICAgIEplYW4tTHVjIENvb2tlCiAgICBEYXZpZCBCcnlzb24KICAgIENsZW1lbnMgRnJ1aHdpcnRoCiAgICBUb2JpYXMgUmluZ3N0cm9tCiAgICBIYXJhbGQgV2VsdGUKCmFuZDsKICAKICBOZXR0bGUgKGh0dHA6Ly93d3cubHlzYXRvci5saXUuc2Uvfm5pc3NlL25ldHRsZS8pCiAgICBOaWVscyBN9mxsZXIKCk9yaWdpbmFsIGRldmVsb3BlcnMgb2YgdGhlIGNyeXB0byBhbGdvcml0aG1zOgoKICBEYW5hIEwuIEhvdyAoREVTKQogIEFuZHJldyBUcmlkZ2VsbCBhbmQgU3RldmUgRnJlbmNoIChNRDQpCiAgQ29saW4gUGx1bWIgKE1ENSkKICBTdGV2ZSBSZWlkIChTSEExKQogIEplYW4tTHVjIENvb2tlIChTSEEyNTYsIFNIQTM4NCwgU0hBNTEyKQogIEthenVub3JpIE1peWF6YXdhIC8gVVNBR0kgKEhNQUMpCiAgTWF0dGhldyBTa2FsYSAoVHdvZmlzaCkKICBEYWcgQXJuZSBPc3ZpayAoU2VycGVudCkKICBCcmlhbiBHbGFkbWFuIChBRVMpCiAgS2FydGlrZXkgTWFoZW5kcmEgQmhhdHQgKENBU1Q2KQogIEpvbiBPYmVyaGVpZGUgKEFSQzQpCiAgSm91bmkgTWFsaW5lbiAoTWljaGFlbCBNSUMpCiAgTlRUKE5pcHBvbiBUZWxlZ3JhcGggYW5kIFRlbGVwaG9uZSBDb3Jwb3JhdGlvbikgKENhbWVsbGlhKQoKU0hBMSBhbGdvcml0aG0gY29udHJpYnV0b3JzOgogIEplYW4tRnJhbmNvaXMgRGl2ZQogIApERVMgYWxnb3JpdGhtIGNvbnRyaWJ1dG9yczoKICBSYWltYXIgRmFsa2UKICBHaXNsZSBT5mxlbnNtaW5kZQogIE5pZWxzIE32bGxlcgoKQmxvd2Zpc2ggYWxnb3JpdGhtIGNvbnRyaWJ1dG9yczoKICBIZXJiZXJ0IFZhbGVyaW8gUmllZGVsCiAgS3lsZSBNY01hcnRpbgoKVHdvZmlzaCBhbGdvcml0aG0gY29udHJpYnV0b3JzOgogIFdlcm5lciBLb2NoCiAgTWFyYyBNdXR6CgpTSEEyNTYvMzg0LzUxMiBhbGdvcml0aG0gY29udHJpYnV0b3JzOgogIEFuZHJldyBNY0RvbmFsZAogIEt5bGUgTWNNYXJ0aW4KICBIZXJiZXJ0IFZhbGVyaW8gUmllZGVsCiAgCkFFUyBhbGdvcml0aG0gY29udHJpYnV0b3JzOgogIEFsZXhhbmRlciBLamVsZGFhcwogIEhlcmJlcnQgVmFsZXJpbyBSaWVkZWwKICBLeWxlIE1jTWFydGluCiAgQWRhbSBKLiBSaWNodGVyCiAgRnJ1aHdpcnRoIENsZW1lbnMgKGk1ODYpCiAgTGludXMgVG9ydmFsZHMgKGk1ODYpCgpDQVNUNSBhbGdvcml0aG0gY29udHJpYnV0b3JzOgogIEthcnRpa2V5IE1haGVuZHJhIEJoYXR0IChvcmlnaW5hbCBkZXZlbG9wZXJzIHVua25vd24sIEZTRiBjb3B5cmlnaHQpLgoKVEVBL1hURUEgYWxnb3JpdGhtIGNvbnRyaWJ1dG9yczoKICBBYXJvbiBHcm90aGUKICBNaWNoYWVsIFJpbmdlCgpLaGF6YWQgYWxnb3JpdGhtIGNvbnRyaWJ1dG9yczoKICBBYXJvbiBHcm90aGUKCldoaXJscG9vbCBhbGdvcml0aG0gY29udHJpYnV0b3JzOgogIEFhcm9uIEdyb3RoZQogIEplYW4tTHVjIENvb2tlCgpBbnViaXMgYWxnb3JpdGhtIGNvbnRyaWJ1dG9yczoKICBBYXJvbiBHcm90aGUKClRpZ2VyIGFsZ29yaXRobSBjb250cmlidXRvcnM6CiAgQWFyb24gR3JvdGhlCgpWSUEgUGFkTG9jayBjb250cmlidXRvcnM6CiAgTWljaGFsIEx1ZHZpZwoKQ2FtZWxsaWEgYWxnb3JpdGhtIGNvbnRyaWJ1dG9yczoKICBOVFQoTmlwcG9uIFRlbGVncmFwaCBhbmQgVGVsZXBob25lIENvcnBvcmF0aW9uKSAoQ2FtZWxsaWEpCgpHZW5lcmljIHNjYXR0ZXJ3YWxrIGNvZGUgYnkgQWRhbSBKLiBSaWNodGVyIDxhZGFtQHlnZ2RyYXNpbC5jb20+CgpQbGVhc2Ugc2VuZCBhbnkgY3JlZGl0cyB1cGRhdGVzIG9yIGNvcnJlY3Rpb25zIHRvOgpIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+Cgo=