PGh0bWw+CjxoZWFkPgo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KPHRpdGxlPkJvb3N0LlRlc3QgZHJpdmVuIGRldmVsb3BtZW50IG9yICJnZXR0aW5nIHN0YXJ0ZWQiIGZvciBUREQgZm9sbG93ZXJzPC90aXRsZT4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9zdHlsZS9zdHlsZS5jc3MiIHR5cGU9InRleHQvY3NzIj4KPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJEb2NCb29rIFhTTCBTdHlsZXNoZWV0cyBWMS43NC4wIj4KPGxpbmsgcmVsPSJob21lIiBocmVmPSIuLi9pbmRleC5odG1sIiB0aXRsZT0iQm9vc3QgVGVzdCBMaWJyYXJ5Ij4KPGxpbmsgcmVsPSJ1cCIgaHJlZj0iLi4vdXRmL3R1dG9yaWFscy5odG1sIiB0aXRsZT0iVGhlIHVuaXQgdGVzdCBmcmFtZXdvcmsgdHV0b3JpYWxzIj4KPGxpbmsgcmVsPSJwcmV2IiBocmVmPSJoZWxsby10aGUtdGVzdGluZy13b3JsZC5odG1sIiB0aXRsZT0iSGVsbG8gdGhlIHRlc3Rpbmcgd29ybGQgb3IgYmVnaW5uZXIncyBpbnRyb2R1Y3Rpb24gaW50byB0ZXN0aW5nIHVzaW5nIHRoZSBVbml0IFRlc3QgRnJhbWV3b3JrIj4KPGxpbmsgcmVsPSJuZXh0IiBocmVmPSIuLi91dGYvY29tcGlsYXRpb24uaHRtbCIgdGl0bGU9IlRoZSBVVEYgY29tcGlsYXRpb24gdmFyaWFudHMgYW5kIHByb2NlZHVyZXMiPgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0MS4yIiBzcmM9Ii4uLy4uL2pzL2Jvb3N0LXRlc3QuanMiPjwvc2NyaXB0Pgo8L2hlYWQ+Cjxib2R5IGJnY29sb3I9IndoaXRlIiB0ZXh0PSJibGFjayIgbGluaz0iIzAwMDBGRiIgdmxpbms9IiM4NDAwODQiIGFsaW5rPSIjMDAwMEZGIj4KPHRhYmxlIHdpZHRoPSIxMDAlIj48dHI+Cjx0ZCB3aWR0aD0iMTAlIj48YSBocmVmPSIuLi9pbmRleC5odG1sIj48aW1nIGFsdD0iSG9tZSIgd2lkdGg9IjIyOSIgaGVpZ2h0PSI2MSIgYm9yZGVyPSIwIiBzcmM9Ii4uLy4uLy4uLy4uLy4uL2xpYnMvdGVzdC9kb2Nib29rL2ltZy9ib29zdC50ZXN0LmxvZ28ucG5nIj48L2E+PC90ZD4KPHRkIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0ibGVmdCI+ICZndDsgPGEgaHJlZj0iLi4vdXRmLmh0bWwiPlRoZSBVbml0IFRlc3QgRnJhbWV3b3JrPC9hPiAmZ3Q7IDxhIGhyZWY9Ii4uL3V0Zi90dXRvcmlhbHMuaHRtbCI+VHV0b3JpYWxzPC9hPjxhIGhyZWY9Ii4uL3V0Zi9jb21waWxhdGlvbi5odG1sIj4KICAgICAgJmd0OwogICAgICA8L2E+PGI+Qm9vc3QuVGVzdCBkcml2ZW4gZGV2ZWxvcG1lbnQ8L2I+CjwvdGQ+Cjx0ZD48ZGl2IGNsYXNzPSJzcGlyaXQtbmF2Ij4KPGEgaHJlZj0iaGVsbG8tdGhlLXRlc3Rpbmctd29ybGQuaHRtbCI+PGltZyBzcmM9Ii4uLy4uLy4uLy4uLy4uL2RvYy9odG1sL2ltYWdlcy9wcmV2LnBuZyIgYWx0PSJQcmV2Ij48L2E+PGEgaHJlZj0iLi4vdXRmL2NvbXBpbGF0aW9uLmh0bWwiPjxpbWcgc3JjPSIuLi8uLi8uLi8uLi8uLi9kb2MvaHRtbC9pbWFnZXMvbmV4dC5wbmciIGFsdD0iTmV4dCI+PC9hPgo8L2Rpdj48L3RkPgo8L3RyPjwvdGFibGU+Cjxocj4KPGRpdiBjbGFzcz0ic2VjdGlvbiIgbGFuZz0iZW4iPgo8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDQgY2xhc3M9InRpdGxlIj4KPGEgbmFtZT0idHV0b3JpYWwubmV3LXllYXItcmVzb2x1dGlvbiI+PC9hPkJvb3N0LlRlc3QgZHJpdmVuIGRldmVsb3BtZW50ICBvciAiZ2V0dGluZyBzdGFydGVkIiBmb3IgVEREIGZvbGxvd2VyczwvaDQ+PC9kaXY+PC9kaXY+PC9kaXY+CjxwIGNsYXNzPSJmaXJzdC1saW5lLWluZGVudGVkIj4KICBUb2RheSBpcyBhIG1vbWVudG91cyBkYXkgLSBmaXJzdCBkYXkgb2YgbmV3IHllYXIuIFRvZGF5IEkgYW0gZ29pbmcgdG8gc3RhcnQgYSBuZXcgbGlmZS4gSSBhbSBnb2luZyB0byBzdG9wIGVhdGluZyBhIAogIGdyZWFzeSBmb29kLCBzdGFydCBhdHRlbmRpbmcgYSBmaXRuZXNzIGNsdWIgYW5kICB0b2RheSBJIGFtIGdvaW5nIHRvIHRlc3QgcHJvZ3JhbXMgSSBhbSB3cml0aW5nLiBJIGNhbiBzdGFydCAKICByaWdodCBhZnRlciB0aGUgbGFzdCBsaW5lIG9mIGEgcHJvZ3JhbSBpcyBjb21wbGV0ZWQgb3IsIGV2ZW4gYmV0dGVyLCBJIGNhbiB3cml0ZSB0ZXN0cyB3aGlsZSBJIGFtIGNvZGluZy4gQW5kIG1heWJlIAogIG5leHQgdGltZSBJIHdpbGwgd3JpdGUgdGVzdHMgYmVmb3JlIHRoZSBjb2RpbmcsIGR1cmluZyB0aGUgZGVzaWduIHN0YWdlLiBJIGhhdmUgcmVhZCBhIGxvdCBvZiBsaXRlcmF0dXJlIG9uIGhvdyB0byAKICB3cml0ZSB0aGUgdGVzdHMsIEkgaGF2ZSB0aGUgdW5pdCB0ZXN0IGZyYW1ld29yayBpbiBoYW5kIGFuZCBhbiBpZGVhIG9mIG5ldyBjbGFzcy4gU28gbGV0J3MgZ2V0IHN0YXJ0ZWQuCiA8L3A+CjxwIGNsYXNzPSJmaXJzdC1saW5lLWluZGVudGVkIj4KICBMZXQgc2F5IEkgd2FudCB0byBlbmNhcHN1bGF0ZSBhbiB1bmNoYW5nZWFibGUgQyBjaGFyYWN0ZXIgYnVmZmVyIHdpdGggYSBsZW5ndGggaW50byB0aGUgc2ltcGxlIGNsYXNzIAogIDxjb2RlIGNsYXNzPSJjb21wdXRlcm91dHB1dCI+Y29uc3Rfc3RyaW5nPC9jb2RlPi4gUmF0aW9uYWxlOiBhIHN0cmluZyBjbGFzcyB0aGF0IGRvZXMgbm90IGFsbG9jYXRlIGEgbWVtb3J5IGFuZCBwcm92aWRlIGEgY29udmVuaWVudCAKICByZWFkLW9ubHkgYWNjZXNzIHRvIHRoZSBwcmVhbGxvY2F0ZWQgY2hhcmFjdGVyIGJ1ZmZlci4gSSB3aWxsIHByb2JhYmx5IHdhbnQgPGNvZGUgY2xhc3M9ImNvbXB1dGVyb3V0cHV0Ij5jb25zdF9zdHJpbmc8L2NvZGU+IHRvIGhhdmUgYW4gCiAgaW50ZXJmYWNlIHNpbWlsYXIgdG8gdGhlIGNsYXNzIHN0ZDo6c3RyaW5nLiBXaGF0IHdpbGwgSSBkbyBmaXJzdD8gSW4gbXkgbmV3IGxpZmUgSSB3aWxsIHN0YXJ0IHdpdGggd3JpdGluZyBhIHRlc3QgCiAgbW9kdWxlIGZvciBmdXR1cmUgY2xhc3MgPGNvZGUgY2xhc3M9ImNvbXB1dGVyb3V0cHV0Ij5jb25zdF9zdHJpbmc8L2NvZGU+LiBJdCB3aWxsIGxvb2sgbGlrZSB0aGlzOgogPC9wPgo8cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+I2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBjb25zdF9zdHJpbmcgdGVzdAojaW5jbHVkZSAmbHQ7Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwJmd0OwoKLy8gRU9GCjwvcHJlPgo8cCBjbGFzcz0iZmlyc3QtbGluZS1pbmRlbnRlZCI+CiAgTm93IEkgY2FuIGNvbXBpbGUgaXQgYW5kIGxpbmsgd2l0aCB0aGUgdW5pdCB0ZXN0IGZyYW1ld29yay4gRG9uZSEgSSBoYXZlIGEgd29ya2luZyB0ZXN0IHByb2dyYW0uIEl0IGlzIGVtcHR5LCBzbyAKICB3aGVuIEkgcnVuIHRoZSBwcm9ncmFtIGl0IHByb2R1Y2VzIGZvbGxvd2luZyBvdXRwdXQ6CiA8L3A+CjxwcmUgY2xhc3M9InNjcmVlbiI+KioqIE5vIGVycm9ycyBkZXRlY3RlZDwvcHJlPgo8cCBjbGFzcz0iZmlyc3QtbGluZS1pbmRlbnRlZCI+CiAgV2VsbCwgbm93IGl0IGNvdWxkIGJlIGEgZ29vZCB0aW1lIHRvIHN0YXJ0IGEgd29yayBvbiA8Y29kZSBjbGFzcz0iY29tcHV0ZXJvdXRwdXQiPmNvbnN0X3N0cmluZzwvY29kZT4uIEZpcnN0IHRoaW5nIEkgaW1hZ2luZSB3b3VsZCBiZSBnb29kIAogIHRvIGhhdmUgaXMgYSBjb25zdHJ1Y3RvcnMgYW5kIHRyaXZpYWwgYWNjZXNzIG1ldGhvZHMuIFNvIG15IGNsYXNzIGluaXRpYWwgdmVyc2lvbiBsb29rcyBsaWtlIHRoaXM6CiA8L3A+CjxwPmNvbnN0X3N0cmluZy5ocHA6PC9wPgo8cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+Y2xhc3MgY29uc3Rfc3RyaW5nIHsKcHVibGljOgogICAgLy8gQ29uc3RydWN0b3JzCiAgICBjb25zdF9zdHJpbmcoKTsKICAgIGNvbnN0X3N0cmluZyggc3RkOjpzdHJpbmcgY29uc3QmYW1wOyBzICkKICAgIGNvbnN0X3N0cmluZyggY2hhciBjb25zdCogcyApOwogICAgY29uc3Rfc3RyaW5nKCBjaGFyIGNvbnN0KiBzLCBzaXplX3QgbGVuZ3RoICk7CiAgICBjb25zdF9zdHJpbmcoIGNoYXIgY29uc3QqIGJlZ2luLCBjaGFyIGNvbnN0KiBlbmQgKTsKCiAgICAvLyBBY2Nlc3MgbWV0aG9kcwogICAgY2hhciBjb25zdCogZGF0YSgpIGNvbnN0OwogICAgc2l6ZV90ICAgICAgbGVuZ3RoKCkgY29uc3Q7CiAgICBib29sICAgICAgICBpc19lbXB0eSgpIGNvbnN0OwoKICAgIC4uLgp9Owo8L3ByZT4KPHAgY2xhc3M9ImZpcnN0LWxpbmUtaW5kZW50ZWQiPgogIE5vdyBJIGFtIGFibGUgdG8gd3JpdGUgYSBmaXJzdCB0ZXN0IGNhc2UgLSBjb25zdHJ1Y3RvcnMgdGVzdGluZyAtIGFuZCBhZGQgaXQgdG8gYSB0ZXN0IHN1aXRlLiBNeSB0ZXN0IHByb2dyYW0gYmVjYW1lIAogIHRvIGxvb2sgbGlrZSB0aGlzOgogPC9wPgo8cD5jb25zdF9zdHJpbmdfdGVzdC5jcHA6PC9wPgo8cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+I2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBjb25zdF9zdHJpbmcgdGVzdAojaW5jbHVkZSAmbHQ7Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwJmd0OwoKQk9PU1RfQVVUT19FU1RfQ0FTRSggY29uc3RydWN0b3JzX3Rlc3QgKQp7CiAgICAgY29uc3Rfc3RyaW5nIGNzMCggIiIgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMSAvLwogICAgIEJPT1NUX0NIRUNLX0VRVUFMKCBjczAubGVuZ3RoKCksIChzaXplX3QpMCApOwogICAgIEJPT1NUX0NIRUNLKCBjczAuaXNfZW1wdHkoKSApOwoKICAgICBjb25zdF9zdHJpbmcgY3MwMSggTlVMTCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyIC8vCiAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIGNzMDEubGVuZ3RoKCksIChzaXplX3QpMCApOwogICAgIEJPT1NUX0NIRUNLKCBjczAxLmlzX2VtcHR5KCkgKTsKCiAgICAgY29uc3Rfc3RyaW5nIGNzMSggInRlc3Rfc3RyaW5nIiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMyAvLwogICAgIEJPT1NUX0NIRUNLX0VRVUFMKCBzdGQ6OnN0cmNtcCggY3MxLmRhdGEoKSwgInRlc3Rfc3RyaW5nIiApLCAwICk7CiAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIGNzMS5sZW5ndGgoKSwgc3RkOjpzdHJsZW4oInRlc3Rfc3RyaW5nIikgKTsKCiAgICAgc3RkOjpzdHJpbmcgcyggInRlc3Rfc3RyaW5nIiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNCAvLwogICAgIGNvbnN0X3N0cmluZyBjczIoIHMgKTsKICAgICBCT09TVF9DSEVDS19FUVVBTCggc3RkOjpzdHJjbXAoIGNzMi5kYXRhKCksICJ0ZXN0X3N0cmluZyIgKSwgMCApOwoKICAgICBjb25zdF9zdHJpbmcgY3MzKCBjczEgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA1IC8vCiAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIHN0ZDo6c3RyY21wKCBjczEuZGF0YSgpLCAidGVzdF9zdHJpbmciICksIDAgKTsKCiAgICAgY29uc3Rfc3RyaW5nIGNzNCggInRlc3Rfc3RyaW5nIiwgNCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNiAvLwogICAgIEJPT1NUX0NIRUNLX0VRVUFMKCBzdGQ6OnN0cm5jbXAoIGNzNC5kYXRhKCksICJ0ZXN0IiwgY3M0Lmxlbmd0aCgpICksIDAgKTsKCiAgICAgY29uc3Rfc3RyaW5nIGNzNSggcy5kYXRhKCksIHMuZGF0YSgpICsgcy5sZW5ndGgoKSApOyAgICAgICAgICAgICAgICAgICAgLy8gNyAvLwogICAgIEJPT1NUX0NIRUNLX0VRVUFMKCBzdGQ6OnN0cm5jbXAoIGNzNS5kYXRhKCksICJ0ZXN0X3N0cmluZyIsIGNzNS5sZW5ndGgoKSApLCAwICk7CgogICAgIGNvbnN0X3N0cmluZyBjc19hcnJheVtdID0geyAic3RyMSIsICJzdHIyIiB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDggLy8KICAgICBCT09TVF9DSEVDS19FUVVBTCggY3NfYXJyYXlbMF0sICJzdHIxIiApOwogICAgIEJPT1NUX0NIRUNLX0VRVUFMKCBjc19hcnJheVsxXSwgInN0cjIiICk7Cn0KCi8vIEVPRgo8L3ByZT4KPHAgY2xhc3M9ImZpcnN0LWxpbmUtaW5kZW50ZWQiPgogIFRoZSBjb25zdHJ1Y3RvcnNfdGVzdCB0ZXN0IGNhc2UgaXMgaW50ZW5kZWQgdG8gY2hlY2sgYSBzaW1wbGUgZmVhdHVyZSBvZiB0aGUgY2xhc3MgPGNvZGUgY2xhc3M9ImNvbXB1dGVyb3V0cHV0Ij5jb25zdF9zdHJpbmc8L2NvZGU+OiBhbiAKICBhYmlsaXR5IHRvIGNvbnN0cnVjdCBpdHNlbGYgcHJvcGVybHkgYmFzZWQgb24gZGlmZmVyZW50IGFyZ3VtZW50cy4gVG8gdGVzdCB0aGlzIGZlYXR1cmUgSSBhbSB1c2luZyBzdWNoIAogIGNoYXJhY3RlcmlzdGljcyBvZiBjb25zdHJ1Y3RlZCBvYmplY3QgYXMgYSBkYXRhIGl0IGNvbnRhaW5zIGFuZCBhIGxlbmd0aC4gVGhlIHNwZWNpZmljYXRpb24gb2YgdGhlIGNsYXNzIAogIDxjb2RlIGNsYXNzPSJjb21wdXRlcm91dHB1dCI+Y29uc3Rfc3RyaW5nPC9jb2RlPiBkb2VzIG5vdCBjb250YWluIGFueSBleHBlY3RlZCBmYWlsdXJlcywgc28sIHRob3VnaCB0aGUgY29uc3RydWN0b3IgY2FuIGZhaWwgaWYgSSB3b3VsZCAKICBwYXNzIGEgIHBvaW50ZXIgdG8gYW4gaW52YWxpZCBtZW1vcnksIGVycm9yIGNoZWNrIGNvbnRyb2wgaXMgbm90IHBlcmZvcm1lZCAoY2FuJ3QgcmVxdWlyZSB3aGF0IHdhcyBub3QgcHJvbWlzZWQgCiAgOi0pKS4gQnV0IGZvciBhbnkgdmFsaWQgaW5wdXQgaXQgc2hvdWxkIHdvcmsuIFNvIEkgYW0gdHJ5aW5nIHRvIGNoZWNrIGEgY29uc3RydWN0aW9uIGZvciBhbiBlbXB0eSBzdHJpbmcgKDEpLCBhIE5VTEwgCiAgc3RyaW5nICgyKSBhIHJlZ3VsYXIgQyBzdHJpbmcoMyksIGFuIFNUTCBzdHJpbmcoNCksIGEgY29weSBjb25zdHJ1Y3Rpb24oNSkgYW5kIHNvIG9uLiBXZWxsLCBhZnRlciBmaXhpbmcgYWxsIHRoZSAKICBlcnJvcnMgaW4gdGhlIGltcGxlbWVudGF0aW9uIChkbyB5b3Ugd3JpdGUgcHJvZ3JhbXMgd2l0aG91dCBlcnJvcnMgZnJvbSBzY3JhdGNoPykgSSBhbSBhYmxlIHRvIHBhc3MgdGhpcyB0ZXN0IGNhc2UgCiAgYW5kIHRoZSB1bml0IHRlc3QgZnJhbWV3b3JrIGdpdmVzIG1lIHRoZSBmb2xsb3dpbmcgcmVwb3J0OgogPC9wPgo8cHJlIGNsYXNzPSJzY3JlZW4iPlJ1bm5pbmcgMSB0ZXN0IGNhc2UgCiAgCioqKiBObyBlcnJvcnMgZGV0ZWN0ZWQ8L3ByZT4KPHAgY2xhc3M9ImZpcnN0LWxpbmUtaW5kZW50ZWQiPgogIEVuY291cmFnZWQgSSBhbSBtb3Zpbmcgb24gYW5kIGFkZGluZyBtb3JlIGFjY2VzcyBtZXRob2RzOgogPC9wPgo8cD5jb25zdF9zdHJpbmcuaHBwOjwvcD4KPHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPmNsYXNzIGNvbnN0X3N0cmluZyB7CnB1YmxpYzoKICAgIC4uLgogICAgY2hhciBvcGVyYXRvcltdKCBzaXplX3QgaW5kZXggKSBjb25zdDsKICAgIGNoYXIgYXQoIHNpemVfdCBpbmRleCApIGNvbnN0OwogICAgLi4uCn07CjwvcHJlPgo8cCBjbGFzcz0iZmlyc3QtbGluZS1pbmRlbnRlZCI+CiAgSSBhZGRlZCB0aGUgbmV3IGZlYXR1cmUgLSBJIG5lZWQgYSBuZXcgdGVzdCBjYXNlIHRvIGNoZWNrIGl0LiBBcyBhIHJlc3VsdCBteSB0ZXN0IHN1aXRlIGJlY2FtZSB0byBsb29rIGxpa2UgdGhpczoKIDwvcD4KPHA+Y29uc3Rfc3RyaW5nX3Rlc3QuY3BwOjwvcD4KPHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPiNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgY29uc3Rfc3RyaW5nIHRlc3QKI2luY2x1ZGUgJmx0O2Jvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcCZndDsKCkJPT1NUX0FVVE9fRVNUX0NBU0UoIGNvbnN0cnVjdG9yc190ZXN0ICkKewogICAgLi4uCn0KCkJPT1NUX0FVVE9fRVNUX0NBU0UoIGRhdGFfYWNjZXNzX3Rlc3QgKQp7CiAgICBjb25zdF9zdHJpbmcgY3MxKCAidGVzdF9zdHJpbmciICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMSAvLwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIGNzMVsoc2l6ZV90KTBdLCAndCcgKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCBjczFbKHNpemVfdCk0XSwgJ18nICk7CiAgICBCT09TVF9DSEVDS19FUVVBTCggY3MxW2NzMS5sZW5ndGgoKS0xXSwgJ2cnICk7CgogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIGNzMVsoc2l6ZV90KTBdLCBjczEuYXQoIDAgKSApOyAgICAgICAgICAgICAgICAgIC8vIDIgLy8KICAgIEJPT1NUX0NIRUNLX0VRVUFMKCBjczFbKHNpemVfdCkyXSwgY3MxLmF0KCA1ICkgKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCBjczEuYXQoIGNzMS5sZW5ndGgoKSAtIDEgKSwgJ2cnICk7CgogICAgQk9PU1RfQ0hFQ0tfVEhST1coIGNzMS5hdCggY3MxLmxlbmd0aCgpICksIHN0ZDo6b3V0X29mX3JhbmdlICk7ICAgIC8vIDMgLy8KfQoKLy8gRU9GCjwvcHJlPgo8cCBjbGFzcz0iZmlyc3QtbGluZS1pbmRlbnRlZCI+CiAgSW4gdGhlIGRhdGFfYWNjZXNzX3Rlc3QgdGVzdCBjYXNlIEkgYW0gdHJ5aW5nIHRvIGNoZWNrIHRoZSBjbGFzcyA8Y29kZSBjbGFzcz0iY29tcHV0ZXJvdXRwdXQiPmNvbnN0X3N0cmluZzwvY29kZT4gY2hhcmFjdGVyIGFjY2VzcyAKICBjb3JyZWN0bmVzcy4gV2hpbGUgdGVzdHMgKDEpIGNoZWNrcyB2YWxpZCBhY2Nlc3MgdXNpbmcgPGNvZGUgY2xhc3M9ImNvbXB1dGVyb3V0cHV0Ij5jb25zdF9zdHJpbmc8L2NvZGU+OjpvcGVyYXRvcltdIGFuZCB0ZXN0ICgyKSBjaGVja3MgCiAgdmFsaWQgYWNjZXNzIHVzaW5nIG1ldGhvZCA8Y29kZSBjbGFzcz0iY29tcHV0ZXJvdXRwdXQiPmNvbnN0X3N0cmluZzwvY29kZT46OmF0KCksIHRoZXJlIGlzIG9uZSBtb3JlIHRoaW5nIHRvIHRlc3QuIFRoZSBzcGVjaWZpY2F0aW9uIG9mIHRoZSAKICBtZXRob2QgPGNvZGUgY2xhc3M9ImNvbXB1dGVyb3V0cHV0Ij5jb25zdF9zdHJpbmc8L2NvZGU+OjphdCgpIGNvbnRhaW5zIHZhbGlkYXRpb24gZm9yIHRoZSBvdXQgb2YgYm91bmQgYWNjZXNzLiBUaGF0IHdhcyB0ZXN0ICgzKSBpcyAKICBpbnRlbmRlZCB0byBkbzogY2hlY2sgdGhhdCB0aGUgdmFsaWRhdGlvbiBpcyB3b3JraW5nLiBBIHRlc3Rpbmcgb2YgYSB2YWxpZGF0aW9uIGFuZCBlcnJvciBoYW5kbGluZyBjb2RlIGlzIGFuIAogIGltcG9ydGFudCBwYXJ0IG9mIGEgdW5pdCB0ZXN0aW5nIGFuZCBzaG91bGQgbm90IGJlIGxlZnQgZm9yIGEgcHJvZHVjdGlvbiBzdGFnZS4gVGhlIGRhdGFfYWNjZXNzX3Rlc3QgdGVzdCBjYXNlIAogIHBhc3NlZCBhbmQgSSBhbSByZWFkeSBmb3IgdGhlIG5leHQgc3RlcC4KIDwvcD4KPHAgY2xhc3M9ImZpcnN0LWxpbmUtaW5kZW50ZWQiPgogIENvbnRpbnVpbmcgbXkgZWZmb3J0IEkgYW0gYWJsZSB0byBjb21wbGV0ZSBjbGFzcyA8Y29kZSBjbGFzcz0iY29tcHV0ZXJvdXRwdXQiPmNvbnN0X3N0cmluZzwvY29kZT4gKHNlZSAKICA8YSBocmVmPSIuLi8uLi9zcmMvc25pcHBldC9jb25zdF9zdHJpbmcuaHBwIiB0YXJnZXQ9Il90b3AiPkxpc3RpbmcgMTwvYT4pIGFuZCB0ZXN0aW5nIG1vZHVsZSBmb3IgaXQgKHNlZSAKICA8YSBocmVmPSIuLi8uLi9zcmMvc25pcHBldC9jb25zdF9zdHJpbmdfdGVzdC5jcHAiIHRhcmdldD0iX3RvcCI+TGlzdGluZyAyPC9hPikgdGhhdCBpcyBjaGVja2luZyBhbGwgZmVhdHVyZXMgdGhhdCBhcmUgcHJlc2VudGVkIAogIGluIHRoZSBjbGFzcyA8Y29kZSBjbGFzcz0iY29tcHV0ZXJvdXRwdXQiPmNvbnN0X3N0cmluZzwvY29kZT4gc3BlY2lmaWNhdGlvbi4KIDwvcD4KPHAgY2xhc3M9ImZpcnN0LWxpbmUtaW5kZW50ZWQiPgogIFdlbGwsIEkgYW0gc3RlcCBjbG9zZXIgdG8gZnVsZmlsbGluZyBteSBuZXcgeWVhciByZXNvbHV0aW9uICh3ZSBzaG91bGQgc2VlIGFib3V0IHRoaXMgZml0bmVzcyBjbHViIHNvbWV0aW1lIG5leHQKICApLiBXaGF0IGFib3V0IHlvdT8gWW91ciB0ZXN0aW5nIGhhYml0cyBjb3VsZCBiZSBhIGxpdHRsZSBkaWZmZXJlbnQuIFlvdSBjb3VsZCBzdGFydCB3aXRoIGEgY2xhc3MvbGlicmFyeSAKICBkZXZlbG9wbWVudCBhbmQgdGhlbiBhdCBzb21lIHBvaW50IHN0YXJ0IHdyaXRpbmcgdGVzdCBjYXNlcyBvbiBmZWF0dXJlIGJhc2lzLiBPciB5b3UgY2FuLCBnaXZlbiBhIGRldGFpbGVkIAogIHNwZWNpZmljYXRpb24gZm9yIHRoZSBmdXR1cmUgcHJvZHVjdCwgaW5jbHVkaW5nIGV4cGVjdGVkIGludGVyZmFjZXMsIGltbWVkaWF0ZWx5IHN0YXJ0IHdpdGggd3JpdGluZyBhbGwgdGVzdCBjYXNlcyAKICAob3IgaXQgY291bGQgYmUgYSBkaWZmZXJlbnQgcGVyc29uLCB3aGlsZSB5b3Ugd29ya2luZyBvbiBpbXBsZW1lbnRhdGlvbiBhdCB0aGUgc2FtZSB0aW1lKS4gSW4gYW55IGNhc2UgeW91IHNob3VsZCBub3QgCiAgaGF2ZSBhbnkgcHJvYmxlbXMgdG8gdXNlIGZhY2lsaXRpZXMgcHJvdmlkZWQgYnkgdGhlIEJvb3N0LlRlc3QgdW5pdCB0ZXN0IGZyYW1ld29yayBhbmQsIGxldCBtZSBob3BlLCBiZSBhYmxlIHRvIAogIHdyaXRlIGEgc3RhYmxlLCBidWxsZXRwcm9vZiBjb2RlLiBBbmQgd2hhdCBpcyBldmVuIG1vcmUgaW1wb3J0YW50IGlzIHlvdXIgY29uZmlkZW5jZSBpbiBhbiBhYmlsaXR5IHRvIG1ha2UgY2hhbmdlcyAKICBvZiBhbnkgY29tcGxleGl0eSB3aXRob3V0IGludm9sdmluZyBhIGxlbmd0aHkgcmVncmVzc2lvbiB0ZXN0aW5nIG9mIHlvdXIgd2hvbGUgcHJvZHVjdC4gWW91ciB0ZXN0IG1vZHVsZSBhbmQgdGhlIAogIHVuaXQgdGVzdCBmcmFtZXdvcmsgd2lsbCBzdGF5IGJlaGluZCB5b3VyIGJhY2sgdG8gaGVscCB5b3Ugd2l0aCBhbnkgb2NjYXNpb25hbCBlcnJvcnMuCiA8L3A+CjwvZGl2Pgo8dGFibGUgeG1sbnM6cmV2PSJodHRwOi8vd3d3LmNzLnJwaS5lZHUvfmdyZWdvZC9ib29zdC90b29scy9kb2MvcmV2aXNpb24iIHdpZHRoPSIxMDAlIj48dHI+Cjx0ZCBhbGlnbj0ibGVmdCI+PC90ZD4KPHRkIGFsaWduPSJyaWdodCI+PGRpdiBjbGFzcz0iY29weXJpZ2h0LWZvb3RlciI+Q29weXJpZ2h0IKkgMjAwMS0yMDA3IEdlbm5hZGl5IFJvemVudGFsPC9kaXY+PC90ZD4KPC90cj48L3RhYmxlPgo8aHI+CjxkaXYgY2xhc3M9InNwaXJpdC1uYXYiPgo8YSBhY2Nlc3NrZXk9InAiIGhyZWY9ImhlbGxvLXRoZS10ZXN0aW5nLXdvcmxkLmh0bWwiPjxpbWcgc3JjPSIuLi8uLi8uLi8uLi8uLi9kb2MvaHRtbC9pbWFnZXMvcHJldi5wbmciIGFsdD0iUHJldiI+PC9hPjxhIGFjY2Vzc2tleT0idSIgaHJlZj0iLi4vdXRmL3R1dG9yaWFscy5odG1sIj48aW1nIHNyYz0iLi4vLi4vLi4vLi4vLi4vZG9jL2h0bWwvaW1hZ2VzL3VwLnBuZyIgYWx0PSJVcCI+PC9hPjxhIGFjY2Vzc2tleT0iaCIgaHJlZj0iLi4vaW5kZXguaHRtbCI+PGltZyBzcmM9Ii4uLy4uLy4uLy4uLy4uL2RvYy9odG1sL2ltYWdlcy9ob21lLnBuZyIgYWx0PSJIb21lIj48L2E+PGEgYWNjZXNza2V5PSJuIiBocmVmPSIuLi91dGYvY29tcGlsYXRpb24uaHRtbCI+PGltZyBzcmM9Ii4uLy4uLy4uLy4uLy4uL2RvYy9odG1sL2ltYWdlcy9uZXh0LnBuZyIgYWx0PSJOZXh0Ij48L2E+CjwvZGl2Pgo8L2JvZHk+CjwvaHRtbD4K