Ly8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCgojaWZuZGVmIFBVQkxJQ19GUERGX0RPQ19IXwojZGVmaW5lIFBVQkxJQ19GUERGX0RPQ19IXwoKI2luY2x1ZGUgImZwZGZ2aWV3LmgiCgovLyBFeHBvcnRlZCBGdW5jdGlvbnMKI2lmZGVmIF9fY3BsdXNwbHVzCmV4dGVybiAiQyIgewojZW5kaWYKCi8vIEZ1bmN0aW9uOiBGUERGQm9va21hcmtfR2V0Rmlyc3RDaGlsZAovLyAgICAgICAgICBHZXQgdGhlIGZpcnN0IGNoaWxkIG9mIGEgYm9va21hcmsgaXRlbSwgb3IgdGhlIGZpcnN0IHRvcCBsZXZlbAovLyAgICAgICAgICBib29rbWFyayBpdGVtLgovLyBQYXJhbWV0ZXJzOgovLyAgICAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIHRoZSBkb2N1bWVudC4gUmV0dXJuZWQgYnkKLy8gICAgICAgICAgRlBERl9Mb2FkRG9jdW1lbnQgb3IgRlBERl9Mb2FkTWVtRG9jdW1lbnQuCi8vICAgICAgICAgIGJvb2ttYXJrICAgIC0gICBIYW5kbGUgdG8gdGhlIGN1cnJlbnQgYm9va21hcmsuIENhbiBiZSBOVUxMIGlmIHlvdQovLyAgICAgICAgICB3YW50IHRvIGdldCB0aGUgZmlyc3QgdG9wIGxldmVsIGl0ZW0uCi8vIFJldHVybiB2YWx1ZToKLy8gICAgICAgICAgSGFuZGxlIHRvIHRoZSBmaXJzdCBjaGlsZCBvciB0b3AgbGV2ZWwgYm9va21hcmsgaXRlbS4gTlVMTCBpZiBubwovLyAgICAgICAgICBjaGlsZCBvciB0b3AgbGV2ZWwgYm9va21hcmsgZm91bmQuCi8vCkRMTEVYUE9SVCBGUERGX0JPT0tNQVJLIFNURENBTEwKRlBERkJvb2ttYXJrX0dldEZpcnN0Q2hpbGQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9CT09LTUFSSyBib29rbWFyayk7CgovLyBGdW5jdGlvbjogRlBERkJvb2ttYXJrX0dldE5leHRTaWJsaW5nCi8vICAgICAgICAgIEdldCBuZXh0IGJvb2ttYXJrIGl0ZW0gYXQgdGhlIHNhbWUgbGV2ZWwuCi8vIFBhcmFtZXRlcnM6Ci8vICAgICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gdGhlIGRvY3VtZW50LiBSZXR1cm5lZCBieQovLyAgICAgICAgICBGUERGX0xvYWREb2N1bWVudCBvciBGUERGX0xvYWRNZW1Eb2N1bWVudC4KLy8gICAgICAgICAgYm9va21hcmsgICAgLSAgIEhhbmRsZSB0byB0aGUgY3VycmVudCBib29rbWFyay4gQ2Fubm90IGJlIE5VTEwuCi8vIFJldHVybiB2YWx1ZToKLy8gICAgICAgICAgSGFuZGxlIHRvIHRoZSBuZXh0IGJvb2ttYXJrIGl0ZW0gYXQgdGhlIHNhbWUgbGV2ZWwuIE5VTEwgaWYgdGhpcyBpcwovLyAgICAgICAgICB0aGUgbGFzdCBib29rbWFyayBhdCB0aGlzIGxldmVsLgovLwpETExFWFBPUlQgRlBERl9CT09LTUFSSyBTVERDQUxMCkZQREZCb29rbWFya19HZXROZXh0U2libGluZyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX0JPT0tNQVJLIGJvb2ttYXJrKTsKCi8vIEZ1bmN0aW9uOiBGUERGQm9va21hcmtfR2V0VGl0bGUKLy8gICAgICAgICAgR2V0IHRpdGxlIG9mIGEgYm9va21hcmsuCi8vIFBhcmFtZXRlcnM6Ci8vICAgICAgICAgIGJvb2ttYXJrICAgIC0gICBIYW5kbGUgdG8gdGhlIGJvb2ttYXJrLgovLyAgICAgICAgICBidWZmZXIgICAgICAtICAgQnVmZmVyIGZvciB0aGUgdGl0bGUuIENhbiBiZSBOVUxMLgovLyAgICAgICAgICBidWZsZW4gICAgICAtICAgVGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyIGluIGJ5dGVzLiBDYW4gYmUgMC4KLy8gUmV0dXJuIHZhbHVlOgovLyAgICAgICAgICBOdW1iZXIgb2YgYnl0ZXMgdGhlIHRpdGxlIGNvbnN1bWVzLCBpbmNsdWRpbmcgdHJhaWxpbmcgemVyb3MuCi8vIENvbW1lbnRzOgovLyAgICAgICAgICBSZWdhcmRsZXNzIG9mIHRoZSBwbGF0Zm9ybSwgdGhlIHRpdGxlIGlzIGFsd2F5cyBpbiBVVEYtMTZMRQovLyAgICAgICAgICBlbmNvZGluZy4gVGhhdCBtZWFucyB0aGUgYnVmZmVyCi8vICAgICAgICAgIGNhbiBiZSB0cmVhdGVkIGFzIGFuIGFycmF5IG9mIFdPUkQgKG9uIEludGVsIGFuZCBjb21wYXRpYmxlIENQVXMpLAovLyAgICAgICAgICBlYWNoIFdPUkQgcmVwcmVzZW50aW5nIHRoZSBVbmljb2RlIG9mCi8vICAgICAgICAgIGEgY2hhcmFjdGVyKHNvbWUgc3BlY2lhbCBVbmljb2RlIG1heSB0YWtlIDIgV09SRHMpLlRoZSBzdHJpbmcgaXMKLy8gICAgICAgICAgZm9sbG93ZWQgYnkgdHdvIGJ5dGVzIG9mIHplcm8KLy8gICAgICAgICAgaW5kaWNhdGluZyB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCi8vCi8vICAgICAgICAgIFRoZSByZXR1cm4gdmFsdWUgYWx3YXlzIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvcgovLyAgICAgICAgICB0aGUgYnVmZmVyLCBldmVuIGlmIG5vIGJ1ZmZlciBpcyBzcGVjaWZpZWQKLy8gICAgICAgICAgb3IgdGhlIGJ1ZmZlciBzaXplIGlzIGxlc3MgdGhlbiByZXF1aXJlZC4gSW4gdGhlc2UgY2FzZXMsIHRoZSBidWZmZXIKLy8gICAgICAgICAgd2lsbCBub3QgYmUgbW9kaWZpZWQuCi8vCkRMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwgRlBERkJvb2ttYXJrX0dldFRpdGxlKEZQREZfQk9PS01BUksgYm9va21hcmssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBidWZsZW4pOwoKLy8gRnVuY3Rpb246IEZQREZCb29rbWFya19GaW5kCi8vICAgICAgICAgIEZpbmQgYSBib29rbWFyayBpbiB0aGUgZG9jdW1lbnQsIHVzaW5nIHRoZSBib29rbWFyayB0aXRsZS4KLy8gUGFyYW1ldGVyczoKLy8gICAgICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byB0aGUgZG9jdW1lbnQuIFJldHVybmVkIGJ5Ci8vICAgICAgICAgIEZQREZfTG9hZERvY3VtZW50IG9yIEZQREZfTG9hZE1lbURvY3VtZW50LgovLyAgICAgICAgICB0aXRsZSAgICAgICAtICAgVGhlIFVURi0xNkxFIGVuY29kZWQgVW5pY29kZSBzdHJpbmcgZm9yIHRoZSBib29rbWFyawovLyAgICAgICAgICB0aXRsZSB0byBiZSBzZWFyY2hlZC4gQ2FuJ3QgYmUgTlVMTC4KLy8gUmV0dXJuIHZhbHVlOgovLyAgICAgICAgICBIYW5kbGUgdG8gdGhlIGZvdW5kIGJvb2ttYXJrIGl0ZW0uIE5VTEwgaWYgdGhlIHRpdGxlIGNhbid0IGJlIGZvdW5kLgovLyBDb21tZW50czoKLy8gICAgICAgICAgSXQgYWx3YXlzIHJldHVybnMgdGhlIGZpcnN0IGZvdW5kIGJvb2ttYXJrIGlmIG1vcmUgdGhhbiBvbmUKLy8gICAgICAgICAgYm9va21hcmtzIGhhdmUgdGhlIHNhbWUgdGl0bGUuCi8vCkRMTEVYUE9SVCBGUERGX0JPT0tNQVJLIFNURENBTEwgRlBERkJvb2ttYXJrX0ZpbmQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgdGl0bGUpOwoKLy8gRnVuY3Rpb246IEZQREZCb29rbWFya19HZXREZXN0Ci8vICAgICAgICAgIEdldCB0aGUgZGVzdGluYXRpb24gYXNzb2NpYXRlZCB3aXRoIGEgYm9va21hcmsgaXRlbS4KLy8gUGFyYW1ldGVyczoKLy8gICAgICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byB0aGUgZG9jdW1lbnQuCi8vICAgICAgICAgIGJvb2ttYXJrICAgIC0gICBIYW5kbGUgdG8gdGhlIGJvb2ttYXJrLgovLyBSZXR1cm4gdmFsdWU6Ci8vICAgICAgICAgIEhhbmRsZSB0byB0aGUgZGVzdGluYXRpb24gZGF0YS4gTlVMTCBpZiBubyBkZXN0aW5hdGlvbiBpcyBhc3NvY2lhdGVkCi8vICAgICAgICAgIHdpdGggdGhpcyBib29rbWFyay4KLy8KRExMRVhQT1JUIEZQREZfREVTVCBTVERDQUxMIEZQREZCb29rbWFya19HZXREZXN0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JPT0tNQVJLIGJvb2ttYXJrKTsKCi8vIEZ1bmN0aW9uOiBGUERGQm9va21hcmtfR2V0QWN0aW9uCi8vICAgICAgICAgIEdldCB0aGUgYWN0aW9uIGFzc29jaWF0ZWQgd2l0aCBhIGJvb2ttYXJrIGl0ZW0uCi8vIFBhcmFtZXRlcnM6Ci8vICAgICAgICAgIGJvb2ttYXJrICAgIC0gICBIYW5kbGUgdG8gdGhlIGJvb2ttYXJrLgovLyBSZXR1cm4gdmFsdWU6Ci8vICAgICAgICAgIEhhbmRsZSB0byB0aGUgYWN0aW9uIGRhdGEuIE5VTEwgaWYgbm8gYWN0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzCi8vICAgICAgICAgIGJvb2ttYXJrLiBJbiB0aGlzIGNhc2UsIHRoZQovLyAgICAgICAgICBhcHBsaWNhdGlvbiBzaG91bGQgdHJ5IEZQREZCb29rbWFya19HZXREZXN0LgovLwpETExFWFBPUlQgRlBERl9BQ1RJT04gU1REQ0FMTCBGUERGQm9va21hcmtfR2V0QWN0aW9uKEZQREZfQk9PS01BUksgYm9va21hcmspOwoKI2RlZmluZSBQREZBQ1RJT05fVU5TVVBQT1JURUQgMCAgLy8gVW5zdXBwb3J0ZWQgYWN0aW9uIHR5cGUuCiNkZWZpbmUgUERGQUNUSU9OX0dPVE8gMSAgICAgICAgIC8vIEdvIHRvIGEgZGVzdGluYXRpb24gd2l0aGluIGN1cnJlbnQgZG9jdW1lbnQuCiNkZWZpbmUgUERGQUNUSU9OX1JFTU9URUdPVE8gMiAgIC8vIEdvIHRvIGEgZGVzdGluYXRpb24gd2l0aGluIGFub3RoZXIgZG9jdW1lbnQuCiNkZWZpbmUgUERGQUNUSU9OX1VSSSBcCiAgMyAgLy8gVW5pdmVyc2FsIFJlc291cmNlIElkZW50aWZpZXIsIGluY2x1ZGluZyB3ZWIgcGFnZXMgYW5kCiAgICAgLy8gb3RoZXIgSW50ZXJuZXQgYmFzZWQgcmVzb3VyY2VzLgojZGVmaW5lIFBERkFDVElPTl9MQVVOQ0ggNCAgLy8gTGF1bmNoIGFuIGFwcGxpY2F0aW9uIG9yIG9wZW4gYSBmaWxlLgoKLy8gRnVuY3Rpb246IEZQREZBY3Rpb25fR2V0VHlwZQovLyAgICAgICAgICBHZXQgdHlwZSBvZiBhbiBhY3Rpb24uCi8vIFBhcmFtZXRlcnM6Ci8vICAgICAgICAgIGFjdGlvbiAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGFjdGlvbi4KLy8gUmV0dXJuIHZhbHVlOgovLyAgICAgICAgICBBIHR5cGUgbnVtYmVyIGFzIGRlZmluZWQgYWJvdmUuCi8vCkRMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwgRlBERkFjdGlvbl9HZXRUeXBlKEZQREZfQUNUSU9OIGFjdGlvbik7CgovLyBGdW5jdGlvbjogRlBERkFjdGlvbl9HZXREZXN0Ci8vICAgICAgICAgIEdldCBkZXN0aW5hdGlvbiBvZiBhbiBhY3Rpb24uCi8vIFBhcmFtZXRlcnM6Ci8vICAgICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gdGhlIGRvY3VtZW50LgovLyAgICAgICAgICBhY3Rpb24gICAgICAtICAgSGFuZGxlIHRvIHRoZSBhY3Rpb24uIEl0IG11c3QgYmUgYSBHT1RPIG9yCi8vICAgICAgICAgIFJFTU9URUdPVE8gYWN0aW9uLgovLyBSZXR1cm4gdmFsdWU6Ci8vICAgICAgICAgIEhhbmRsZSB0byB0aGUgZGVzdGluYXRpb24gZGF0YS4KLy8gQ29tbWVudHM6Ci8vICAgICAgICAgIEluIGNhc2Ugb2YgcmVtb3RlIGdvdG8gYWN0aW9uLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGZpcnN0IHVzZQovLyAgICAgICAgICBGUERGQWN0aW9uX0dldEZpbGVQYXRoIHRvCi8vICAgICAgICAgIGdldCBmaWxlIHBhdGgsIHRoZW4gbG9hZCB0aGF0IHBhcnRpY3VsYXIgZG9jdW1lbnQsIGFuZCB1c2UgaXRzCi8vICAgICAgICAgIGRvY3VtZW50IGhhbmRsZSB0byBjYWxsIHRoaXMKLy8gICAgICAgICAgZnVuY3Rpb24uCi8vCkRMTEVYUE9SVCBGUERGX0RFU1QgU1REQ0FMTCBGUERGQWN0aW9uX0dldERlc3QoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0FDVElPTiBhY3Rpb24pOwoKLy8gRnVuY3Rpb246IEZQREZBY3Rpb25fR2V0VVJJUGF0aAovLyAgICAgICAgICBHZXQgVVJJIHBhdGggb2YgYSBVUkkgYWN0aW9uLgovLyBQYXJhbWV0ZXJzOgovLyAgICAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIHRoZSBkb2N1bWVudC4KLy8gICAgICAgICAgYWN0aW9uICAgICAgLSAgIEhhbmRsZSB0byB0aGUgYWN0aW9uLiBNdXN0IGJlIGEgVVJJIGFjdGlvbi4KLy8gICAgICAgICAgYnVmZmVyICAgICAgLSAgIEEgYnVmZmVyIGZvciBvdXRwdXQgdGhlIHBhdGggc3RyaW5nLiBDYW4gYmUgTlVMTC4KLy8gICAgICAgICAgYnVmbGVuICAgICAgLSAgIFRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciwgbnVtYmVyIG9mIGJ5dGVzLiBDYW4gYmUgMC4KLy8gUmV0dXJuIHZhbHVlOgovLyAgICAgICAgICBOdW1iZXIgb2YgYnl0ZXMgdGhlIFVSSSBwYXRoIGNvbnN1bWVzLCBpbmNsdWRpbmcgdHJhaWxpbmcgemVyb3MuCi8vIENvbW1lbnRzOgovLyAgICAgICAgICBUaGUgVVJJIHBhdGggaXMgYWx3YXlzIGVuY29kZWQgaW4gNy1iaXQgQVNDSUkuCi8vCi8vICAgICAgICAgIFRoZSByZXR1cm4gdmFsdWUgYWx3YXlzIGluZGljYXRlZCBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZQovLyAgICAgICAgICBidWZmZXIsIGV2ZW4gd2hlbiB0aGVyZSBpcwovLyAgICAgICAgICBubyBidWZmZXIgc3BlY2lmaWVkLCBvciB0aGUgYnVmZmVyIHNpemUgaXMgbGVzcyB0aGVuIHJlcXVpcmVkLiBJbgovLyAgICAgICAgICB0aGlzIGNhc2UsIHRoZSBidWZmZXIgd2lsbCBub3QKLy8gICAgICAgICAgYmUgbW9kaWZpZWQuCi8vCkRMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwgRlBERkFjdGlvbl9HZXRVUklQYXRoKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQUNUSU9OIGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJ1Zmxlbik7CgovLyBGdW5jdGlvbjogRlBERkRlc3RfR2V0UGFnZUluZGV4Ci8vICAgICAgICAgIEdldCBwYWdlIGluZGV4IG9mIGEgZGVzdGluYXRpb24uCi8vIFBhcmFtZXRlcnM6Ci8vICAgICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gdGhlIGRvY3VtZW50LgovLyAgICAgICAgICBkZXN0ICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBkZXN0aW5hdGlvbi4KLy8gUmV0dXJuIHZhbHVlOgovLyAgICAgICAgICBUaGUgcGFnZSBpbmRleC4gU3RhcnRpbmcgZnJvbSAwIGZvciB0aGUgZmlyc3QgcGFnZS4KLy8KRExMRVhQT1JUIHVuc2lnbmVkIGxvbmcgU1REQ0FMTCBGUERGRGVzdF9HZXRQYWdlSW5kZXgoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9ERVNUIGRlc3QpOwoKLy8gRnVuY3Rpb246IEZQREZMaW5rX0dldExpbmtBdFBvaW50Ci8vICAgICBGaW5kIGEgbGluayBhdCBzcGVjaWZpZWQgcG9pbnQgb24gYSBkb2N1bWVudCBwYWdlLgovLyBQYXJhbWV0ZXJzOgovLyAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgZG9jdW1lbnQgcGFnZS4KLy8gICAgIHggICAgICAgICAgIC0gICBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBwb2ludCwgc3BlY2lmaWVkIGluIHBhZ2UKLy8gICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlIHN5c3RlbS4KLy8gICAgIHkgICAgICAgICAgIC0gICBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBwb2ludCwgc3BlY2lmaWVkIGluIHBhZ2UKLy8gICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlIHN5c3RlbS4KLy8gUmV0dXJuIHZhbHVlOgovLyAgICAgSGFuZGxlIHRvIHRoZSBsaW5rLiBOVUxMIGlmIG5vIGxpbmsgZm91bmQgYXQgdGhhdCBwb2ludC4KLy8gQ29tbWVudHM6Ci8vICAgICBUaGUgcG9pbnQgY29vcmRpbmF0ZXMgYXJlIHNwZWNpZmllZCBpbiBwYWdlIGNvb3JkaW5hdGUgc3lzdGVtLiBZb3UgY2FuCi8vICAgICBjb252ZXJ0IGNvb3JkaW5hdGVzIGZyb20gc2NyZWVuIHN5c3RlbSB0byBwYWdlIHN5c3RlbSB1c2luZwovLyAgICAgRlBERl9EZXZpY2VUb1BhZ2UoKS4KLy8KLy8gTm90ZXM6Ci8vICAgICBUaGUgbWV0aG9kIGNhbiBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUgZm9yIHRoZSBkb2N1bWVudCBjb25zaXN0cyBvZgovLyAgICAgZHluYW1pYyBYRkEgZmllbGRzLgovLwpETExFWFBPUlQgRlBERl9MSU5LIFNURENBTEwgRlBERkxpbmtfR2V0TGlua0F0UG9pbnQoRlBERl9QQUdFIHBhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB5KTsKCi8vIEZ1bmN0aW9uOiBGUERGTGlua19HZXRMaW5rWk9yZGVyQXRQb2ludAovLyAgICAgRmluZCB0aGUgei1vcmRlciBvZiBhIGxpbmsgYXQgc3BlY2lmaWVkIHBvaW50IG9uIGEgZG9jdW1lbnQgcGFnZS4KLy8gUGFyYW1ldGVyczoKLy8gICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGRvY3VtZW50IHBhZ2UuCi8vICAgICB4ICAgICAgICAgICAtICAgVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQsIHNwZWNpZmllZCBpbiBwYWdlCi8vICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZSBzeXN0ZW0uCi8vICAgICB5ICAgICAgICAgICAtICAgVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQsIHNwZWNpZmllZCBpbiBwYWdlCi8vICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZSBzeXN0ZW0uCi8vIFJldHVybiB2YWx1ZToKLy8gICAgIFotb3JkZXIgb2YgdGhlIGxpbmssIG9yIC0xIGlmIG5vIGxpbmsgZm91bmQgYXQgdGhhdCBwb2ludC4KLy8gICAgIEhpZ2hlciBudW1iZXJzIGFyZSBjbG9zZXIgdG8gdGhlIGZyb250LgovLyBDb21tZW50czoKLy8gICAgIFRoZSBwb2ludCBjb29yZGluYXRlcyBhcmUgc3BlY2lmaWVkIGluIHBhZ2UgY29vcmRpbmF0ZSBzeXN0ZW0uIFlvdSBjYW4KLy8gICAgIGNvbnZlcnQgY29vcmRpbmF0ZXMgZnJvbSBzY3JlZW4gc3lzdGVtIHRvIHBhZ2Ugc3lzdGVtIHVzaW5nCi8vICAgICBGUERGX0RldmljZVRvUGFnZSgpLgovLwovLyBOb3RlczoKLy8gICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mCi8vICAgICBkeW5hbWljIFhGQSBmaWVsZHMuCi8vCi8vCkRMTEVYUE9SVCBpbnQgU1REQ0FMTApGUERGTGlua19HZXRMaW5rWk9yZGVyQXRQb2ludChGUERGX1BBR0UgcGFnZSwgZG91YmxlIHgsIGRvdWJsZSB5KTsKCi8vIEZ1bmN0aW9uOiBGUERGTGlua19HZXREZXN0Ci8vICAgICAgICAgIEdldCBkZXN0aW5hdGlvbiBpbmZvIG9mIGEgbGluay4KLy8gUGFyYW1ldGVyczoKLy8gICAgICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byB0aGUgZG9jdW1lbnQuCi8vICAgICAgICAgIGxpbmsgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGxpbmsuIFJldHVybmVkIGJ5Ci8vICAgICAgICAgIEZQREZMaW5rX0dldExpbmtBdFBvaW50LgovLyBSZXR1cm4gdmFsdWU6Ci8vICAgICAgICAgIEhhbmRsZSB0byB0aGUgZGVzdGluYXRpb24uIE5VTEwgaWYgdGhlcmUgaXMgbm8gZGVzdGluYXRpb24KLy8gICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLCBpbiB0aGlzIGNhc2UKLy8gICAgICAgICAgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCB0cnkgRlBERkxpbmtfR2V0QWN0aW9uLgovLwpETExFWFBPUlQgRlBERl9ERVNUIFNURENBTEwgRlBERkxpbmtfR2V0RGVzdChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0xJTksgbGluayk7CgovLyBGdW5jdGlvbjogRlBERkxpbmtfR2V0QWN0aW9uCi8vICAgICAgICAgIEdldCBhY3Rpb24gaW5mbyBvZiBhIGxpbmsuCi8vIFBhcmFtZXRlcnM6Ci8vICAgICAgICAgIGxpbmsgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGxpbmsuCi8vIFJldHVybiB2YWx1ZToKLy8gICAgICAgICAgSGFuZGxlIHRvIHRoZSBhY3Rpb24uIE5VTEwgaWYgdGhlcmUgaXMgbm8gYWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUKLy8gICAgICAgICAgbGluay4KLy8KRExMRVhQT1JUIEZQREZfQUNUSU9OIFNURENBTEwgRlBERkxpbmtfR2V0QWN0aW9uKEZQREZfTElOSyBsaW5rKTsKCi8vIEZ1bmN0aW9uOiBGUERGTGlua19FbnVtZXJhdGUKLy8gICAgICAgICAgVGhpcyBmdW5jdGlvbiB3b3VsZCBlbnVtZXJhdGUgYWxsIHRoZSBsaW5rIGFubm90YXRpb25zIGluIGEgc2luZ2xlCi8vICAgICAgICAgIFBERiBwYWdlLgovLyBQYXJhbWV0ZXJzOgovLyAgICAgICAgICBwYWdlW2luXSAgICAgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuCi8vICAgICAgICAgIHN0YXJ0UG9zW2luLG91dF0gICAgLSAgIFRoZSBzdGFydCBwb3NpdGlvbiB0byBlbnVtZXJhdGUgdGhlIGxpbmsKLy8gICAgICAgICAgYW5ub3RhdGlvbnMsIHdoaWNoIHNob3VsZCBiZSBzcGVjaWZpZWQgdG8gc3RhcnQgZnJvbQovLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gICAwIGZvciB0aGUgZmlyc3QgY2FsbCwgYW5kIHdvdWxkIHJlY2VpdmUgdGhlCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBwb3NpdGlvbiBmb3IgZW51bWVyYXRpbmcgdG8gc3RhcnQgZnJvbS4KLy8gICAgICAgICAgbGlua0Fubm90W291dF0gICAgICAtICAgUmVjZWl2ZSB0aGUgbGluayBoYW5kbGUuCi8vIFJldHVybiB2YWx1ZToKLy8gICAgICAgICAgVFJVRSBpZiBzdWNjY2VlZCwgZWxzZSBGYWxzZTsKLy8gTm90ZXM6Ci8vICAgICAgICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mCi8vICAgICAgICAgIGR5bmFtaWMgWEZBIGZpZWxkcy4KLy8KRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZMaW5rX0VudW1lcmF0ZShGUERGX1BBR0UgcGFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHN0YXJ0UG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfTElOSyogbGlua0Fubm90KTsKCi8vIEZ1bmN0aW9uOiBGUERGTGlua19HZXRBbm5vdFJlY3QKLy8gICAgICAgICAgR2V0IHRoZSBhbm5vdGF0aW9uIHJlY3RhbmdsZS4gKFNwZWNpZmllZCBieSB0aGUgobBSZWN0obEgZW50cnkgb2YKLy8gICAgICAgICAgYW5ub3RhdGlvbiBkaWN0aW9uYXJ5KS4KLy8gUGFyYW1ldGVyczoKLy8gICAgICAgICAgbGlua0Fubm90W2luXSAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBsaW5rIGFubm90YXRpb24uCi8vICAgICAgICAgIHJlY3Rbb3V0XSAgICAgICAgICAgLSAgIFRoZSBhbm5vdGF0aW9uIHJlY3QuCi8vIFJldHVybiB2YWx1ZToKLy8gICAgICAgICAgVFJVRSBpZiBzdWNjY2VlZCwgZWxzZSBGYWxzZTsKLy8KRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZMaW5rX0dldEFubm90UmVjdChGUERGX0xJTksgbGlua0Fubm90LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTX1JFQ1RGKiByZWN0KTsKCi8vIEZ1bmN0aW9uOiBGUERGTGlua19Db3VudFF1YWRQb2ludHMKLy8gICAgICAgICAgR2V0IHRoZSBjb3VudCBvZiBxdWFkcmlsYXRlcmFsIHBvaW50cyB0byB0aGUgbGluayBhbm5vdGF0aW9uLgovLyBQYXJhbWV0ZXJzOgovLyAgICAgICAgICBsaW5rQW5ub3RbaW5dICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGxpbmsgYW5ub3RhdGlvbi4KLy8gUmV0dXJuIHZhbHVlOgovLyAgICAgICAgICBUaGUgY291bnQgb2YgcXVhZHJpbGF0ZXJhbCBwb2ludHMuCi8vCkRMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGTGlua19Db3VudFF1YWRQb2ludHMoRlBERl9MSU5LIGxpbmtBbm5vdCk7CgovKiBfRlNfREVGX1NUUlVDVFVSRV9RVUFEUE9JTlRTRl8gKi8KI2lmbmRlZiBfRlNfREVGX1NUUlVDVFVSRV9RVUFEUE9JTlRTRl8KI2RlZmluZSBfRlNfREVGX1NUUlVDVFVSRV9RVUFEUE9JTlRTRl8KdHlwZWRlZiBzdHJ1Y3QgX0ZTX1FVQURQT0lOVFNGIHsKICBGU19GTE9BVCB4MTsKICBGU19GTE9BVCB5MTsKICBGU19GTE9BVCB4MjsKICBGU19GTE9BVCB5MjsKICBGU19GTE9BVCB4MzsKICBGU19GTE9BVCB5MzsKICBGU19GTE9BVCB4NDsKICBGU19GTE9BVCB5NDsKfSBGU19RVUFEUE9JTlRTRjsKI2VuZGlmIC8qIF9GU19ERUZfU1RSVUNUVVJFX1FVQURQT0lOVFNGXyAqLwoKLy8gRnVuY3Rpb246IEZQREZMaW5rX0dldFF1YWRQb2ludHMKLy8gICAgICAgICAgR2V0IHRoZSBxdWFkcmlsYXRlcmFsIHBvaW50cyBmb3IgdGhlIHNwZWNpZmllZCBpbmRleCBpbiB0aGUgbGluawovLyAgICAgICAgICBhbm5vdGF0aW9uLgovLyBQYXJhbWV0ZXJzOgovLyAgICAgICAgICBsaW5rQW5ub3RbaW5dICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGxpbmsgYW5ub3RhdGlvbi4KLy8gICAgICAgICAgcXVhZEluZGV4W2luXSAgICAgICAtICAgVGhlIHNwZWNpZmllZCBxdWFkIHBvaW50cyBpbmRleC4KLy8gICAgICAgICAgcXVhZFBvaW50c1tvdXRdICAgICAtICAgUmVjZWl2ZSB0aGUgcXVhZHJpbGF0ZXJhbCBwb2ludHMuCi8vIFJldHVybiB2YWx1ZToKLy8gICAgICAgICAgVHJ1ZSBpZiBzdWNjZWVkLCBlbHNlIEZhbHNlLgovLwpETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERkxpbmtfR2V0UXVhZFBvaW50cyhGUERGX0xJTksgbGlua0Fubm90LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcXVhZEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19RVUFEUE9JTlRTRiogcXVhZFBvaW50cyk7CgovLyBGdW5jdGlvbjogRlBERl9HZXRNZXRhVGV4dAovLyAgICAgICAgICBHZXQgYSB0ZXh0IGZyb20gbWV0YSBkYXRhIG9mIHRoZSBkb2N1bWVudC4gUmVzdWx0IGlzIGVuY29kZWQgaW4KLy8gICAgICAgICAgVVRGLTE2TEUuCi8vIFBhcmFtZXRlcnM6Ci8vICAgICAgICAgIGRvYyAgICAgICAgIC0gICBIYW5kbGUgdG8gYSBkb2N1bWVudAovLyAgICAgICAgICB0YWcgICAgICAgICAtICAgVGhlIHRhZyBmb3IgdGhlIG1ldGEgZGF0YS4gQ3VycmVudGx5LCBJdCBjYW4gYmUKLy8gICAgICAgICAgIlRpdGxlIiwgIkF1dGhvciIsCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAiU3ViamVjdCIsICJLZXl3b3JkcyIsICJDcmVhdG9yIiwgIlByb2R1Y2VyIiwKLy8gICAgICAgICAgICAgICAgICAgICAgICAgICJDcmVhdGlvbkRhdGUiLCBvciAiTW9kRGF0ZSIuCi8vICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgZGV0YWlsZWQgZXhwbGFuYXRpb24gb2YgdGhlc2UgdGFncyBhbmQgdGhlaXIKLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BlY3RpdmUgdmFsdWVzLAovLyAgICAgICAgICAgICAgICAgICAgICAgICAgcGxlYXNlIHJlZmVyIHRvIFBERiBSZWZlcmVuY2UgMS42LCBzZWN0aW9uIDEwLjIuMSwKLy8gICAgICAgICAgICAgICAgICAgICAgICAgICJEb2N1bWVudCBJbmZvcm1hdGlvbiBEaWN0aW9uYXJ5Ii4KLy8gICAgICAgICAgYnVmZmVyICAgICAgLSAgIEEgYnVmZmVyIGZvciBvdXRwdXQgdGhlIHRpdGxlLiBDYW4gYmUgTlVMTC4KLy8gICAgICAgICAgYnVmbGVuICAgICAgLSAgIFRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciwgbnVtYmVyIG9mIGJ5dGVzLiBDYW4gYmUgMC4KLy8gUmV0dXJuIHZhbHVlOgovLyAgICAgICAgICBOdW1iZXIgb2YgYnl0ZXMgdGhlIHRpdGxlIGNvbnN1bWVzLCBpbmNsdWRpbmcgdHJhaWxpbmcgemVyb3MuCi8vIENvbW1lbnRzOgovLyAgICAgICAgICBObyBtYXR0ZXIgb24gd2hhdCBwbGF0Zm9ybSwgdGhlIHRpdGxlIGlzIGFsd2F5cyBvdXRwdXQgaW4gVVRGLTE2TEUKLy8gICAgICAgICAgZW5jb2RpbmcsIHdoaWNoIG1lYW5zIHRoZSBidWZmZXIKLy8gICAgICAgICAgY2FuIGJlIHJlZ2FyZGVkIGFzIGFuIGFycmF5IG9mIFdPUkQgKG9uIEludGVsIGFuZCBjb21wYXRpYmxlIENQVXMpLAovLyAgICAgICAgICBlYWNoIFdPUkQgcmVwcmVzZW50IHRoZSBVbmljb2RlIG9mCi8vICAgICAgICAgIGEgY2hhcmFjdGVyIChzb21lIHNwZWNpYWwgVW5pY29kZSBtYXkgdGFrZSAyIFdPUkRzKS4gVGhlIHN0cmluZyBpcwovLyAgICAgICAgICBmb2xsb3dlZCBieSB0d28gYnl0ZXMgb2YgemVybwovLyAgICAgICAgICBpbmRpY2F0aW5nIGVuZCBvZiB0aGUgc3RyaW5nLgovLwovLyAgICAgICAgICBUaGUgcmV0dXJuIHZhbHVlIGFsd2F5cyBpbmRpY2F0ZWQgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUKLy8gICAgICAgICAgYnVmZmVyLCBldmVuIHdoZW4gdGhlcmUgaXMKLy8gICAgICAgICAgbm8gYnVmZmVyIHNwZWNpZmllZCwgb3IgdGhlIGJ1ZmZlciBzaXplIGlzIGxlc3MgdGhlbiByZXF1aXJlZC4gSW4KLy8gICAgICAgICAgdGhpcyBjYXNlLCB0aGUgYnVmZmVyIHdpbGwgbm90Ci8vICAgICAgICAgIGJlIG1vZGlmaWVkLgovLwpETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMIEZQREZfR2V0TWV0YVRleHQoRlBERl9ET0NVTUVOVCBkb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcgdGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBidWZsZW4pOwoKI2lmZGVmIF9fY3BsdXNwbHVzCn0KI2VuZGlmCgojZW5kaWYgIC8vIFBVQkxJQ19GUERGX0RPQ19IXwo=